2016-04-30 15 views
1

Ich weiß, wie man die X/Y-Position eines Punktes auf einem Kreis bei einem Radius und einer Entfernung berechnet. Das muss ich nicht berechnen.Ich muss einen Punkt auf einem Bogen basierend auf einem Punkt berechnen, der nicht in der Mitte liegt

Ich muss die X/Y-Position auf einem Kreis berechnen, aber basierend auf einem Punkt und Winkel, der nicht der Mittelpunkt des Kreises ist.

Die bekannten Werte sind:

  • Die X/Y von der Mitte des Kreises koordinieren.
  • Der Radius des Kreises.
  • Die X/Y-Koordinate des zweiten Punktes und der Mittelpunkt des bekannten Winkels.
  • Der Winkel vom zweiten Punkt.

Was ich mache, ist die Berechnung von Linien auf einer gebogenen Skala für eine Meteranzeige. Die Linien müssen parallel zur Nadel des Messgeräts sein, aber der Drehpunkt muss nicht mit dem Radiuspunkt des Skalenbogens übereinstimmen.

Es muss in Javascript vorhanden sein und wird beim Zeichnen auf einem HTML5-Canvas-Objekt verwendet.

Hier ist ein Bild erklären zu helfen, was ich suche:

Calc Arcs http://www.sloansweb.com/dl_files/temp/CalcArcs.png

Bezug auf die Zeichnung, CP1 wird immer mit CP2 innerhalb des inneren Radius des Kreises sein.

EDIT: Ich habe die Zeichnung aktualisiert, um es zu vereinfachen, zeigt nur einen Kreis um CP2. Beachten Sie, dass der Winkel zum Kreuzungspunkt relativ zu CP2 unbekannt ist. Auch die Entfernung zum Kreuzungspunkt relativ zu CP1 ist unbekannt.

Vielen Dank im Voraus!

Antwort

1

Vielleicht ist es auf diese Weise möglich: Wenn Sie den Radius und die Mitte des Kreises haben, können Sie Ihre Gleichung dafür schreiben (sagen wir Cr (x)). Nun, wenn Sie nur CP2 und A1_angle haben, können Sie die Gleichung einer Linie beginnend bei CP2 mit einem Winkelkoeffizienten = A1_angle schreiben, so dass Sie geometrisch den "Crossing Point 1" und "Crossing Point 2" irgendwo abfangen können, Koordinaten mit der Liniengleichung oder auch mit Cr (x) herausfinden.
Praktischer ausgedrückt: 1) Cr(x) := (x-CP2.x)^2+(y-CP2.y)^2=radius1^2 mit x, y, Variablen und CP2.x, CP2.y die X-Koordinate und Y-Koordinate von CP2.
2) Dann müssen Sie herausfinden, was die Funktion der Linie beginnend mit CP1 und geht mit Steigung = A1: y=tan(A1)*x+b, mit b = CP1.y-tan(A1)*CP1.x
3) Machen Sie diese beiden Funktionen einander abfangen, um zu finden, wie viele Punkte sie haben gemeinsam (nicht mehr als 2!):
{ Cr(x) AND y=tan(A1)*x+b }. Hier müssen Sie die y-Variable ersetzen (ich denke, dieser Weg ist einfacher als die x-Variable ... Sie wählen) und die Gleichung gleich 0 machen.
((x-CP2.x)^2+(tan(A1)*x+b-CP2.y)^2 - radius1^2=0
Wenn Sie Rechte gemacht haben, müssen Sie bei Das Ende 2 Punkte (weil die Linie den Kreis zweimal abfängt), nichts mehr zu sagen, nur um die Rechte zu wählen und zu tun, was Sie brauchen.
Das selbe passiert mit Radius2 für den zweiten Kreis, erhalte nur die Funktion Cr (x) für den Kreis mit Radius2 (die Linie bleibt gleich!) und finde die Koordinaten :)
Ich weiß, es ist ein mathematischer Weg, und komplex vielleicht, als das, was Sie brauchen, um eine Leinwand zu zeichnen, aber das kam mir zuerst in den Sinn.
hoffe, ich war klar :)

EDIT:
Versuchen Sie dies in Ihrem JavaScript-Code, hoffe, es funktioniert einwandfrei:

