Kör középpontjának kiszámítása

Kör középpontjának kiszámítása
2010-04-18T17:00:30+02:00
2010-04-18T18:02:01+02:00
2022-11-17T11:30:40+01:00
JulesM111
Sziasztok!

Feladat, hogy sok (akár többezer) xyz-ponttal ellátott kör középpontját számoljam ki.


Kiszámítom a kör a középpontját a következő kód alapján:

cVeC ^cVeC::CenPC_ALL(cVeC ^Pnorm) { cVeC ^D; int DB,i,j,k,q; double DX,DY,DZ; DX=DY=DZ=0.00; q=0; DB=(V->Length-1); double x,y,z,t,sz,n; cVeC ^V_bc,^V_ba,^V_1,^V_2,^P_bc,^P_ba =gcnew cVeC(); for (i=1; i<(DB-2); i++) { for (j=(i+1); j<(DB-1); j++) { V_ba=V[i]-V[j]; V_1=CP(Pnorm,V_ba); P_ba=MP_2pts(V[j],V[i]); for (k=(j+1); k<DB; k++) { V_bc=V[k]-V[j]; V_2=CP(Pnorm,V_bc); P_bc=MP_2pts(V[j],V[k]); sz=V_2->j*(P_bc->i-P_ba->i)+V_2->i*(P_ba->j-P_bc->j); n=V_2->j*V_1->i-V_1->j*V_2->i; t=sz/n; x=P_ba->i+t*V_1->i; y=P_ba->j+t*V_1->j; z=P_ba->k+t*V_1->k; DX=DX+x; DY=DY+y; DZ=DZ+z; q++; } } } D=gcnew cVeC(DX,DY,DZ); D=D/q; return D;

A kód 200 adott ponttal remekül működik, de már 500 pont esetén lassulok, és nem ad eredményt, azaz "nem szám" lesz belőle.

Ennek okát egyelőre nem látom, ebben kérném segítségeteket.
Tippjeim:
-kiesek a double számábrázolásból
-a double "pontatlansága" miatt egy osztásom eredménye végtelen lesz

üdv: Jules

ui: [szerk] bocsánat, hogy elbénáztam a forráskód formázását...
Mutasd a teljes hozzászólást!
Ha arra gyanakszol, hogy a nullával való osztás történik valahol, akkor minden olyan művelet előtt, ahol gyanús, készíts egy if utasítást. És abba tegyél egy breakpoint-ot.

Pl.
if (ABS(oszto) < 10e-20) { // ide tedd a breakpoint-ot! } eredmeny = valami / oszto;

Tehát, ha a tesztelés során megáll a program futása a breakpoint-nál, valóban túl kis értékkel akarsz osztani.
Mutasd a teljes hozzászólást!

  • Három pontból ki lehet számolni a kör középpontját (középiskolai matekházi), ha ennél több pont van, akkor végezd el a számítást pár különböző hármasra, és ellenőrizd, hogy (kerekítési hibán belül) ugyanaz jött-e ki.
    Mutasd a teljes hozzászólást!
  • Bocsánat, rosszul fogalmaztam meg a feladatot, adott sok pont, ami első ránézésre egy kör, de a pontok mindegyike nem helyezkedik el a számított körön, azaz valami körinterpolációs dolog lenne, először a középpont meghatározása, majd később legkisebb négyzetek módszerével, és szükséges szűrőkkel a kör átmérője.
    Mutasd a teljes hozzászólást!
  • Ha arra gyanakszol, hogy a nullával való osztás történik valahol, akkor minden olyan művelet előtt, ahol gyanús, készíts egy if utasítást. És abba tegyél egy breakpoint-ot.

    Pl.
    if (ABS(oszto) < 10e-20) { // ide tedd a breakpoint-ot! } eredmeny = valami / oszto;

    Tehát, ha a tesztelés során megáll a program futása a breakpoint-nál, valóban túl kis értékkel akarsz osztani.
    Mutasd a teljes hozzászólást!
  • A tesztponthalmom egy 16mm-es átmérőjő körön 500 pont.

    DX -1.#IND000000000000 double
    DY -1.#IND000000000000 double
    DZ -1.#IND000000000000 double

    Egy breakpont elhelyezése a for ciklusok után ezt hozta nekem.
    Meghatározhatatlan szám lett belőle.
    200 pontnál tökéletesen hozta a középpont értékét.
    Gyanítom, hogy 500 pont ezen az átmérőn túl "sűrű" lett, és a pontok értékeiben lévő kis különbség okozza a hibát.
    Mutasd a teljes hozzászólást!
  • Gyanakvásom jó volt, és köszönöm, hogy mutattál egy ügyes "debug" lehetőséget.
    A nevezőm a t=sz/n esetén nagyon kicsi számmá válik a q=1215285 lépésnél.
    Ennek okát nekem kell megtalálnom, és kitalálnom, hogyan kerüljem el.

    üdv: Jules
    Mutasd a teljes hozzászólást!
  • Na látod!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd