Подскажите пожалуйста, как происходит заливка области - C#
Формулировка задачи:
Здравствуйте.
Помогите пожалуйста разобраться в программе. В принципе все понял, удалил все не нужные функции, но не могу понять вот что: как и в какой части кода происходит собственно заливка области соответствующей формуле? И её анализ. Программу прикрепляю к сообщению.
Заранее огромное человеческое спасибо.
Решение задачи: «Подскажите пожалуйста, как происходит заливка области»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Venn
{
public partial class Window1 : Window
{
private GeometryVennParser vp;
public Window1()
{
InitializeComponent();
textBox1.Focus();
vp = new Geometries.GeometryC();
ShowOutlinesAndLabels();
Application.Current.MainWindow = this;
}
private void ShowOutlinesAndLabels()
{
// remove all labels
canvas1.Children.RemoveRange(3, canvas1.Children.Count - 3);
// create all labels as appropriate
GeometryGroup gg = new GeometryGroup();
for (char s = 'A'; s <= vp.MaxSet; s++)
{
gg.Children.Add(vp.Set(s));
TextBlock lbl = new TextBlock();
lbl.Text = s.ToString();
lbl.Margin = new Thickness(vp.LabelLocation(s).X, vp.LabelLocation(s).Y, 0, 0);
canvas1.Children.Add(lbl);
}
OutlinePath.Data = gg;
}
private string ToLogic(string toParse)
{
VennParser<string> vp = new VennParser<string>();
vp.Complement = (x =>
{
return "~" + x; // don't need parens because both other ops have them
});
vp.Intersect = ((x, y) =>
{
return "(" + x + " ^ " + y + ")";
});
vp.Union = ((x, y) =>
{
return "(" + x + " v " + y + ")";
});
vp.EmptySet = (() =>
{
return "false";
});
vp.Universe = (() =>
{
return "true";
});
vp.Set = (x => { return x.ToString(); });
vp.MaxSet = 'Z';
string result = Codehaus.Parsec.Parsers.RunParser(toParse, vp.Parser, "Truth Statement");
return result;
}
private void truthTable_SizeChanged(object sender, SizeChangedEventArgs e)
{
}
private void button1_Click(object sender, RoutedEventArgs e)
{
string toParse = textBox1.Text;
toParse = toParse.Replace('∩', '&');
toParse = toParse.Replace('в€Є', '|');
toParse = toParse.Replace('в€…', '0');
try
{
if (String.IsNullOrEmpty(toParse))
throw new Exception("");
Geometry result = Codehaus.Parsec.Parsers.RunParser(toParse, vp.Parser, "Неверный ввод");
FillPath.Data = result;
lblError.Text = "";
}
catch (Exception ex)
{
FillPath.Data = null;
lblError.Text = ex.Message;
}
textBox1.Focus();
}
private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
double widScale = rBorder.ActualWidth / 201.0;
double heiScale = rBorder.ActualHeight / 191.0;
double scale = Math.Min(widScale, heiScale);
double mleft = (rBorder.ActualWidth - scale * 201.0) / 2.0;
double mtop = (rBorder.ActualHeight - scale * 191.0) / 2.0;
canvas1.RenderTransform = new ScaleTransform(scale, scale);
canvas1.Margin = new Thickness(Math.Max(0, mleft), Math.Max(0, mtop), 0, 0);
}
private void Sets_Click(object sender, RoutedEventArgs e)
{
textBox1.Focus();
if (sender == SetsA)
vp = new Geometries.GeometryA();
if (sender == SetsB)
vp = new Geometries.GeometryB();
if (sender == SetsC)
vp = new Geometries.GeometryC();
if (sender == SetsD)
vp = new Geometries.GeometryD();
ShowOutlinesAndLabels();
button1_Click(sender, e);
}
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
int cp = textBox1.SelectionStart;
int cl = textBox1.SelectionLength;
string nt = textBox1.Text;
nt = nt.Replace('^', '∩');
nt = nt.Replace('6', '∩');
nt = nt.Replace('&', '∩');
nt = nt.Replace('7', '∩');
nt = nt.Replace('*', '∩');
nt = nt.Replace('8', '∩');
nt = nt.Replace('i', '∩');
nt = nt.Replace('I', '∩');
nt = nt.Replace('|', 'в€Є');
nt = nt.Replace('v', 'в€Є');
nt = nt.Replace('+', 'в€Є');
nt = nt.Replace('u', 'в€Є');
nt = nt.Replace('~', '\'');
nt = nt.Replace('0', 'в€…');
nt = nt.Replace('1', 'U');
nt = nt.ToUpper();
if (nt != textBox1.Text)
{
textBox1.Text = nt;
textBox1.SelectionStart = cp;
textBox1.SelectionLength = cl;
}
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
FillPath.Data = null;
lblError.Text = "";
textBox1.Clear();
textBox1.Focus();
}
private void btnSwap_Click(object sender, RoutedEventArgs e)
{
}
private void canvas1_MouseClick(object sender, MouseButtonEventArgs e)
{
System.Windows.Point i = e.GetPosition(canvas1);
textBox1.Text = VisualizeVenn(i);
button1_Click(null, null);
}
private void canvas1_MouseMove(object sender, MouseEventArgs e)
{
}
private String VisualizeVenn(Point i)
{
String oldStatement = textBox1.Text;
String newStatement = "";
Geometry fillgeo = vp.EmptySet();
if (FillPath.Data != null)
fillgeo = FillPath.Data;
bool isfilled = fillgeo.FillContains(i);
List<Geometry> geometries = new List<Geometry>();
for (char s = 'A'; s <= vp.MaxSet; s++)
geometries.Add(vp.Set(s));
List<char> hits = new List<char>();
char m = 'A';
foreach (Geometry n in geometries)
{
if (n.FillContains(i))
hits.Add(m);
m++;
}
if (!isfilled)
{
if (oldStatement != "")
oldStatement += "в€Є";
}
else
oldStatement += "∩";
newStatement += "(";
for (char s = 'A'; s <= vp.MaxSet; s++)
{
if (hits.Contains(s))
if (newStatement == "(")
newStatement += s.ToString();
else
newStatement += ('∩' + s.ToString());
else
if (newStatement == "(")
newStatement += (s.ToString() + "'");
else
newStatement += ('∩' + s.ToString() + "'");
}
newStatement += ")";
if (isfilled)
newStatement += "'";
return oldStatement + newStatement;
}
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Application.Current.Shutdown();
}
private void GenerateImage(Action<BitmapSource> WhatToDoWithIt)
{
}
private void btnCopy_Click(object sender, RoutedEventArgs e)
{
GenerateImage(bmp =>
{
Clipboard.SetImage(bmp);
});
}
private void btnSave_Click(object sender, RoutedEventArgs e)
{
GenerateImage(bmp =>
{
Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog();
sfd.DefaultExt = ".png";
sfd.Filter = "PNG Image (.png)|*.png";
bool? save = sfd.ShowDialog();
if (save == true)
{
PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(bmp));
using (System.IO.Stream str = sfd.OpenFile())
{
png.Save(str);
}
}
});
}
private void btnKey_Click(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
int cidx = textBox1.CaretIndex;
textBox1.Text = textBox1.Text.Insert(cidx, b.Content.ToString());
textBox1.CaretIndex = cidx + 1;
textBox1.Focus();
}
}
}