如何找到弧的第二个角度

时间:2017-08-04 10:21:06

标签: javascript c# math geometry trigonometry

我有一个包含两个角度的圆弧。我只知道Angle-1和它的位置(x1,y1)和Angle-2位置(x2,y2)。但我不知道Angle-2,中心位置和半径等。

请参考下面的图片了解我的要求。 enter image description here

是否可以找到Angle-2值。请建议我找到解决方案的公式。

谢谢, Bharathi。

2 个答案:

答案 0 :(得分:2)

由于给定的答案使解决方案开放,因为不是每个人都知道如何解决联立方程。 MBo的答案可以写成如下

从{1}},x1y1x2以及从未知中心到点y2的角度a,{{ 1}}找到圆的中心和从x1y1到中心点的角度angle

x2

圆圈的中心点是

y2

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); cx = x1 + cos(a) * t; cy = y1 + sin(a) * t; 到中心点的角度为

x2

请注意,正如MBo指出的那样,并非y2angle = a + atan(u) * 2; x1y1x2的所有值都有一个有效的解决方案。



y2

a

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);
}




答案 1 :(得分:0)

据我了解这个问题:
您有一个位于圆上的点(x1,y1),此点的半径形成角度Fi。你有另一个点(x2,y2)位于同一个圆圈上。 enter image description here

所以我们知道从第一点到中心的方向

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

并且垂直于两点之间的段的中间也是穿过中心。请注意,并非所有第2点的位置都能给出解决方案。

所以你有第一行的参数方程

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

和第二行

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

其参数方程

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

解决方程式系统

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

对于未知数t,u,你会发现交点C - 圆心