Genauigkeit für Poligon Elipse
-
Hallo,
hab ein kleines Algorithmisches Problem beim erzeugen einer Elipse.
Ich will beim erstellen einer Elipse eine gleichbleibende genauigkeit erreichen.derzeit erzeuge ich die Elipse so:
double a= RoundTo((Quadrat.Right-Quadrat.Left)/2,0); double b= RoundTo((Quadrat.Bottom-Quadrat.Top)/2,0); //Startpunkt PolKreis->resize(PolKreis->size()+1); (*PolKreis)[PolKreis->size()-1].x=Quadrat.Left+a; (*PolKreis)[PolKreis->size()-1].y=Quadrat.Top; // Rechte Kreisseite erzeugen for(int i=-b ;i<= b;i++) { PolKreis->resize(PolKreis->size()+1); (*PolKreis)[PolKreis->size()-1].x=Quadrat.Left+a+Sqrt((pow(a,2)- (pow(a,2) * pow((double)i,2))/ pow(b,2))); (*PolKreis)[PolKreis->size()-1].y=Quadrat.Top+b+i; } // Linke Kreisseite erzeugen for(int i=b ;i>= -b;i--) { PolKreis->resize(PolKreis->size()+1); (*PolKreis)[PolKreis->size()-1].x=Quadrat.Left+a-Sqrt((pow(a,2)- (pow(a,2) * pow((double)i,2))/ pow(b,2))); (*PolKreis)[PolKreis->size()-1].y=Quadrat.Top+b+i; }Quadrat enthält die Abmaße im Koordiantensystem
der schleifenzähler i erzeugt die Genauigkeit der Elipse. Problem ist je größer meine Geometrie ist, desto mehr Punkte werden auch erzeugt.
Ich würde gerne die Genauigkeit gerne so einstellbar machen das man unabhängig von der größe immer gleichbleibende anzahl an Punkten hat.Hat jemand ne Idee wie ich das anstelle? Ich zerbrech mir schon seit stunden den Kopf darüber.
-
Ich bin mir nicht sicher, ob ich dich richtig verstanden habe, aber meinst du einfach das hier?
double a= irgendein_größenunabhängiger_wert; double b= irgendein_größenunabhängiger_wert;Wobei ich allerdings nicht verstehe, wieso du die Punktezahl überhaupt als double speicherst.
Und den Rest des Codes würde ich an deiner Stelle nochmal überarbeiten. Insbesondere guck dir mal an, wie man mit dynamischen Containern arbeitet, ich glaube, du hast da was falsch verstanden...
-
Das ist nur ein Auszug aus meinem Quelltext.
Optimieren kann ich den wenn er funktioniert.Grundlage ist die Ellipsengleichung x2/a2 + y2/b2 =1
wobei a der Radius auf X-Achse und b der Radius auf Y Achse ist.
-
JBOpael schrieb:
Das ist nur ein Auszug aus meinem Quelltext.
Optimieren kann ich den wenn er funktioniert.Grundlage ist die Ellipsengleichung x2/a2 + y2/b2 =1
wobei a der Radius auf X-Achse und b der Radius auf Y Achse ist.Oh, hatte gar nicht gesehen, dass a und b auch nochmal in den for-Schleifen vorkommen. Dann passt das ja schon mit dem double. In dem Fall kann man das aber trotzdem leicht auf eine feste Punktmenge umschreiben:
for(double i=-b ;i<= b; i+= 2*b/anzahl_Punkte) { [...] } for(double i=b ;i>= -b; i-= 2*b/anzahl_Punkte) { [...] }
-
an sowas habe ich auch gedacht, aber das ist nicht so ganz was ich mir vorgestellt habe.
nachdem ich noch ein wenig gesucht habe habe ich eine formel gefunden die nicht nur kleiner ist, sondern auch noch mein problem der Präzision erledigt.
for(double i=-90;i<=270; i=i+0.1) { PolKreis->resize(PolKreis->size()+1); (*PolKreis)[PolKreis->size()-1].x=Quadrat.Left+a+(a*cos(i*M_PI/180.0)); (*PolKreis)[PolKreis->size()-1].y=Quadrat.Top+b+(b*sin(i*M_PI/180.0)); }trotzdem danke für deine Hilfe.