2 using System.Windows;
\r
3 using System.Windows.Controls;
\r
4 using System.Windows.Documents;
\r
5 using System.Windows.Input;
\r
6 using System.Windows.Media;
\r
7 using System.Windows.Media.Animation;
\r
8 using System.Windows.Media.Imaging;
\r
9 using System.Windows.Shapes;
\r
13 namespace Psychlops{
\r
15 public interface Shape : Internal.PrimitiveFigure
\r
17 Color fill { get; set; }
\r
18 Stroke stroke { get; set; }
\r
20 public static class ShapeExtention
\r
22 public static void draw(this Shape drawee, double c)
\r
24 drawee.draw( new Color(c) );
\r
26 public static void draw(this Shape drawee, Color c)
\r
28 Color tmp_col = drawee.fill;
\r
29 Stroke tmp_strk = drawee.stroke;
\r
31 drawee.stroke = new Stroke();
\r
33 drawee.fill = tmp_col;
\r
34 drawee.stroke = tmp_strk;
\r
36 public static void draw(this Shape drawee, Stroke strk)
\r
38 Color tmp_col = drawee.fill;
\r
39 Stroke tmp_strk = drawee.stroke;
\r
40 drawee.fill = new Color(0,0,1,1);
\r
41 drawee.stroke = strk;
\r
43 drawee.fill = tmp_col;
\r
44 drawee.stroke = tmp_strk;
\r
48 public partial struct Stroke
\r
50 public double thick;
\r
52 public Stroke(Color c, double t)
\r
57 public void set(Color c, double t)
\r
64 public partial class Line : Shape
\r
66 public Point begin, end;
\r
69 get { return begin; }
\r
70 set { begin = value; }
\r
73 //public static Line[] this[int x] { get { return Array(x); } }
\r
74 //public static Line[,] this[int x, int y] { get { return Array(x, y); } }
\r
75 public static Line[] Array(int ind)
\r
77 Line[] l = new Line[ind];
\r
78 for(int i=0; i<ind; i++) { l[i] = new Line(); }
\r
81 public static Line[,] Array(int indx, int indy)
\r
83 Line[,] l = new Line[indx, indy];
\r
84 for (int i = 0; i < indx; i++) { for (int j = 0; j < indy; j++) { l[i, j] = new Line(); } }
\r
93 public Line(double x1, double y1, double x2, double y2)
\r
95 set(x1, y1, x2, y2);
\r
97 public Line(Point v1, Point v2)
\r
101 public Line set(double x1, double y1, double x2, double y2)
\r
107 public Line set(Point v1, Point v2)
\r
114 public Figure shift(Point p)
\r
120 public Figure centering(Point p)
\r
122 double h = width, v = height;
\r
123 begin.x = p.x - h / 2.0;
\r
124 begin.y = p.y - v / 2.0;
\r
125 end.x = begin.x + h;
\r
126 end.y = begin.y + v;
\r
130 public virtual void draw()
\r
132 Main.drawable.line(this);
\r
135 public double left { get { return begin.x < end.x ? begin.x : end.x; } }
\r
136 public double top { get { return begin.y < end.y ? begin.y : end.y; ; } }
\r
137 public double right { get { return begin.x > end.x ? begin.x : end.x; ; } }
\r
138 public double bottom { get { return begin.y > end.y ? begin.y : end.y; ; } }
\r
139 public double width { get { return Math.abs(begin.x - end.x); } }
\r
140 public double height { get { return Math.abs(begin.y - end.y); } }
\r
141 public double getLeft() { return left; }
\r
142 public double getTop() { return top; }
\r
143 public double getRight() { return right; }
\r
144 public double getBottom() { return bottom; }
\r
145 public double getWidth() { return width; }
\r
146 public double getHeight() { return height; }
\r
148 public Color fill { get; set; }
\r
149 public Stroke stroke { get; set; }
\r
153 public partial class Rectangle : Shape
\r
155 public Point v1, v2;
\r
157 //public static Rectangle[] this[int x] { get { return Array(x); } }
\r
158 //public static Rectangle[,] this[int x, int y] { get { return Array(x, y); } }
\r
159 public static Rectangle[] Array(int ind)
\r
161 Rectangle[] l = new Rectangle[ind];
\r
162 for (int i = 0; i < ind; i++) { l[i] = new Rectangle(); }
\r
165 public static Rectangle[,] Array(int indx, int indy)
\r
167 Rectangle[,] l = new Rectangle[indx, indy];
\r
168 for (int i = 0; i < indx; i++) { for (int j = 0; j < indy; j++) { l[i, j] = new Rectangle(); } }
\r
177 public Rectangle(double wid, double hei)
\r
181 public Rectangle(Rectangle another)
\r
186 public Rectangle set(double wid, double hei)
\r
189 v2.set(wid, hei, 0);
\r
192 Rectangle set(Point po1, Point po2) {
\r
197 public Rectangle set(double l, double t, double r, double b)
\r
203 public Rectangle set(Rectangle another)
\r
210 public Rectangle resize(double width, double height)
\r
213 set(width, height);
\r
222 set { double w = width, h = height; v1 = value; v2 = v1 + new Point(w,h); }
\r
224 public Rectangle move_to(Point p) { datum = p; return this; }
\r
225 public Rectangle move_to(double x, double y, double z = 0.0) { datum = new Point(x, y, z); return this; }
\r
226 public Rectangle locate(Point p) { datum = p; return this; }
\r
227 public Rectangle locate(double x, double y, double z = 0.0) { datum = new Point(x, y, z); return this; }
\r
229 public Figure shift(Point p)
\r
235 public Figure centering(Point p)
\r
237 double h = width, v = height;
\r
238 v1.x = p.x - h / 2.0;
\r
239 v1.y = p.y - v / 2.0;
\r
245 public virtual void draw()
\r
247 Main.drawable.rect(this);
\r
249 public bool include(double x, double y)
\r
251 return (top <= y) && (left <= x) && (bottom >= y) && (right >= x);
\r
253 public bool include(Point p)
\r
255 return (top <= p.y) && (left <= p.x) && (bottom >= p.y) && (right >= p.x);
\r
257 public bool include(Rectangle rect)
\r
259 return (top <= rect.top) && (left <= rect.left) && (bottom >= rect.bottom) && (right >= rect.right);
\r
262 public Rectangle alignLeft(double lef)
\r
264 return move_to(lef, getTop(), datum.z);
\r
266 public Rectangle alignTop(double to_)
\r
268 return move_to(getLeft(), to_, datum.z);
\r
270 public Rectangle alignRight(double rig)
\r
272 return move_to(rig - getWidth(), getTop(), datum.z);
\r
274 public Rectangle alignBottom(double bot)
\r
276 return move_to(getLeft(), bot - getHeight(), datum.z);
\r
279 public void clipped_by(Rectangle source)
\r
281 double t = top, l = left, b = bottom, r = right;
\r
282 if (top < source.top) { t = source.top; }
\r
283 if (left < source.left) { l = source.left; }
\r
284 if (bottom > source.bottom) { b = source.bottom; }
\r
285 if (right > source.right) { r = source.right; }
\r
288 public void clip(Rectangle target)
\r
290 double t = top, l = left, b = bottom, r = right;
\r
291 if (top < target.top) { t = target.top; }
\r
292 if (left < target.left) { l = target.left; }
\r
293 if (bottom > target.bottom) { b = target.bottom; }
\r
294 if (right > target.right) { r = target.right; }
\r
299 public double left { get { return v1.x; } }
\r
300 public double top { get { return v1.y; } }
\r
301 public double right { get { return v2.x; } }
\r
302 public double bottom { get { return v2.y; } }
\r
303 public double width { get { return Math.abs(v1.x - v2.x); } }
\r
304 public double height { get { return Math.abs(v1.y - v2.y); } }
\r
305 public Point center {
\r
306 get { return new Point((left + right) / 2, (top + bottom) / 2); }
\r
307 set { centering(value); }
\r
309 public double getLeft() { return left; }
\r
310 public double getTop() { return top; }
\r
311 public double getRight() { return right; }
\r
312 public double getBottom() { return bottom; }
\r
313 public double getWidth() { return width; }
\r
314 public double getHeight() { return height; }
\r
315 public Point getCenter() { return center; }
\r
319 public Color fill { get; set; }
\r
320 public Stroke stroke { get; set; }
\r
322 public override string ToString()
\r
324 return "Left:" + left.ToString() + " Top:" + top.ToString() + " Right:" + right.ToString() + " Bottom:" + bottom.ToString();
\r
329 public partial class Ellipse : Shape
\r
331 public Point datum { get; set; }
\r
332 public double xdiameter, ydiameter;
\r
334 //public static Ellipse[] this[int x] { get { return Array(x); } }
\r
335 //public static Ellipse[,] this[int x, int y] { get { return Array(x, y); } }
\r
336 public static Ellipse[] Array(int ind)
\r
338 Ellipse[] l = new Ellipse[ind];
\r
339 for (int i = 0; i < ind; i++) { l[i] = new Ellipse(); }
\r
342 public static Ellipse[,] Array(int indx, int indy)
\r
344 Ellipse[,] l = new Ellipse[indx, indy];
\r
345 for (int i = 0; i < indx; i++) { for (int j = 0; j < indy; j++) { l[i, j] = new Ellipse(); } }
\r
353 public Ellipse(double wid, double hei)
\r
358 public Ellipse set(double wid, double hei)
\r
364 public Ellipse resize(double width, double height)
\r
367 set(width, height);
\r
371 public Figure shift(Point p)
\r
376 public Figure centering(Point p)
\r
382 public virtual void draw()
\r
384 Main.drawable.ellipse(this);
\r
387 public double left { get { return datum.x - xdiameter/2.0; } }
\r
388 public double top { get { return datum.y - ydiameter / 2.0; } }
\r
389 public double right { get { return datum.x + xdiameter / 2.0; } }
\r
390 public double bottom { get { return datum.y + ydiameter / 2.0; } }
\r
391 public double width { get { return Math.abs(xdiameter); } }
\r
392 public double height { get { return Math.abs(ydiameter); } }
\r
393 public Point center
\r
395 get { return new Point((left + right) / 2, (top + bottom) / 2); }
\r
396 set { centering(value); }
\r
398 public double getLeft() { return left; }
\r
399 public double getTop() { return top; }
\r
400 public double getRight() { return right; }
\r
401 public double getBottom() { return bottom; }
\r
402 public double getWidth() { return width; }
\r
403 public double getHeight() { return height; }
\r
404 public Point getCenter() { return center; }
\r
406 public Color fill { get; set; }
\r
407 public Stroke stroke { get; set; }
\r
411 public partial class Polygon : Shape
\r
413 public Point datum { get; set; }
\r
414 public System.Collections.Generic.List<Point> vertices;
\r
418 vertices = new System.Collections.Generic.List<Point>();
\r
420 public Polygon(double[] verts)
\r
422 vertices = new System.Collections.Generic.List<Point>();
\r
423 for (int i=0; i < verts.Length; i+=2)
\r
425 vertices.Add(new Point(verts[i], verts[i+1]));
\r
429 public Polygon(Point[] verts)
\r
431 vertices = new System.Collections.Generic.List<Point>();
\r
432 foreach (Point p in verts)
\r
438 public Polygon append(Point p) { vertices.Add(p); return this; }
\r
439 public Polygon append(double x, double y) { return append(new Point(x, y, 0.0)); }
\r
440 public Polygon append(double x, double y, double z) { return append(new Point(x, y, z)); }
\r
443 public Figure shift(Point p)
\r
448 public Figure centering(Point p)
\r
454 public virtual void draw()
\r
456 Main.drawable.polygon(this);
\r
459 public Color fill { get; set; }
\r
460 public Stroke stroke { get; set; }
\r