Patrice T
Мое решение с реальной программой. Язык клипера (в основном FoxPro)
Метод:
1) найдите самые дальние 2 точки друг от друга.
2) попробуйте 2 точки На круге решения, центр находится в середине 2 точек.
3) если точка а дальше радиуса, то решение из 2 точек не работает.
4) переключатель на 3 очка по решению круга.
5) Найдите 3 самые дальние точки от центра.
6) переместите центр ближе к самой дальней точке.
7) Повторите упражнение на 5 до тех пор, пока 3 самые дальние точки не окажутся на одинаковом расстоянии.
* CCCP Code Challenge Code Project
* Circle surounding dataset in plane
clear
CircleFit({ { 0.5, 0.75 }, { 1.25, 0.85 }, { 3.86, 2.19 }, { 2.11, 4.65 }, { 1.17, 2.01 }, { 3.19, 1.63 } })
CircleFit({ { 0.5, 0.75 }, { 1.25, 0.85 }, { 3.86, 2.19 }, { 2.11, 4.65 }, { 1.17, 2.01 }, { 3.19, 1.63 }, {4.87, 5.39} })
return
function Circlefit(data)
clear
@ 2, 0 say "CCCP Code Challenge Code Project"
@ 3, 0 say "Circle surrounding dataset in plane"
dist= array(len(data))
tours=0
* Solve 2 Points
* trouver les 2 points les + eloignes
d1= 0
p3= 0
for scan1=1 to len(data)-1
for scan2=scan1+1 to len(data)
tmp= sqrt((data[scan1,1]-data[scan2,1])^2+(data[scan1,2]-data[scan2,2])^2)
if tmp > d1
p1= scan1
p2= scan2
d1= tmp
endif
next
next
bestx= (data[p1,1]+ data[p2,1])/2
besty= (data[p1,2]+ data[p2,2])/2
bestr= Calc_Rad(data, bestx, besty, dist)
if bestr - d1/2 > 0.0001
* Solve 3 Points
sol= "3 points"
while .T.
tours ++
p1= 0
d1= 0
p2= 0
d2= 0
p3= 0
d3= 0
* chercher les 3 points les + eloignes du centre
for scan=1 to len(data)
if dist[scan] > d1
p3=p2
d3=d2
p2=p1
d2=d1
p1=scan
d1=dist[scan]
elseif dist[scan] > d2
p3=p2
d3=d2
p2=scan
d2=dist[scan]
elseif dist[scan] > d3
p3=scan
d3=dist[scan]
endif
next
aff()
* converge vers p1
bestx= bestx+ (data[p1,1]-bestx)*(d1-d3)/d1/2
besty= besty+ (data[p1,2]-besty)*(d1-d3)/d1/2
bestr= Calc_Rad(data, bestx, besty, dist)
if d1-d3 < 0.0001
exit
endif
enddo
sol= "Solution a 3 points"
else
sol= "Solution a 2 points"
endif
aff()
return
procedure aff()
@ 5, 0 say bestx picture "@E 99.9999"
@ 5,10 say besty picture "@E 99.9999"
@ 5,20 say bestr picture "@E 99.9999"
@ 5,30 say tours picture "999"
@ 5,40 say sol
for scan=1 to len(data)
@ 6+scan, 0 say data[scan,1] picture "@E 99.99"
@ 6+scan,10 say data[scan,2] picture "@E 99.99"
if scan= p1
@ 6+scan,18 say "1"
elseif scan= p2
@ 6+scan,18 say "2"
elseif scan= p3
@ 6+scan,18 say "3"
else
@ 6+scan,18 say " "
endif
@ 6+scan,20 say dist[scan] picture "@E 99.9999"
next
inkey(0)
return
function Calc_Rad(data, cx, cy, dist)
* calcul des rayons
cr= 0
for scan=1 to len(data)
dist[scan]= sqrt((cx-data[scan,1])^2+(cy-data[scan,2])^2)
if cr < dist[scan]
cr= dist[scan]
endif
next
return cr
[Обновление]
Результаты:
набор данных 1
{ { 0.5, 0.75 }, { 1.25, 0.85 }, { 3.86, 2.19 }, { 2.11, 4.65 }, { 1.17, 2.01 }, { 3.19, 1.63 } }
Решение - 3 точки на окружности
Центр - {1.7276, 2.5255} радиус os 2.1586 с 16 итерациями
набор данных 2
{ { 0.5, 0.75 }, { 1.25, 0.85 }, { 3.86, 2.19 }, { 2.11, 4.65 }, { 1.17, 2.01 }, { 3.19, 1.63 }, {4.87, 5.39} }
Решение - 2 точки на окружности
Центр - {2.6850, 3.0700} радиус os 3.1869
[Обновление] Вот дамп дисплея для полного решения 3-х комплектов
CCCP Code Chalenge Code Project
Circle surounding dataset in plane
1,3050 2,7000 2,6054 0 2 points
0,50 0,75 1 2,1096
1,25 0,85 1,8508
3,86 2,19 2,6054
2,11 4,65 2 2,1096
1,17 2,01 0,7031
3,19 1,63 2,1675
1,3050 2,7000 2,6054 1 3 points
0,50 0,75 3 2,1096
1,25 0,85 1,8508
3,86 2,19 1 2,6054
2,11 4,65 2,1096
1,17 2,01 0,7031
3,19 1,63 2 2,1675
1,5481 2,6515 2,3575 2 3 points
0,50 0,75 2 2,1712
1,25 0,85 1,8260
3,86 2,19 1 2,3575
2,11 4,65 3 2,0760
1,17 2,01 0,7446
3,19 1,63 1,9337
1,6861 2,6239 2,2178 3 3 points
0,50 0,75 1 2,2178
1,25 0,85 1,8267
3,86 2,19 2 2,2168
2,11 4,65 3 2,0699
1,17 2,01 0,8020
3,19 1,63 1,8026
1,6466 2,5615 2,2444 4 3 points
0,50 0,75 2 2,1439
1,25 0,85 1,7568
3,86 2,19 1 2,2444
2,11 4,65 3 2,1393
1,17 2,01 0,7289
3,19 1,63 1,8027
1,6984 2,5528 2,1918 5 3 points
0,50 0,75 2 2,1648
1,25 0,85 1,7608
3,86 2,19 1 2,1918
2,11 4,65 3 2,1372
1,17 2,01 0,7575
3,19 1,63 1,7540
1,7253 2,5483 2,1760 6 3 points
0,50 0,75 1 2,1760
1,25 0,85 1,7635
3,86 2,19 2 2,1645
2,11 4,65 3 2,1367
1,17 2,01 0,7734
3,19 1,63 1,7287
1,7142 2,5320 2,1729 7 3 points
0,50 0,75 2 2,1563
1,25 0,85 1,7449
3,86 2,19 1 2,1729
2,11 4,65 3 2,1547
1,17 2,01 0,7541
3,19 1,63 1,7296
1,7232 2,5306 2,1638 8 3 points
0,50 0,75 2 2,1602
1,25 0,85 1,7459
3,86 2,19 1 2,1638
2,11 4,65 3 2,1544
1,17 2,01 0,7596
3,19 1,63 1,7212
1,7278 2,5298 2,1622 9 3 points
0,50 0,75 1 2,1622
1,25 0,85 1,7465
3,86 2,19 2 2,1591
2,11 4,65 3 2,1543
1,17 2,01 0,7625
3,19 1,63 1,7169
1,7256 2,5266 2,1608 10 3 points
0,50 0,75 2 2,1583
1,25 0,85 1,7427
3,86 2,19 1 2,1608
2,11 4,65 3 2,1579
1,17 2,01 0,7586
3,19 1,63 1,7171
1,7270 2,5264 2,1594 11 3 points
0,50 0,75 2 2,1589
1,25 0,85 1,7429
3,86 2,19 1 2,1594
2,11 4,65 3 2,1579
1,17 2,01 0,7595
3,19 1,63 1,7158
1,7277 2,5262 2,1592 12 3 points
0,50 0,75 1 2,1592
1,25 0,85 1,7430
3,86 2,19 2 2,1586
2,11 4,65 3 2,1579
1,17 2,01 0,7600
3,19 1,63 1,7151
1,7273 2,5257 2,1589 13 3 points
0,50 0,75 2 2,1586
1,25 0,85 1,7423
3,86 2,19 1 2,1589
2,11 4,65 3 2,1585
1,17 2,01 0,7593
3,19 1,63 1,7151
1,7275 2,5257 2,1587 14 3 points
0,50 0,75 2 2,1587
1,25 0,85 1,7424
3,86 2,19 1 2,1587
2,11 4,65 3 2,1585
1,17 2,01 0,7594
3,19 1,63 1,7149
1,7276 2,5256 2,1587 15 3 points
0,50 0,75 1 2,1587
1,25 0,85 1,7424
3,86 2,19 2 2,1586
2,11 4,65 3 2,1585
1,17 2,01 0,7595
3,19 1,63 1,7148
1,7276 2,5256 2,1587 16 3 points
0,50 0,75 2 2,1586
1,25 0,85 1,7423
3,86 2,19 1 2,1587
2,11 4,65 3 2,1586
1,17 2,01 0,7594
3,19 1,63 1,7148
1,7276 2,5255 2,1586 16 Solution a 3 points
0,50 0,75 2 2,1586
1,25 0,85 1,7423
3,86 2,19 1 2,1586
2,11 4,65 3 2,1586
1,17 2,01 0,7594
3,19 1,63 1,7148
CCCP Code Chalenge Code Project
Circle surounding dataset in plane
2,6850 3,0700 3,1869 0 Solution a 2 points
0,50 0,75 1 3,1869
1,25 0,85 2,6434
3,86 2,19 1,4680
2,11 4,65 1,6814
1,17 2,01 1,8490
3,19 1,63 1,5260
4,87 5,39 2 3,1869
CCCP Code Chalenge Code Project
Circle surounding dataset in plane
7,7500 1,1900 9,2688 0 2 points
0,50 0,75 1 7,2633
1,25 0,85 6,5089
3,86 2,19 4,0165
11,00 7,00 6,6572
1,17 2,01 6,6309
15,00 1,63 2 7,2633
4,87 10,00 9,2688
7,7500 1,1900 9,2688 1 3 points
0,50 0,75 2 7,2633
1,25 0,85 6,5089
3,86 2,19 4,0165
11,00 7,00 6,6572
1,17 2,01 6,6309
15,00 1,63 3 7,2633
4,87 10,00 1 9,2688
7,4384 2,1431 8,2661 2 3 points
0,50 0,75 3 7,0769
1,25 0,85 6,3221
3,86 2,19 3,5787
11,00 7,00 6,0228
1,17 2,01 6,2698
15,00 1,63 2 7,5790
4,87 10,00 1 8,2661
7,2537 2,7082 7,8210 3 3 points
0,50 0,75 3 7,0319
1,25 0,85 6,2847
3,86 2,19 3,4330
11,00 7,00 5,6968
1,17 2,01 6,1236
15,00 1,63 1 7,8210
4,87 10,00 2 7,6715
7,6445 2,6538 7,8526 4 3 points
0,50 0,75 3 7,3938
1,25 0,85 6,6440
3,86 2,19 3,8128
11,00 7,00 5,4908
1,17 2,01 6,5064
15,00 1,63 2 7,4264
4,87 10,00 1 7,8526
7,5634 2,8685 7,6232 5 3 points
0,50 0,75 3 7,3743
1,25 0,85 6,6282
3,86 2,19 3,7651
11,00 7,00 5,3740
1,17 2,01 6,4508
15,00 1,63 2 7,5390
4,87 10,00 1 7,6232
7,5195 2,9849 7,6023 6 3 points
0,50 0,75 3 7,3667
1,25 0,85 6,6230
3,86 2,19 3,7448
11,00 7,00 5,3137
1,17 2,01 6,4239
15,00 1,63 1 7,6023
4,87 10,00 2 7,4987
7,6354 2,9639 7,5600 7 3 points
0,50 0,75 3 7,4709
1,25 0,85 6,7262
3,86 2,19 3,8539
11,00 7,00 5,2546
1,17 2,01 6,5354
15,00 1,63 2 7,4845
4,87 10,00 1 7,5600
7,6191 3,0054 7,5155 8 3 poi