abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
Programmierung
Alles über Programmierung in GDL und Python

näherung einer ellipse mit kreisbögen

zzyzx
Newcomer
eine ellipse kann man ja sehr einfach durch strecken eines kreises in nur eine richtung erhalten.
punkte auf einer ellipse erhält man auch ziemlich einfach mit sinus/cosinus
wenn man aber die ellipse aber in gdl als näherung aus kreisbögen haben will, wirds schwerer. kennt jemand vielleicht einen einfachen weg mittels erweiterter statuswerte oder so?
34 ANTWORTEN 34
Anonymous
Nicht anwendbar
Man müsste den/das "missing link" zwischen den Scheitelkrümmungskreisen finden - einen Kreisbogen, der an beiden Scheitelkrümmungskreisen sauber tangential anschliesst und der Ellipsen möglichst nahe kommt.

Mit empirischem probieren ( 2D zeichnen in AC) findet man Lösungen, die ziemlich nahe an eine Ellipse kommen. Eine genaue Ellipse wird das natürlich nicht, aber ohne direkten Vergleich mit der echten Ellipse merkt man das nicht sofort.

Allerdings muss man einen Anfangspunkt auf dem grossen oder kleinen Scheitelkrümmungskreis festlegen. Und je nach Exzentrizität der Ellipse ändert sich das Ganze.
Ich gehe davon aus, das sich schon etliche Spezialisten daran versucht haben.
Gäbe es hier eine mathematisch oder geometrisch halbwegs fassbare Lösung wäre das wohl publiziert.
Vielleicht warten wir doch lieber auf einen neuen GDL-Befehl, mit dem das Problem als Einzeiler gelöst werden kann.
Frank Beister
Advisor
Wir kommen voran. Die Steigung einer Ellipse läßst sich aus folgender geometrischer Abhängigkeit ermitteln:
<img src="http://www.cis.tugraz.at/ig/wresnik/fh/online/vorlesung2/a46.JPG" alt=" - " />
In GDL sollte sich das Lot demnach so darstellen lassen: </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">x=a*cos(alpha)
y=b*sin(alpha)

hotspot2 x,y

beta=asn(y/B)

x1=A/cos(beta) : y1=0
x2=0 : y2=B/sin(beta)

m=-y2/x1*sgn(x) ! Steigung
tau=atn(m)+180*(y<0)

add2 x,y
rot2 tau+90
line2 0,0,0.2,0
del 2Und jetzt brauchen wir noch einen Algorithmus zur Bestimmung des Kreisbogens durch 2 Tangenten und 2 Punkte.

