1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 package net.sourceforge.kamiwaai.geometricalgebra;
43 import java.awt.Color;
44 import java.awt.Graphics;
45 import java.util.Vector;
46 public class Sphere extends GeometricObject {
47 private MultiVector[] basepoints = new MultiVector[4];
48
49 private Color color = Color.magenta;
50 public Sphere(MultiVector L4) {
51 L = L4;
52 }
53 public Sphere(PointC point1, PointC point2, PointC point3, PointC point4) {
54 L = point1.getMultiVector().OutProd(point2.getMultiVector()).OutProd(
55 point3.getMultiVector().OutProd(point4.getMultiVector()));
56 }
57 public Sphere(PointC centre, double radius){
58 L = I.mult(centre.getMultiVector().sub(n.multSc(0.5*radius*radius))).multSc(2.0*radius*radius*radius);
59 }
60 public double radius() {
61 double r2 = (L.ScProd(L)) * (1.0 / (n.OutProd(L).ScProd(n.OutProd(L))));
62 double r = Math.sqrt(r2);
63 return r;
64 }
65 public MultiVector Center() {
66
67 MultiVector low = n.OutProd(L).mult(I).multSc(-1.0);
68 double llow = low.ScProd(low);
69 MultiVector Low = low.multSc(1.0 / llow);
70 MultiVector Result = L.mult(I).mult(Low);
71 double r = radius();
72 MultiVector Cent = Result.add(n.multSc(0.5 * r * r));
73 return Cent;
74 }
75 public double[] center() {
76
77 double[] cvector = new double[3];
78 Sphere LS = new Sphere(L);
79 cvector[0] = LS.Center().get3DEuclidianPoint()[0];
80 cvector[1] = LS.Center().get3DEuclidianPoint()[1];
81 cvector[2] = LS.Center().get3DEuclidianPoint()[2];
82 return cvector;
83 }
84 public MultiVector generator(int inc, MultiVector plane) {
85
86
87 int UP = inc;
88 double angle = 2 * Math.PI / UP;
89 MultiVector cv, Iplane, Tc, Tcr, R, D;
90 cv = Center().OutProd(N).mult(N);
91
92 Tc = One.add(n.mult(cv).multSc(0.5));
93 Tcr = Tc.reverse();
94 Iplane = plane.multSc(1.0 / (plane.magnitude()));
95
96 R = One.multSc(Math.cos(0.5 * angle)).add(
97 Iplane.multSc(Math.sin(0.5 * angle)));
98
99 D = Tc.mult(R).mult(Tcr);
100 return D;
101 }
102 public MultiVector PonS() {
103
104
105
106 MultiVector rv, rad, Trad, Tradr, pons;
107 double r;
108
109 rv = e1.add(e2).add(e3.multSc(-1.0));
110 r = radius();
111 rad = rv.multSc(r / (rv.magnitude()));
112
113 Trad = One.add(n.mult(rad).multSc(0.5));
114 Tradr = Trad.reverse();
115 pons = Trad.mult(Center()).mult(Tradr);
116 return pons;
117 }
118 public MultiVector PonSsouth() {
119
120
121 MultiVector rv, rad, Trad, Tradr, pons;
122 double r;
123
124 rv = e1.add(e2).add(e3.multSc(-1.0));
125 r = radius();
126 rad = rv.multSc(r / (rv.magnitude()));
127
128 Trad = One.add(n.mult(rad).multSc(0.5));
129 Tradr = Trad.reverse();
130 pons = Tradr.mult(Center()).mult(Trad);
131
132 return pons;
133 }
134 public Vector snet(int inc) {
135
136 Vector scnet = new Vector();
137 MultiVector pole, center, A1, A2, A3, L3, D1, D1r, D2, D2r;
138 MultiVector Iequp, Dlg, Dlgr;
139 Circle C, C0;
140
141 pole = PonS().OutProd(N).mult(N);
142 center = Center().OutProd(N).mult(N);
143 D1 = generator(2 * inc, pole.sub(center).OutProd(e1));
144 D1r = D1.reverse();
145 D2 = generator(2 * inc, pole.sub(center).OutProd(e2));
146 D2r = D2.reverse();
147
148 A1 = PonS();
149 A2 = PonS();
150 A3 = PonS();
151 for (int k = 1; k < inc; k++) {
152 A1 = D1.mult(A1).mult(D1r);
153 A2 = D2.mult(A2).mult(D2r);
154 A3 = D1r.mult(A3).mult(D1);
155 L3 = A1.OutProd(A2).OutProd(A3);
156 C = new Circle(L3);
157 C.setColor(color);
158
159 scnet.add(C);
160 }
161
162
163 Iequp = ((Circle) scnet.get(0)).Cplane();
164
165 A1 = PonS();
166 A2 = D1.mult(A1).mult(D1r);
167 A3 = D1r.mult(A1).mult(D1);
168 L3 = A1.OutProd(A2).OutProd(A3);
169 C0 = new Circle(L3);
170 C0.setColor(color);
171 scnet.add(C0);
172 Dlg = generator(2 * inc, Iequp);
173 Dlgr = Dlg.reverse();
174 for (int k = 1; k < inc; k++) {
175 C = new Circle((Dlg.Powerof(k)).mult(C0.getMultiVector()).mult(
176 Dlgr.Powerof(k)));
177 C.setColor(color);
178 scnet.add(C);
179 }
180 return scnet;
181
182
183
184
185
186
187
188
189 }
190 public void setColor(Color c) {
191 color = c;
192 }
193 public void draw(Graphics g) {
194 Sphere LS = new Sphere(L);
195 Vector SNET;
196 SNET = LS.snet(6);
197 for (int k = 0; k <= SNET.size() - 1; k++) {
198 ((Circle) SNET.get(k)).setColor(color);
199 ((Circle) SNET.get(k)).draw(g);
200 }
201 }
202 public void drawZ(Graphics g) {
203 Sphere LS = new Sphere(L);
204 Vector SNET;
205 SNET = LS.snet(6);
206 for (int k = 0; k <= SNET.size() - 1; k++) {
207 ((Circle) SNET.get(k)).setColor(color);
208 ((Circle) SNET.get(k)).drawZ(g);
209 }
210 }
211 public void setBasePoint(MultiVector basepoint, int p1to4) {
212 basepoints[p1to4] = basepoint;
213 }
214
215
216 public void remake(MultiVector movedBP, int bpno) {
217 basepoints[bpno] = movedBP;
218 MultiVector Lnew = basepoints[0].OutProd(basepoints[1]).OutProd(
219 basepoints[2].OutProd(basepoints[3]));
220 L = Lnew;
221 }
222 public void recenter(MultiVector NewCenter) {
223 MultiVector OldCenter, cDiff, Tc, Tcr, Lnew;
224 Sphere LS = new Sphere(L);
225 OldCenter = LS.Center();
226 cDiff = NewCenter.get3DMVector().sub(OldCenter.get3DMVector());
227 Tc = One.add(n.mult(cDiff).multSc(0.5));
228 Tcr = Tc.reverse();
229 Lnew = Tc.mult(L).mult(Tcr);
230 L = Lnew;
231 }
232 private int MeetNo(Line line) {
233 int meetno;
234 double meet2 = meet(line).ScProd(meet(line));
235 if (meet2 > 0.0)
236 meetno = 2;
237 else if (meet2 == 0.0)
238 meetno = 1;
239 else
240 meetno = 0;
241 return meetno;
242 }
243 public Vector MeetLineMVs(Line line) {
244 Vector mline = new Vector();
245
246 int mno = MeetNo(line);
247
248 MultiVector Meet, Meetp, u, v, a, b;
249 double u2, gamma;
250
251
252 Meet = meet(line);
253 Meetp = Meet.sub(Meet.mult(N).getGrade(0).mult(N));
254
255 v = Meetp.mult(nbar).multSc(-1.0).getGrade(1).multSc(-2.0);
256 u = Meetp.mult(n).multSc(-1.0).getGrade(1);
257 u2 = u.ScProd(u);
258 gamma = 2.0 * Meet.getnhnbPart().getScPart().RealPart();
259 if (mno == 1) {
260 MultiVector fact, factinv, A;
261 fact = Meet.mult(n).multSc(-1.0).getGrade(1);
262 factinv = fact.multSc(1.0 / (fact.magnitude() * fact.magnitude()));
263
264 A = factinv.mult(Meet);
265
266
267
268
269
270
271 mline.add(A);
272 } else {
273 if (mno == 2 && gamma == 0.0) {
274 MultiVector Bv, udB, x, stem, A, B;
275 double ra = radius();
276 Bv = Meetp.mult(N).getGrade(4).mult(N);
277 udB = u.Lcontract(Bv);
278 stem = udB.multSc(1.0 / u2);
279 x = u.multSc(Math.sqrt(ra * ra / u2 - udB.ScProd(udB)
280 / (u2 * u2 * u2)));
281 a = stem.add(x);
282 b = stem.sub(x);
283 A = a.add(n.multSc(0.5 * a.ScProd(a))).add(nbar);
284 B = b.add(n.multSc(0.5 * b.ScProd(b))).add(nbar);
285
286
287
288
289
290
291 mline.add(A);
292 mline.add(B);
293 } else if (mno == 2 && gamma != 0.0) {
294 MultiVector A, B;
295 double sigma, v2, rho, a2, b2;
296 sigma = 0.5 * gamma * gamma - u.ScProd(v);
297 v2 = v.ScProd(v);
298 rho = Math.sqrt(sigma * sigma - v2 * u2);
299
300
301 a2 = (sigma + rho) / u2;
302 b2 = (sigma - rho) / u2;
303 a = (u.multSc(a2).add(v)).multSc(1.0 / gamma);
304 b = (u.multSc(b2).add(v)).multSc(1.0 / gamma);
305 A = a.add(n.multSc(0.5 * a2)).add(nbar);
306 B = b.add(n.multSc(0.5 * b2)).add(nbar);
307
308
309
310
311
312
313 mline.add(A);
314 mline.add(B);
315 }
316 }
317 return mline;
318 }
319
320 }