2017-08-04 6 views
0

Ich habe einen Kreisbogen, der die beiden Winkel enthält. Ich kenne nur den Winkel-1 und seine Position (x1, y1) und Winkel-2 Position (x2, y2). Aber ich weiß nicht den Winkel-2, Mittelposition und Radius usw.So finden Sie den zweiten Winkel des Bogens

Bitte beachten Sie das Bild unten für meine Anforderung. enter image description here

Ist es möglich, den Angle-2-Wert zu finden. Bitte schlagen Sie mir die Formel vor, um die Lösung zu finden.

Danke, Bharathi.

+0

Ist '(x1, y1)' immer auf der x-Achse? Auch ist '(x2, y2)' immer auf dem Kreis? – arbuthnott

+0

Sie kennen die Position von Winkel 2, aber Sie kennen Winkel 2 nicht? Meinst du, dass du den zweiten Endpunkt kennst? – meowgoesthedog

+0

@meowgoesthedog ja .. ich kenne nur den zweiten Endpunkt .. – Bharathi

Antwort

2

verlassen hat. MBO Antwort kann wie folgt geschrieben wird

x1 gegeben, y1 und x2, y2 und einen Winkel a von einem unbekannten Zentrum bis zu dem Punkt x1, y1 die Mitte des Kreises finden und den Winkel angle von x2, y2 zum Zentrum Punkt.

mx = (x2 - x1)/2; 
my = (y2 - y1)/2; 
u = (cos(a) * my - sin(a) * mx)/(cos(a) * mx + sin(a) * my); 
t = (my - mx * u)/sin(a); 

Der Mittelpunkt des Kreises ist

cx = x1 + cos(a) * t; 
cy = y1 + sin(a) * t; 

Der Winkel von x2, y2 zum Mittelpunkt ist

angle = a + atan(u) * 2; 

Hinweis als MBO darauf hingewiesen, dass nicht alle Werte für x1 , y1, x2, y2 und a haben eine gültige Lösung.

const ctx = canvas.getContext("2d"); 
 

 
canvas.width = 400; 
 
canvas.height = 400; 
 

 
function test (a,a1){ 
 

 
    r = 100; 
 
    cx = 200; 
 
    cy = 200 
 
    x1 = cx + Math.cos(a) * r; 
 
    y1 = cy + Math.sin(a) * r; 
 

 
    // use a test angle x2,y2 
 
    x2 = cx + Math.cos(a1) * r; 
 
    y2 = cy + Math.sin(a1) * r; 
 

 
    mx = (x2 - x1)/2; 
 
    my = (y2 - y1)/2; 
 

 
    u = (Math.cos(a) * my - Math.sin(a) * mx)/(Math.cos(a) * mx + Math.sin(a) * my); 
 
    t = (my - mx * u)/Math.sin(a); 
 
    
 
    u = Math.atan(u)*2; 
 

 
    // use calculated angle and radius to get the center point from x2,y2 
 
    cx = x2 - Math.cos(a + u) * t; 
 
    cy = y2 - Math.sin(a + u) * t; 
 
    
 
    
 
    ctx.clear(); 
 

 
    // draw line from center to x1,y1 
 
    ctx.line(cx,cy,x1,y1); 
 
    
 
    // draw cross for calculated center and draw circle using calculated radius 
 
    ctx.cross(cx,cy,2,"blue"); 
 
    ctx.strokeCircle(cx,cy,Math.abs(t)) 
 
    // draw line from calculated center to x2,y2 
 
    ctx.line(cx,cy,x2,y2,2,"red"); 
 
    
 
    // draw starting points 
 
    ctx.cross(cx,cy,2); 
 
    ctx.cross(x1,y1); 
 
    ctx.cross(x2,y2); 
 

 
} 
 

 
var angle = 0; 
 
var angle2 = 0; 
 
function update(timer){ 
 
    angle += 0.01; 
 
    angle2 += 0.02; 
 
    test(angle,angle2); 
 
    requestAnimationFrame(update); 
 
} 
 
requestAnimationFrame(update); 
 

 

 

 
// Some render functions to display the result. 
 
ctx.strokeCircle = function(x,y,r){ 
 
    ctx.beginPath(); 
 
    ctx.moveTo(x + r,y); 
 
    ctx.arc(x,y,r,0,Math.PI * 2); 
 
    ctx.stroke(); 
 
} 
 
