OSDN Git Service

hk
[psychlops/silverlight.git] / dev3 / 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 : Figure\r
16         {\r
17                 void draw(Color c);\r
18         }\r
19         public static class ShapeExtention\r
20         {\r
21                 /*\r
22                 public static void draw(this Shape drawee)\r
23                 {\r
24                         drawee.draw(Color.white);\r
25                 }\r
26                 */\r
27         }\r
28 \r
29         public struct Stroke\r
30         {\r
31 \r
32         }\r
33 \r
34         public class Line : Shape\r
35         {\r
36                 public Point begin, end;\r
37 \r
38                 public Line(double x1, double y1, double x2, double y2)\r
39                 {\r
40                         set(x1, y1, x2, y2);\r
41                 }\r
42                 public Line(Point v1, Point v2)\r
43                 {\r
44                         set(v1, v2);\r
45                 }\r
46                 public void set(double x1, double y1, double x2, double y2)\r
47                 {\r
48                         begin.set(x1, y1);\r
49                         end.set(x2, y2);\r
50                 }\r
51                 public void set(Point v1, Point v2)\r
52                 {\r
53                         begin = v1;\r
54                         end   = v2;\r
55                 }\r
56 \r
57                 public Figure shift(Point p)\r
58                 {\r
59                         begin += p;\r
60                         end   += p;\r
61                         return this;\r
62                 }\r
63                 public Figure centering(Point p)\r
64                 {\r
65                         double h = width, v = height;\r
66                         begin.x = p.x - h / 2.0;\r
67                         begin.y = p.y - v / 2.0;\r
68                         end.x = begin.x + h;\r
69                         end.y = begin.y + v;\r
70                         return this;\r
71                 }\r
72 \r
73                 public void draw(Color c)\r
74                 {\r
75                         Main.drawable.line(this, c);\r
76                 }\r
77                 public void draw()\r
78                 {\r
79                         Main.drawable.line(this, Color.white);\r
80                 }\r
81 \r
82                 public double left { get { return begin.x < end.x ? begin.x : end.x; } }\r
83                 public double top { get { return begin.y < end.y ? begin.y : end.y; ; } }\r
84                 public double right { get { return begin.x > end.x ? begin.x : end.x; ; } }\r
85                 public double bottom { get { return begin.y > end.y ? begin.y : end.y; ; } }\r
86                 public double width { get { return Math.abs(begin.x - end.x); } }\r
87                 public double height { get { return Math.abs(begin.y - end.y); } }\r
88 \r
89                 public static implicit operator System.Windows.Shapes.Line(Line d)\r
90                 {\r
91                         var tmp = new System.Windows.Shapes.Line();\r
92                         tmp.X1 = d.begin.x;\r
93                         tmp.Y1 = d.begin.y;\r
94                         tmp.X2 = d.end.x;\r
95                         tmp.Y2 = d.end.y;\r
96                         return tmp;\r
97                 }\r
98         }\r
99 \r
100 \r
101         public class Rectangle : Shape\r
102         {\r
103                 public Point v1, v2;\r
104 \r
105                 public Rectangle()\r
106                 {\r
107                         set(0,0);\r
108                 }\r
109                 public Rectangle(double wid, double hei)\r
110                 {\r
111                         set(wid, hei);\r
112                 }\r
113                 \r
114                 public Rectangle set(double wid, double hei)\r
115                 {\r
116                         v1.set(0, 0, 0);\r
117                         v2.set(wid, hei, 0);\r
118                         return this;\r
119                 }\r
120 \r
121                 public Figure shift(Point p)\r
122                 {\r
123                         v1 += p;\r
124                         v2 += p;\r
125                         return this;\r
126                 }\r
127                 public Figure centering(Point p)\r
128                 {\r
129                         double h = width, v = height;\r
130                         v1.x = p.x - h / 2.0;\r
131                         v1.y = p.y - v / 2.0;\r
132                         v2.x = v1.x + h;\r
133                         v2.y = v1.y + v;\r
134                         return this;\r
135                 }\r
136 \r
137                 public void draw(Color c)\r
138                 {\r
139                         Main.drawable.rect(this, c);\r
140                 }\r
141                 public void draw()\r
142                 {\r
143                         Main.drawable.rect(this, Color.white);\r
144                 }\r
145 \r
146                 public double left   { get { return v1.x; } }\r
147                 public double top    { get { return v1.y; } }\r
148                 public double right  { get { return v2.x; } }\r
149                 public double bottom { get { return v2.y; } }\r
150                 public double width { get { return Math.abs(v1.x - v2.x); } }\r
151                 public double height { get { return Math.abs(v1.y - v2.y); } }\r
152 \r
153 \r
154                 public static implicit operator System.Windows.Rect(Rectangle d)\r
155                 {\r
156                         return new System.Windows.Rect(d.v1.x, d.v1.y, d.v2.x, d.v2.y);\r
157                 }\r
158 \r
159         }\r
160 \r
161 \r
162         public class Ellipse : Shape\r
163         {\r
164                 public Point datum;\r
165                 public double xdiameter, ydiameter;\r
166 \r
167                 public Ellipse()\r
168                 {\r
169                         set(0,0);\r
170                 }\r
171                 public Ellipse(double wid, double hei)\r
172                 {\r
173                         set(wid, hei);\r
174                 }\r
175 \r
176                 public Ellipse set(double wid, double hei)\r
177                 {\r
178                         xdiameter = wid;\r
179                         ydiameter = hei;\r
180                         return this;\r
181                 }\r
182                 public Figure shift(Point p)\r
183                 {\r
184                         datum += p;\r
185                         return this;\r
186                 }\r
187                 public Figure centering(Point p)\r
188                 {\r
189                         datum = p;\r
190                         return this;\r
191                 }\r
192 \r
193                 public void draw(Color c)\r
194                 {\r
195                         Main.drawable.ellipse(this, c);\r
196                 }\r
197                 public void draw()\r
198                 {\r
199                         Main.drawable.ellipse(this, Color.white);\r
200                 }\r
201 \r
202                 public double left { get { return datum.x - xdiameter/2.0; } }\r
203                 public double top { get { return datum.y - ydiameter / 2.0; } }\r
204                 public double right { get { return datum.x + xdiameter / 2.0; } }\r
205                 public double bottom { get { return datum.y + ydiameter / 2.0; } }\r
206                 public double width { get { return Math.abs(xdiameter); } }\r
207                 public double height { get { return Math.abs(ydiameter); } }\r
208         }\r
209 \r
210 \r
211         public class Polygon : Shape\r
212         {\r
213                 public Point datum;\r
214                 public System.Collections.Generic.List<Point> vertices;\r
215 \r
216                 public Polygon()\r
217                 {\r
218                         vertices = new System.Collections.Generic.List<Point>();\r
219                 }\r
220                 public Polygon(double[] verts)\r
221                 {\r
222                         vertices = new System.Collections.Generic.List<Point>();\r
223                         for (int i=0; i < verts.Length; i+=2)\r
224                         {\r
225                                 vertices.Add(new Point(verts[i], verts[i+1]));\r
226                         }\r
227 \r
228                 }\r
229                 public Polygon(Point[] verts)\r
230                 {\r
231                         vertices = new System.Collections.Generic.List<Point>();\r
232                         foreach (Point p in verts)\r
233                         {\r
234                                 vertices.Add(p);\r
235                         }\r
236 \r
237                 }\r
238                 public Polygon append(Point p) { vertices.Add(p); return this; }\r
239                 public Polygon append(double x, double y) { return append(new Point(x, y, 0.0)); }\r
240                 public Polygon append(double x, double y, double z) { return append(new Point(x, y, z)); }\r
241 \r
242 \r
243                 public Figure shift(Point p)\r
244                 {\r
245                         datum += p;\r
246                         return this;\r
247                 }\r
248                 public Figure centering(Point p)\r
249                 {\r
250                         datum = p;\r
251                         return this;\r
252                 }\r
253 \r
254                 public void draw(Color c)\r
255                 {\r
256                         Main.drawable.polygon(this, c);\r
257                 }\r
258                 public void draw()\r
259                 {\r
260                         Main.drawable.polygon(this, Color.white);\r
261                 }\r
262         }\r
263 \r
264 }