首页 文章

我需要根据一个不在它中心的点来计算弧上的一个点

提问于
浏览
1

我知道如何计算给定半径和距离的圆上一个点的X / Y位置 . 这不是我需要计算的 .

我需要计算一个圆上的X / Y位置,但是基于不是该圆心的点和角度 .

已知值为:

  • 圆心的X / Y坐标 .

  • 圆的半径 .

  • 第二个点的X / Y坐标和已知角度的中心点 .

  • 第二点的角度 .

我正在做的是计算仪表显示的曲线上的线条 . 线必须与仪表的针平行,但它的枢轴点可能与刻度弧的半径点不同 .

它需要在Javascript中,并用于绘制HTML5画布对象 .

这是一张图片来帮助解释我在寻找的东西:

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

参考图纸,CP1将始终位于具有CP2的圆的内半径内 .

EDIT: 我更新了图纸以简化它,只显示CP2周围的一个圆圈 . 注意,相对于CP2的交叉点的角度是未知的 . 而且,到交叉点相对于CP1的距离是未知的 .

提前致谢!!

1 回答

  • 1

    也许这可能是这样的:如果你有半径和圆心,你可以写出你的等式(比如Cr(x)) . 现在,如果你只有CP2和A1_angle,你可以用角度系数= A1_angle写出从CP2开始的直线方程,这样你就可以在几何上截取"Crossing Point 1 "和" Crossing Point 2 "某处,用线方程找出坐标或者还有Cr(x) .
    更有说服力:
    1) Cr(x) := (x-CP2.x)^2+(y-CP2.y)^2=radius1^2 ,其中x,y,变量和CP2.x,CP2.y是CP2的x坐标和y坐标 .
    2)然后你必须找出从CP1开始并继续斜率= A1的行的功能: y=tan(A1)*x+b ,带 b = CP1.y-tan(A1)*CP1.x
    3)使这两个函数相互拦截,以便找到它们共有多少个点(不超过2个!):
    { Cr(x) AND y=tan(A1)*x+b } . 在这里你必须替换y变量(我认为这种方式比替换x变量更简单...你选择)并使方程等于0 .
    ((x-CP2.x)^2+(tan(A1)*x+b-CP2.y)^2 - radius1^2=0
    如果你已经完成了权利,你必须在最后得到2分(因为该行截获了两次圆圈),仅仅是为了选择权利并做你需要的事情 .
    第二个圆圈的radius2也是如此,只是得到半径为2的圆的Cr(x)函数(线保持不变!)并找出坐标:)
    我知道这是一种数学上更复杂的方式,也许比绘制画布所需的方式更复杂,但这首先是我的想法 .
    希望我很清楚:)

    EDIT:
    在你的javascript代码中尝试这个,希望它正常工作:

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

    那些console.logs在调试时应该很有用,所以我离开了它们 .
    角度是以度为单位,我实现了对梯度的隐式切换,并以默认方式计算(关于梯度) . 我不知道你的 A1 角度有多大变化,所以我更喜欢这种方式,但我认为's not very complicated to make this change. In res_x[] are stored the x-values of your crossing points and in res_y[] the y-values. I saw that eventually it could make some approximations caused of the maths I suppose. One more thing, the function as you can see doesn't处理异常 .

    2 EDIT:
    我想出了第二个解决方案 . 要了解所有三角形,我们至少需要3个数据 . 我们已经有3个三角形ABC数据了!
    image of the situation

    我们知道A和B在哪里,所以它们的距离,我们知道α角,所以B的所有整个角度(90°alpha)我们都知道AC . 当然,我们知道两个方面和一个角度......也许我们不需要任何其他东西 .
    从理论上讲,我们知道在任何一个三角形中,相反角度的一个边上的一个边是每个边和每个角的常数 . 在这种情况下,我们知道AC(它是半径)和B_angle(它是90度加上你的值alpha),所以 AC/sin(alpha+pi/2) 等于 AB/sin(C_angle) ,再等于 BC/sin(A_angle) . 制定一些等式:

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

    所以

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

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

    现在,如果我们知道C_angle和alpha,我们可以计算A_angle,因为三角形中所有3个角的总和为180° . 所以A_angle = 180°-alpha-C_angle . 现在我们知道所有角度和2个方面 . 对于最后一个,我们可以应用与上面相同的公式:

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

    选择你喜欢的并检索BC . 现在我们有:

    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.
    

    我们现在知道一切,尤其是卑诗省 . 为了从知道它与B的距离来检索C点的坐标,我们可以做一个技巧:
    使线(x)方程从B开始并以tan(alpha)的斜率运行,并且知道从B到C的距离,我们可以以这样的方式检索C的X / Y坐标:
    C.x= BC*cos(alpha)
    C.y= line(x+BC*cos(alpha)) 你去吧 .
    我发现这个过程比我建议你的其他过程简单得多,而且用JS编写它可能要容易得多 . 这一直有效,直到B点位于A的同一轴上 . 如果B点移动,B_angle coudl会发生很大的变化,而不是增加90°,你应该在A和B之间添加角度 .

相关问题