function GetPoints(Center_x, Center_y, Radius, CP1_x, CP1_y, angle){ 
    var a=Center_x; 
    var b=Center_y; 
    var c=CP1_x; 
    var d=CP1_y; 
    var TAN=Math.tan((2*Math.PI*angle)/360); 

    var res_x= []; 
    var res_y= []; 

    if(angle!=90 && angle!=180 && angle!=270 && angle!=360){ 
    res_x[0]= ((2*TAN*TAN*c+2*b*TAN-2*d*TAN+2*a) + 
      Math.sqrt( 
       -2*c*TAN*TAN-2*b*TAN+2*d*TAN-2*a - (4*TAN*TAN + 4)*(c*c*TAN*TAN-2*c*d*TAN+2*c*b*TAN-2*d*b+d*d+b*b-Radius*Radius+a*a) 
       ) 
      )/(2*TAN*TAN+2); 

    res_x[1]= ((2*TAN*TAN*c+2*b*TAN-2*d*TAN+2*a) - 
      Math.sqrt( 
       -2*c*TAN*TAN-2*b*TAN+2*d*TAN-2*a - 4*(TAN*TAN + 1)*(c*c*TAN*TAN-2*c*d*TAN+2*c*b*TAN-2*d*b+d*d+b*b-Radius*Radius+a*a) 
       ) 
      )/(2*TAN*TAN+2); 

    res_y[0]= TAN*res_x[0]+d-TAN*c; 
    res_y[1]= TAN*res_x[1]+d-TAN*c; 

} 
else{ 
    res_y[0]= b + 
    Math.sqrt(
     -c*c+2*c*a-a*a+Radius*Radius 
     ); 

    res_y[1]= b - 
    Math.sqrt(
     -c*c+2*c*a-a*a+Radius*Radius 
     ); 
    } 
    res_x[0]=res_x[1]=c; 


    console.log("x0= "+res_x[0]+ "\nx1= "+res_x[1]+"\n"); 
    console.log("y0= "+res_y[0]+ "\ny1= "+res_y[1]+"\n"); 


} 


Those console.logs nützlich sein sollte, wenn das Debuggen, also habe ich sie verlassen.
Winkel ist in Grad, ich habe eine implizite Umstellung auf Absolventen implementiert und wird auf die Standard-Weise (in Bezug auf Absolventen) berechnet. Ich wusste nicht, wie stark Ihr Winkel variieren muss, also habe ich diesen Weg bevorzugt, aber ich denke, es ist nicht sehr kompliziert, diese Änderung vorzunehmen. In res_x [] sind die x-Werte Ihrer Kreuzungspunkte und in res_y [] die y-Werte gespeichert. Ich sah, dass es irgendwann Annäherungen an die Mathematik geben könnte, die ich vermute. Noch eine Sache, die Funktion, wie Sie sehen können, behandelt Ausnahme nicht.

2 EDIT:
Ich kam mit einer zweiten Lösung. Um ein Dreieck zu kennen, benötigen wir mindestens 3 Daten. Und wir haben bereits 3 Daten unseres Dreiecks ABC!

Wir wissen, wo A und B sind, und so ihre Entfernung, wir kennen den Alpha-Winkel und so den ganzen Winkel von B (90 ° + Alpha) und wir kennen AC. Definitiv kennen wir zwei Seiten und einen Winkel ... vielleicht brauchen wir nichts anderes.
Aus der Theorie wissen wir, dass in einem beliebigen Dreieck, eine Seite über Sünde des entgegengesetzten Winkels eine Konstante mit jeder Seite und jedem Winkel ist. In diesem Fall wissen wir AC (es ist der Radius) und B_angle (es ist 90 Grad plus Ihr Wert alpha), so AC/sin(alpha+pi/2) ist gleich AB/sin(C_angle), das ist wieder gleich BC/sin(A_angle). machen einige Gleichung:

AC/sin(alpha+90°)=AB/sin(C_angle) 

so

sin(C_angle)=AB*sin(alpha+90°)/AC 

und

C_angle= arcsin (AB*sin(alpha+90°)/AC) 

Wenn wir nun C_angle und Alpha kennen, können wir A_angle berechnen, da Summe aller drei Winkel in einem Dreieck macht 180 °. Also A_angle = 180 ° -α-C_angle. Jetzt kennen wir alle Winkel und 2 Seiten. Für die letzte können wir die gleiche Formel wie oben anwenden:

BC/sin(A_angle)=AC/sin(alpha+90°)=AB/sin(C_angle) 

Wählen Sie, was Sie bevorzugen und BC abrufen. Jetzt haben wir:

AC=radius; 
AB= known with coordinates; 
BC= retrieved from previous relations 
B_angle= alpha + 90° 
A_angle and C_angle= retrieved from previous relations as for BC. 

Wir wissen jetzt alles, insbesondere vor Christus. Um die Koordinaten des C-Punktes aus seiner Entfernung von B abzufragen, könnten wir einen Trick machen:
Machen Sie eine (x) Gleichung, die von B beginnt und mit der Steigung von tan (alpha) und der Entfernung von B nach C geht kann X/Y Koordinaten von C auf folgende Weise abrufen:
C.x= BC*cos(alpha)
C.y= line(x+BC*cos(alpha)) Und los gehts.
Ich fand diesen Prozess viel einfacher als die andere, die ich Ihnen vorgeschlagen habe, und vielleicht könnte es viel einfacher in JS zu kodieren. Dies funktioniert, bis B Punkt auf der gleichen Achse von A steht. Wenn B Punkt umher bewegt wird, ändert sich die B_angle Kurve sehr, und anstatt 90 ° addieren Sie den Winkel zwischen A und B.

+0

Hinweis der 'A1' des Autors ist ein Winkel, also ist deine Steigung Tan (A1) – MBo

+0

Danke Pippo, aber der Winkel ist relativ zu CP1. Ihre Lösung könnte funktionieren, außer ich kann nicht herausfinden, wie es in JS-Code –

+0

übersetzen würde Sorry für den Winkel, ich habe mich geirrt. Bewegen sich die Kreuzungspunkte entlang des Kreises oder befinden sie sich irgendwo? – pippo

Verwandte Themen