OSDN Git Service

132132
[psychlops/silverlight.git] / dev4 / psychlops / core / graphic / shape.cs
1 using System;\r
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
10 \r
11 \r
12 \r
13 namespace Psychlops{\r
14 \r
15         public interface Shape : Internal.PrimitiveFigure\r
16         {\r
17                 Color fill { get; set; }\r
18                 Stroke stroke { get; set; }\r
19         }\r
20         public static class ShapeExtention\r
21         {\r
22                 public static void draw(this Shape drawee, double c)\r
23                 {\r
24                         drawee.draw( new Color(c) );\r
25                 }\r
26                 public static void draw(this Shape drawee, Color c)\r
27                 {\r
28                         Color tmp_col = drawee.fill;\r
29                         Stroke tmp_strk = drawee.stroke;\r
30                         drawee.fill = c;\r
31                         drawee.stroke = new Stroke();\r
32                         drawee.draw();\r
33                         drawee.fill = tmp_col;\r
34                         drawee.stroke = tmp_strk;\r
35                 }\r
36                 public static void draw(this Shape drawee, Stroke strk)\r
37                 {\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
42                         drawee.draw();\r
43                         drawee.fill = tmp_col;\r
44                         drawee.stroke = tmp_strk;\r
45                 }\r
46         }\r
47 \r
48         public partial struct Stroke\r
49         {\r
50                 public double thick;\r
51                 public Color color;\r
52                 public Stroke(Color c, double t)\r
53                 {\r
54                         color = c;\r
55                         thick = t;\r
56                 }\r
57                 public void set(Color c, double t)\r
58                 {\r
59                         color = c;\r
60                         thick = t;\r
61                 }\r
62         }\r
63 \r
64         public partial class Line : Shape\r
65         {\r
66                 public Point begin, end;\r
67                 public Point datum\r
68                 {\r
69                         get { return begin; }\r
70                         set { begin = value; }\r
71                 }\r
72 \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
76                 {\r
77                         Line[] l = new Line[ind];\r
78                         for(int i=0; i<ind; i++) { l[i] = new Line(); }\r
79                         return l;\r
80                 }\r
81                 public static Line[,] Array(int indx, int indy)\r
82                 {\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
85                         return l;\r
86                 }\r
87 \r
88 \r
89                 public Line()\r
90                 {\r
91                         set(0,0,0,0);\r
92                 }\r
93                 public Line(double x1, double y1, double x2, double y2)\r
94                 {\r
95                         set(x1, y1, x2, y2);\r
96                 }\r
97                 public Line(Point v1, Point v2)\r
98                 {\r
99                         set(v1, v2);\r
100                 }\r
101                 public Line set(double x1, double y1, double x2, double y2)\r
102                 {\r
103                         begin.set(x1, y1);\r
104                         end.set(x2, y2);\r
105                         return this;\r
106                 }\r
107                 public Line set(Point v1, Point v2)\r
108                 {\r
109                         begin = v1;\r
110                         end   = v2;\r
111                         return this;\r
112                 }\r
113 \r
114                 public Figure shift(Point p)\r
115                 {\r
116                         begin += p;\r
117                         end   += p;\r
118                         return this;\r
119                 }\r
120                 public Figure centering(Point p)\r
121                 {\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
127                         return this;\r
128                 }\r
129 \r
130                 public virtual void draw()\r
131                 {\r
132                         Main.drawable.line(this);\r
133                 }\r
134 \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
147 \r
148                 public Color fill { get; set; }\r
149                 public Stroke stroke { get; set; }\r
150         }\r
151 \r
152 \r
153         public partial class Rectangle : Shape\r
154         {\r
155                 public Point v1, v2;\r
156 \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
160                 {\r
161                         Rectangle[] l = new Rectangle[ind];\r
162                         for (int i = 0; i < ind; i++) { l[i] = new Rectangle(); }\r
163                         return l;\r
164                 }\r
165                 public static Rectangle[,] Array(int indx, int indy)\r
166                 {\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
169                         return l;\r
170                 }\r
171 \r
172 \r
173                 public Rectangle()\r
174                 {\r
175                         set(0,0);\r
176                 }\r
177                 public Rectangle(double wid, double hei)\r
178                 {\r
179                         set(wid, hei);\r
180                 }\r
181                 public Rectangle(Rectangle another)\r
182                 {\r
183                         v1 = another.v1;\r
184                         v2 = another.v2;\r
185                 }\r
186                 public Rectangle set(double wid, double hei)\r
187                 {\r
188                         v1.set(0, 0, 0);\r
189                         v2.set(wid, hei, 0);\r
190                         return this;\r
191                 }\r
192                 Rectangle set(Point po1, Point po2) {\r
193                         v1 = po1;\r
194                         v2 = po2;\r
195                         return this;\r
196                 }\r
197                 public Rectangle set(double l, double t, double r, double b)\r
198                 {\r
199                         v1.set(l, t, 0);\r
200                         v2.set(r, b, 0);\r
201                         return this;\r
202                 }\r
203                 public Rectangle set(Rectangle another)\r
204                 {\r
205                         v1 = another.v1;\r
206                         v2 = another.v2;\r
207                         return this;\r
208                 }\r
209 \r
210                 public Rectangle resize(double width, double height)\r
211                 {\r
212                         Point po = center;\r
213                         set(width, height);\r
214                         centering(po);\r
215                         return this;\r
216                 }\r
217 \r
218 \r
219                 public Point datum\r
220                 {\r
221                         get { return v1; }\r
222                         set { double w = width, h = height; v1 = value; v2 = v1 + new Point(w,h); }\r
223                 }\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
228 \r
229                 public Figure shift(Point p)\r
230                 {\r
231                         v1 += p;\r
232                         v2 += p;\r
233                         return this;\r
234                 }\r
235                 public Figure centering(Point p)\r
236                 {\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
240                         v2.x = v1.x + h;\r
241                         v2.y = v1.y + v;\r
242                         return this;\r
243                 }\r
244 \r
245                 public virtual void draw()\r
246                 {\r
247                         Main.drawable.rect(this);\r
248                 }\r
249                 public bool include(double x, double y)\r
250                 {\r
251                         return (top <= y) && (left <= x) && (bottom >= y) && (right >= x);\r
252                 }\r
253                 public bool include(Point p)\r
254                 {\r
255                         return (top <= p.y) && (left <= p.x) && (bottom >= p.y) && (right >= p.x);\r
256                 }\r
257                 public bool include(Rectangle rect)\r
258                 {\r
259                         return (top <= rect.top) && (left <= rect.left) && (bottom >= rect.bottom) && (right >= rect.right);\r
260                 }\r
261 \r
262                 public Rectangle alignLeft(double lef)\r
263                 {\r
264                         return move_to(lef, getTop(), datum.z);\r
265                 }\r
266                 public Rectangle alignTop(double to_)\r
267                 {\r
268                         return move_to(getLeft(), to_, datum.z);\r
269                 }\r
270                 public Rectangle alignRight(double rig)\r
271                 {\r
272                         return move_to(rig - getWidth(), getTop(), datum.z);\r
273                 }\r
274                 public Rectangle alignBottom(double bot)\r
275                 {\r
276                         return move_to(getLeft(), bot - getHeight(), datum.z);\r
277                 }\r
278 \r
279                 public void clipped_by(Rectangle source)\r
280                 {\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
286                         set(l, t, r, b);\r
287                 }\r
288                 public void clip(Rectangle target)\r
289                 {\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
295                         set(l, t, r, b);\r
296                 }\r
297 \r
298 \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
308                 }\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
316 \r
317 \r
318 \r
319                 public Color fill { get; set; }\r
320                 public Stroke stroke { get; set; }\r
321 \r
322                 public override string ToString()\r
323                 {\r
324                         return "Left:" + left.ToString() + " Top:" + top.ToString() + " Right:" + right.ToString() + " Bottom:" + bottom.ToString();\r
325                 }\r
326         }\r
327 \r
328 \r
329         public partial class Ellipse : Shape\r
330         {\r
331                 public Point datum { get; set; }\r
332                 public double xdiameter, ydiameter;\r
333 \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
337                 {\r
338                         Ellipse[] l = new Ellipse[ind];\r
339                         for (int i = 0; i < ind; i++) { l[i] = new Ellipse(); }\r
340                         return l;\r
341                 }\r
342                 public static Ellipse[,] Array(int indx, int indy)\r
343                 {\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
346                         return l;\r
347                 }\r
348 \r
349                 public Ellipse()\r
350                 {\r
351                         set(0,0);\r
352                 }\r
353                 public Ellipse(double wid, double hei)\r
354                 {\r
355                         set(wid, hei);\r
356                 }\r
357 \r
358                 public Ellipse set(double wid, double hei)\r
359                 {\r
360                         xdiameter = wid;\r
361                         ydiameter = hei;\r
362                         return this;\r
363                 }\r
364                 public Ellipse resize(double width, double height)\r
365                 {\r
366                         Point po = center;\r
367                         set(width, height);\r
368                         centering(po);\r
369                         return this;\r
370                 }\r
371                 public Figure shift(Point p)\r
372                 {\r
373                         datum += p;\r
374                         return this;\r
375                 }\r
376                 public Figure centering(Point p)\r
377                 {\r
378                         datum = p;\r
379                         return this;\r
380                 }\r
381 \r
382                 public virtual void draw()\r
383                 {\r
384                         Main.drawable.ellipse(this);\r
385                 }\r
386 \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
394                 {\r
395                         get { return new Point((left + right) / 2, (top + bottom) / 2); }\r
396                         set { centering(value); }\r
397                 }\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
405 \r
406                 public Color fill { get; set; }\r
407                 public Stroke stroke { get; set; }\r
408         }\r
409 \r
410 \r
411         public partial class Polygon : Shape\r
412         {\r
413                 public Point datum { get; set; }\r
414                 public System.Collections.Generic.List<Point> vertices;\r
415 \r
416                 public Polygon()\r
417                 {\r
418                         vertices = new System.Collections.Generic.List<Point>();\r
419                 }\r
420                 public Polygon(double[] verts)\r
421                 {\r
422                         vertices = new System.Collections.Generic.List<Point>();\r
423                         for (int i=0; i < verts.Length; i+=2)\r
424                         {\r
425                                 vertices.Add(new Point(verts[i], verts[i+1]));\r
426                         }\r
427 \r
428                 }\r
429                 public Polygon(Point[] verts)\r
430                 {\r
431                         vertices = new System.Collections.Generic.List<Point>();\r
432                         foreach (Point p in verts)\r
433                         {\r
434                                 vertices.Add(p);\r
435                         }\r
436 \r
437                 }\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
441 \r
442 \r
443                 public Figure shift(Point p)\r
444                 {\r
445                         datum = datum + p;\r
446                         return this;\r
447                 }\r
448                 public Figure centering(Point p)\r
449                 {\r
450                         datum = p;\r
451                         return this;\r
452                 }\r
453 \r
454                 public virtual void draw()\r
455                 {\r
456                         Main.drawable.polygon(this);\r
457                 }\r
458 \r
459                 public Color fill { get; set; }\r
460                 public Stroke stroke { get; set; }\r
461         }\r
462 \r
463 }