Pieter wrote:
> Für den Kreis um Punkt A kann die Position zu C mit sin/cos und der
> Stecke C_D berechnet werden.
sin/cos
Du übertreibst.
Wenn du einen Verktor hast, zb den Vektor C_D, mit den Komponenten
C_Dx und C_Dy, dann hat ein dazu senkrechter Vektor die
Komponenten -C_Dy, C_Dx
Diesen Vektor normierst du (bringst ihn auf Einheitslänge) und
skalierst ihn mit dem gewünschten Kreisradius. Diesen neuen
Richtungsvektor zum ursprünglichen Positionsvektor C addiert
ergibt den Mittelpunkt des Kreises A
C_D.x = D.x - C.x
C_D.y = D.y - C.y
Perp.x = -C_D.x
Perp.y = C_D.y
Len = sqrt( Perp.x * Perp.x + Perp.y * Perp.y )
Perp.x = Perp.x / Len * r
Perp.y = Perp.y / Len * r
KreisA.x = C.x + Perp.x
KreisA.y = C.y + Perp.y
Macht man sich eine schöne Vektor Datenstruktur mit ein
paar Hilfsfunktionen (für Addition etc.) oder in C++ eine
schöne Vektor Klasse, dann kann (im Falle von C++) die
ganze Berechnung so aussehen:
KreisA = C + ( D - C ).Perpendicular().Normalize() * r;
> Wie aber berechne ich nun Punkt B?
> Dieser Punkt liegt auf der Winkelhalbierenden C_D_E und jeweils lotrecht
> mit Abstand R zu den Strecken.
> Das C_D eine Senkrechte ist, ist eigendlich auch ein Spezialfall, die
> Gleichung sollte davon unabhängig sein.
Ist sie auch.
Der Mittelpunkt des Kreises liegt auf dem Schnittpunkt
der Geraden, die im Abstand r jeweils parallel zu den original
Geraden liegen.
Da es zu jeder Geraden 2 dazu parallele Geraden mit einem
bestimmten Abstand gibt, gibt es insgesamt 4 solcher Schnittpunkte
und daher gibt es auch 4 Kreise, die die beiden Geraden (wenn sie
unendlich lang wären) berühren.
Aber im Grunde läuft es auf die Berechnung des Schnittpunkts
2-er Geraden hinaus.
Persönlich bin ich der Meinung, dass Winkelfunktionen überbewertet
werden. Mit ein wenig nachdenken und einem rechten Winkel kommt man
sehr oft sehr gut ohne sie aus. Schon alleine deswegen, weil dann
oft viele Spezialfälle (die zb beim Tangens in Unendlich oder bei
den anderen beiden in eine böse 0 die bei Divisionen stört, ausarten)
wegfallen.