Kreisberechnungen bei großen Werten/Radien
-
Irgendwie stehe ich gerade auf dem Schlauch.
Ich habe unterschiedliche Kreise, definiert durch Mittelpunkt und Radius. In der Darstellung versagt Motif bei hohen Zahlen anscheinend. Ich weiß jetzt nicht genau ob es an der Ungenauigkeit dank hoher Zahlen kommt oder ob Motif mich einfach nicht mag.
Daher überlege ich gerade, ob es eine Möglichkeit gibt diese Zahlen zu umgehen und dennoch vernünftig Kreise zu zeichnen.
Beispielszahlen:
x = -6147066
y = 107000
Radius = 6.14484e^06Das sind dabei Bildschirmkoordinaten. Ein Teil des Kreises müsste zu sehen sein.
Probleme gibt es schon bei:
x = -40350
y = 1130
Radius = 40966Mein (Linux-)Taschenrechner bestätigt die Ergebnisse, daher gehe ich mal davon aus das die so stimmen.
EDIT: Kurz gefragt: Gibt es irgend welche Algorithmen mit denen besser Kreisausschnitte angezeigt werden können?
-
Weiß jetzt nicht genau, wie du das meinst. Willst du z. B. den Kreis auf deinem Bildschirm 1280x1024 ausgeben lassen?
(x + 6147066)^2 + (y - 107000)^2 = (6.14484e06)^2
Randbedingungen:
0 <= x <= 1280
0 <= y <= 1024y = srqt[(6.14484e06)^2 - (x + 6147066)^2] + 107000
Für x zwischen 0 und 1280 berechnen und schauen, ob die zweite Bedingung erfüllt ist.
-
Ich dachte eher an so etwas wie "Ein Ausschnitt vom Kreis mit den Parametern x,y läßt sich auch als Ellipse mit den (kleineren) Werten b,n,m darstellen".
Da es auch auf Geschwindigkeit und Antialiasing ankommt, ist es vorzuziehen vorhandene Zeichenroutinen von Motif zu verwenden.
-
Ich unterstelle mal, dass Bildschirmkoordinaten Pixelkoordinaten sind. Bei einer Bildschirmgröße von z.B. 1280x1024 entartet der Kreisausschnitt fast zu einer Geraden. Du kannst das dann sehr gut als Parabel approximieren.
Die Rechnung sieht in etwa so aus:
- Bestimme die Gerade durch Kreismittelpunkt und Mittelpunkt des Fensters.
- Bestimme den Punkt auf der Geraden, der vom Kreismittelpunkt so weit weg ist wie der Radius
-> Scheitelpunkt der Geraden S (611,3 / 512,4) bei dem zweiten Zahlenbeispiel
- Die Senkrechte auf der Geraden normiert zu 1 ist die Richtung der Parabel r ( 0,01508 / 0,99989 ) (Einheitsvektor)
- Die Senkrechte darauf ist der nach rechts gedrehte Vektor t; hier ( -0,99989 / 0,01508 )
- Berechne nun für eine Handvoll X-Koordinaten (bezogen auf die Parabel) einige Punkte
P = S + x * r + (x*x/(2*Radius)) * t; x e [-Fensterbreite/2, +Fensterbreite/2].. und zeichne das Polygon durch diese Punkte.
Gruß
Werner
-
Das ist schon einmal eine gute Idee. Werde ich ausprobieren, wenn ich dafür wieder Zeit habe. Wieso müssen die Kollegen eigentlich immer wieder mit anderem Kram kommen bevor man fertig ist?