ctx.line = function(x,y,xx,yy,w=1,col="black"){ 
 
    ctx.lineWidth = w; 
 
    ctx.strokeStyle = col; 
 
    ctx.beginPath(); 
 
    ctx.moveTo(x,y); 
 
    ctx.lineTo(xx,yy); 
 
    ctx.stroke();   
 
} 
 
ctx.cross = function(x,y,w=1,col="black",size = 5){ 
 
    ctx.line(x-size,y-size,x+size,y+size,w,col); 
 
    ctx.line(x+size,y-size,x-size,y+size,w,col); 
 
} 
 
ctx.clear = function(){ 
 
    ctx.clearRect(0,0,canvas.width,canvas.height); 
 
}
canvas { border : 2px solid black; }
<canvas id="canvas"></canvas>

+0

die angegebene Lösung funktioniert nicht für mich. Geige Link: https://jsfiddle.net/pcfkjLg1/. Ich erstelle lin vom ersten Kreis 0 Winkel bis 270. Und bitte beachten Sie, der zweite Kreis centerX Wert ist immer gleich der ersten Kreis 0 Grad X Position – Bharathi

+0

Der zweite Kreis sollte die 0 Grad und 270 Grad des ersten Kreises berühren. – Bharathi

+0

@Bharathi Sie haben einige Fehler in Ihrem Code. Sie müssen sicherstellen, dass alle Winkel im Bogenmaß sind. Sie berechnen 'u' mit 'a = 90' sollte es sein '(Math.PI/2)' es gibt auch einige andere logische Fehler, das Zentrum '(cx, cy)' ist '(50,100)' und aber du setze 'x1, y1' auf' (100,100) 'und der Winkel wie 90, aber von' (50,100) 'zu' (100,100) 'ist 0 Grad nicht 90. Die Antwort funktioniert Ich habe es gründlich getestet und habe es nur noch einmal getestet wenn es einen Tippfehler gibt. Ich werde eine JS-Demo hinzufügen, wenn ich eine Chance bekomme. – Blindman67

0

Soweit ich das Problem verstehe:
Sie haben Punkt (x1, y1), der auf einem Kreis liegt und Radius zu diesem Punkt bildet Winkel Fi. Und Sie haben einen anderen Punkt (x2, y2), der auf demselben Kreis liegt. enter image description here

So wissen wir Richtung Zentrum vom ersten Punkt

u = (-sin(fi), -cos(fi)) 

und senkrecht zur Mitte des Segments zwischen zwei Punkten ist die Linie auch durch die Mitte. Beachten Sie, dass nicht alle Positionen von Punkt 2 eine Lösung bieten.

So haben Sie Parametergleichung der ersten Zeile

x = x1 - cos(fi) * t  //eqs 1 
y = y1 - sin(fi) * t 

und für die zweite Zeile

base point 
mx = (x1 + x2)/2 
my = (y1 + y2)/2 
direction vector 
dx = (-y2 + y1)/2 
dy = (x2 - x1)/2 

Die Parametergleichung

x = mx + dx * u //eqs 2 
    y = my + dy * u 

Gleichungssystem lösen

x1 - cos(fi) * t = mx + dx * u 
    y1 - sin(fi) * t = my + dy * u 

für Unbekannten t, u, und Sie werden Schnittpunkt C finden - die Lösung offen wie die gegebene Antwort Mittelpunkt des Kreises, der Art, wie nicht jeder weiß, wie zu lösen simultane Gleichungen

+0

Die angegebene Lösung funktioniert nicht für mich. Geige Link: https://jsfiddle.net/pcfkjLg1/. Ich erstelle eine Linie vom ersten Winkel des Kreises 0 bis 270. Und beachten Sie, dass der zweite Kreis centerX-Wert immer gleich der ersten Kreis 0-Grad X-Position ist. Der zweite Kreis sollte die 0 Grad und 270 Grad des ersten Kreises berühren – Bharathi

+0

'Lösung funktioniert nicht für mich' - Es ist, weil Ihre Frage ziemlich vage ist und die Kraft meiner Kristallkugel nicht ausreichte. – MBo

Verwandte Themen