[ 30. September 2004, 11:19: Beitrag editiert von: Frank Beister ]
bim author since 1994 | bim manager since 2018 | author of selfGDL.de | openGDL | skewed archicad user hall of fame | author of bim-all-doors.gsm
zzyzx
Newcomer
ok, das strichlein kommt schön senkrecht zur ellipsenlinie, <dickes-lob>sogar die korrektur für werte über 180° ist drin </dickes-lob>
nur: ich kapiers nicht so ganz (bzw. die parameterbenennung ist mir nicht so ganz klar, ich zähl einfach mal auf, was ich nachvollziehen kann:
A ist die halbe ausdehnung der ellipse in x richtung
B ist die halbe ausdehnung der ellipse in y richtung
alpha ist der winkel, dem dann die werte x und y zugeordnet werden, der punkt x,y liegt auf der ellipsenlinie
... und x1,y1,x2,y2 ???
:confused:
zzyzx
Newcomer
aber für ne 2d-spline reicht das, was wir schon haben allemal:
</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">!mul2 1,b/a
!circle2 0,0,a
!del 1

for i = 10 to 360 step 10
alpha = i
x=a*cos(alpha)
y=b*sin(alpha)

hotspot2 x,y

beta=asn(y/B)

x1=A/cos(beta) : y1=0
x2=0 : y2=B/sin(beta)

m=-y2/x1*sgn(x) ! Steigung
tau=atn(m)+180*(y<0)

put x,y,tau-180
!add2 x,y
!rot2 tau+90
!line2 0,0,0.2,0
!del 2
next i

spline2 (nsp)/3, 1,
get (nsp)
Frank Beister
Advisor
So einfach scheint es dann doch nicht zu sein. Folgendes Skript:
</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">! Parameter definieren oder nächste Zeile ohne "!"
!
! a=4 : b=2 : zzyzx=1

! Punkte ermitteln, merken, Fangpunkte
for i=1 to n
alpha=i*360/n
x=a*cos(alpha) : y=b*sin(alpha)
hotspot2 x,y
put x,y
next i

! Näherungsweise Ausgabe mit Kreisbögen, bestimmt durch die Tangenten in den Teilungspunkten
msk=1 !Polygonzug Statuswert. Für Prisma z.B: 15+64

put use(2)

! Steigung 1. Punkt
x2=get(1) : y2=get(1)
beta=asn(y2/B)
if cos(beta) and sin(beta) then m2=sgn(x2)*(B/sin(beta))/(A/cos(beta)) else m2=0

put x2,y2,msk !Startpunkt
put m2,1,800 !Starttangente


for i=1 to n

! Neuen Punkt aus Stack, letzter wird Ausgangspunkt
x1=x2 : y1=y2 : m1=m2
x2=get(1) : y2=get(1)
x=0 : y=0

! Schnittpunkt der Lote auf die Tangenten in den Punkten 1 und 2
beta=asn(y2/B)
if cos(beta) and sin(beta) then m2=sgn(x2)*(B/sin(beta))/(A/cos(beta)) else m2=0
if m1-m2 then mue=(x2-x1+m2*(y1-y2)) / (m1-m2) else mue=0
x=x1+m1*mue
y=y1+mue

! Lot ausgeben
line2 x2,y2, x2+m2,y2+1 : hotspot2 x2+m2,y2+1

! Tangentialkreis komplett ausgeben
if i=999 then circle2 x,y,sqr((x2-x)^2+(y2-y)^2)

! Mittelpunkt als Kurvenpunkt
put x,y,900+msk
hotspot2 x,y : text2 x,y,i

! 2.Punkt als Kurvenpunkt
put x2,y2,3000+msk

next i

! Ausgabe
poly2_ 2*(n+1), 1 + 4, get(2*(n+1)*3)





! Gestauchte Ellipse als Referenz

if StiftE then

pen StiftE

mul2 1,B/A
circle2 0,0,A
del 1
endifKann man auch hier runterladen: bogenellipse2.zip

Ergibt leider eine deutlich schlechter Annäherung. Ich bin mir im Moment nicht sicher, ob es ein Rundungsproblem/Präzisionsungenauigkeit von AC oder ein Denkfehler im System ist. Meine Vermutung im Moment ist, daß die Tangenten falsch berechnet sind. Denn wenn ich die Lotpunkte verlängere, bekomme ich deren Schnittpunkt korrekt, wie berechnet. Das kann man mit Linien und 'Linien verbinden' bei dem Objekt überprüfen. Doch trifft ein Kreis mit diesem Mittelpunkt und dem Radius zu einem Ellipsenrandpunkt den banchbarten leider nicht genau. Dies ergibt eine Abweichung, die sich offensichtlich kumuliert. 😉
bim author since 1994 | bim manager since 2018 | author of selfGDL.de | openGDL | skewed archicad user hall of fame | author of bim-all-doors.gsm
zzyzx
Newcomer
ja, das ding geht mir auch nicht aus dem kopf,
ich glaube aber inzwischen, dass wir da einen kleinen denkfehler drin haben:
- wenn mein kreisbogen an einem punkt x,y startet, den ich mir vorher mit sin und cos ausgerechtnet habe und von dem ich auch die steigung weiss (bzw. franks formel dreist kopiert habe 😉 😛 hobbymathematiker aller länder, vereinigt euch
Frank Beister
Advisor
Gesetzt den Fall, daß die Methode die Steigung der Ellipse nach der Graphik oben mittels zweier Hilfstangenten zu berechnen richtig ist:

Wir haben 2 Punkte (auf der Ellipse) und 2 Tangenten (in diesen 2 Punkten). Ist ein Kreis damit (a) eindeutig, (b) nicht eindeutig oder (c) überbestimmt. Ich glaube fast, daß er damit überbestimmt ist.

Ist zu prüfen, ob deine Idee mit der Gleichung funktionieren kann.

Erinnern wir uns: Die Programmierer von GS nähern die Ellipse auch nicht mit Kreisen an, deren Übergang stetig ist. 😉
bim author since 1994 | bim manager since 2018 | author of selfGDL.de | openGDL | skewed archicad user hall of fame | author of bim-all-doors.gsm
Anonymous
Nicht anwendbar
Ich weiß nicht, ob Ihr die alte Methode, mit der man Ellipsen zeichnen kann, berücksichtigt habt. Damit lässt sich die Geometrie recht einfach ermitteln und auch die Tangenten lassen sich damit finden: Man nimmt 1 Faden, den man an 2 Fixpunkten (Brennpunkten) befestigt und lässt einen Stift durch eine Schlaufe im Faden gleiten.
Zur Veranschaulich beiligende Skizze:
Die Summe von s+t ist immer gleich, x(die Länge vom Mittelpunkt zum Brennpunkt) ergibt sich aus dem Zirkelschlag vom kurzen Halbradiusende auf die Hauptachse. Die Tangente ist immer senkrecht zur Winkelhalbierenden zwischen s und t.
<img src="http://www.gdl-talk.de/Ellipso.gif" alt=" - " />
Vielleicht hilft das weiter.
zzyzx
Newcomer
@ jochen:
danke für die anmerkungen, möglicherweise ist deine methode zur ermittlung der steigung genauer oder mathematisch einfacher zu ermitteln (die methode von frank mit den zwei projektionen auf die x und y gerade hab ich eh noch nicht so ganz begriffen, zumindest die umsetzung in den gdl text); eventuell kommt man mit weniger trigonometrischen formeln aus, die immer eine gewisse ungenauigkeit beinhalten);
aber das grundproblem mit der gleichung bleibt leider doch bestehen.
:verzweifelt:
zzyzx
Newcomer
... einer geht noch:
eine ganz grobe näherung an die ellipse könnte auch der korbbogen sein, die (ebenfalls etwas undurchsichtige) formel [sieht so aus, als wäre ich etwas aus der übung...]steht im objekt korbbogen drin:
</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">m=a-r1
n=b-r1
c=sqr(m^2+n^2)/2
f=((2*c^2)/n)-n
r2=f+b
alpha=2*asn(c/(f+n))

arc2 0,-f,r2,90-alpha,90
arc2 a-r1,0, r1,0,90-alpha
hotspot2 r2*sin(alpha),r1*cos(alpha)
hotspot2 0,-f
hotspot2 a-r1,0 die kurve ist auf jedenfall schon mal stetig, aber ob alle punkte auf einer ellipse a,b liegen, müsste man erstmal testen; wäre immerhin eine näherung mit kreisbögen mit n = 8
:winken: