Tangenten bilden mit einem Radius zum Berührungspunkt immer einen rechten Winkel. Wir können also ein rechtwinkliges Dreieck wie in folgender Skizze ansetzen:
Figure:
Ermittlung der Tangentenpunkte aus einer Beobachtungsposition
|
|
entspricht dem Kreisradius mit Betrag
und für ein rechtwinkliges Dreieck gilt:
Die Längen
und
sind Werte aus Formelsammlungen und müssen nicht weiter hergeleitet werden. Der Vektor
hat die Richtung der Verbindungslinie vom Kreismittelpunkt
zum Beobachtungspunkt
, von dem aus die Tangentenschnittpunkte mit dem Kreis berechnet werden sollen.
Die Richtung des Vektors
steht senkrecht dazu.
Um diese Richtung zu ermitteln nützt folgende Überlegung:
Das Skalarprodukt von senkrecht aufeinander stehenden Vektoren ist immer Null.
In 2 Dimensionen bedeutet das:
Der Vektor mit den Komponenten
und
steht immer senkrecht auf
weil das Skalarprodukt immer Null ergibt.
Damit lässt sich die Richtung von
bestimmen.
Die Tangentenpositionen befinden sich an den beiden Punkten
.
Folgende Funktion in Javasript gibt die Beiden Positionen als Liste von zwei Vekoren zurück.
function TANGENTEN(ZENTRUM,RADIUS,BEOBACHTUNGSPUNKT,dst){
dst = dst || [new MatType(3),new MatType(3)] ;
FMINUSP=subtractVectors(BEOBACHTUNGSPUNKT,ZENTRUM);
FMINUSPBETRAGSQUADRAT= lengthSq(FMINUSP);
FMINUSPBETRAG= Math.sqrt(FMINUSPBETRAGSQUADRAT);
q=scaleVector(FMINUSP, RADIUS*RADIUS/FMINUSPBETRAGSQUADRAT);
NORMALE=new MatType(3);
NORMALE[0]=FMINUSP[2]/FMINUSPBETRAG;
NORMALE[1]=FMINUSP[1]/FMINUSPBETRAG;
NORMALE[2]=FMINUSP[0]/FMINUSPBETRAG*-1;
h=scaleVector(NORMALE, RADIUS/FMINUSPBETRAG*Math.sqrt(FMINUSPBETRAG*FMINUSPBETRAG-RADIUS*RADIUS));
dst[0]=addVectors(ZENTRUM, addVectors(q, h) ) ;
dst[1]=addVectors(ZENTRUM, subtractVectors(q, h) ) ;
return dst;
}