Problem of Apollonius: Difference between revisions

Added XPL0 example.
(Added XPL0 example.)
Line 3,587:
Circle(2, 2.1, 3.9)
Circle(2, 0.83333333333333, 1.1666666666667)
</pre>
 
=={{header|XPL0}}==
{{trans|Go}}
<syntaxhighlight lang "XPL0">real Circle(3);
def \Circle\ X, Y, R;
 
proc real AP(C1, C2, C3, S);
real C1, C2, C3; int S;
real X1SQ, Y1SQ, R1SQ,
X2SQ, Y2SQ, R2SQ,
X3SQ, Y3SQ, R3SQ,
V11, V12, V13, V14,
V21, V22, V23, V24,
W12, W13, W14,
W22, W23, W24,
P, Q, M, N, A, B, C, D, RS;
[X1SQ:= C1(X) * C1(X);
Y1SQ:= C1(Y) * C1(Y);
R1SQ:= C1(R) * C1(R);
X2SQ:= C2(X) * C2(X);
Y2SQ:= C2(Y) * C2(Y);
R2SQ:= C2(R) * C2(R);
X3SQ:= C3(X) * C3(X);
Y3SQ:= C3(Y) * C3(Y);
R3SQ:= C3(R) * C3(R);
V11:= 2. * (C2(X) - C1(X));
V12:= 2. * (C2(Y) - C1(Y));
V13:= X1SQ - X2SQ + Y1SQ - Y2SQ - R1SQ + R2SQ;
V14:= 2. * (C2(R) - C1(R));
V21:= 2. * (C3(X) - C2(X));
V22:= 2. * (C3(Y) - C2(Y));
V23:= X2SQ - X3SQ + Y2SQ - Y3SQ - R2SQ + R3SQ;
V24:= 2. * (C3(R) - C2(R));
if S then [V14:= -V14; V24:= -V24];
W12:= V12 / V11;
W13:= V13 / V11;
W14:= V14 / V11;
W22:= V22/V21 - W12;
W23:= V23/V21 - W13;
W24:= V24/V21 - W14;
P:= -W23 / W22;
Q:= W24 / W22;
M:= -W12*P - W13;
N:= W14 - W12*Q;
A:= N*N + Q*Q - 1.;
B:= M*N - N*C1(X) + P*Q - Q*C1(Y);
if S then B:= B - C1(R)
else B:= B + C1(R);
B:= B * 2.;
C:= X1SQ + M*M - 2.*M*C1(X) + P*P + Y1SQ - 2.*P*C1(Y) - R1SQ;
D:= B*B - 4.*A*C;
RS:= (-B - sqrt(D)) / (2.*A);
Circle(X):= M + N*RS;
Circle(Y):= P + Q*RS;
Circle(R):= RS;
];
 
real C1, C2, C3;
[C1:= [0., 0., 1.];
C2:= [4., 0., 1.];
C3:= [2., 4., 2.];
AP(C1, C2, C3, true);
RlOut(0, Circle(X)); RlOut(0, Circle(Y)); RlOut(0, Circle(R)); CrLf(0);
AP(C1, C2, C3, false);
RlOut(0, Circle(X)); RlOut(0, Circle(Y)); RlOut(0, Circle(R)); CrLf(0);
]</syntaxhighlight>
{{out}}
<pre>
2.00000 0.83333 1.16667
2.00000 2.10000 3.90000
</pre>
 
291

edits