38 lines
1.1 KiB
Plaintext
38 lines
1.1 KiB
Plaintext
include c:\cxpl\codes; \intrinsic 'code' declarations
|
|
|
|
proc ClosestPair(P, N); \Show closest pair of points in array P
|
|
real P; int N;
|
|
real Dist2, MinDist2;
|
|
int I, J, SI, SJ;
|
|
[MinDist2:= 1e300;
|
|
for I:= 0 to N-2 do
|
|
[for J:= I+1 to N-1 do
|
|
[Dist2:= sq(P(I,0)-P(J,0)) + sq(P(I,1)-P(J,1));
|
|
if Dist2 < MinDist2 then \squared distances are sufficient for compares
|
|
[MinDist2:= Dist2;
|
|
SI:= I; SJ:= J;
|
|
];
|
|
];
|
|
];
|
|
IntOut(0, SI); Text(0, " -- "); IntOut(0, SJ); CrLf(0);
|
|
RlOut(0, P(SI,0)); Text(0, ","); RlOut(0, P(SI,1));
|
|
Text(0, " -- ");
|
|
RlOut(0, P(SJ,0)); Text(0, ","); RlOut(0, P(SJ,1));
|
|
CrLf(0);
|
|
];
|
|
|
|
real Data;
|
|
[Format(1, 6);
|
|
Data:= [[0.654682, 0.925557], \0 test data from BASIC examples
|
|
[0.409382, 0.619391], \1
|
|
[0.891663, 0.888594], \2
|
|
[0.716629, 0.996200], \3
|
|
[0.477721, 0.946355], \4
|
|
[0.925092, 0.818220], \5
|
|
[0.624291, 0.142924], \6
|
|
[0.211332, 0.221507], \7
|
|
[0.293786, 0.691701], \8
|
|
[0.839186, 0.728260]]; \9
|
|
ClosestPair(Data, 10);
|
|
]
|