我知道如何在给定半径和距离的情况下计算圆点上的X / Y位置。那不是我需要计算的。
我需要计算一个圆上的X / Y位置,但要基于不是该圆的中心的点和角度。
已知值为:
圆心的X / Y坐标。
圆的半径。
第二点的X / Y坐标以及已知角度的中心点。
与第二点的夹角。
我正在做的是在电表显示的弧度刻度上计算线。线必须与仪表的指针平行,但其枢轴点可能与刻度尺圆弧的半径点不同。
它必须使用Javascript,并用于在HTML5画布对象上绘制。
这是一张有助于说明我在寻找什么的图像:
(来源:sloansweb.com)
参考该图,CP1将始终位于CP2的圆的内半径之内。
编辑:我已经更新了图纸以简化它,使其仅显示围绕CP2的一个圆圈。注意,相对于CP2的交叉点的角度是未知的。同样,相对于CP1到交叉点的距离也是未知的。
提前致谢!!
最佳答案
也许可以这样:如果您具有圆的半径和圆心,则可以为此编写方程式(例如Cr(x))。现在,如果只有CP2和A1_angle,则可以编写从CP2开始的线的等式,角度系数= A1_angle,这样您就可以从几何学上在某个地方截取“交叉点1”和“交叉点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开始并以lope = 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也会发生同样的情况,只需获取带有radius2的圆的Cr(x)函数(线保持不变!),然后找出坐标:)
我知道这是一种比您绘制画布所需的数学方式更复杂的方法,但这是我最初想到的。希望我很清楚:)
编辑:
在您的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
角度必须变化多少,所以我更喜欢这种方式,但是我认为进行此更改并不是很复杂。在res_x []中存储交叉点的x值,在res_y []中存储y值。我看到最终它可能会由于我猜想的数学而近似。还有一件事,如您所见,该函数无法处理异常。2编辑:
我想出了第二种解决方案。为了知道所有三角形,我们至少需要3个数据。我们已经有3个三角形ABC的数据!
我们知道A和B在哪里,因此知道它们的距离,我们也知道阿尔法角,因此知道B的整个角度(90°+ alpha),我们知道AC。肯定地,我们知道2个面和一个角度...也许我们不需要其他任何东西。
从理论上我们知道,在任何三角形中,相对角正弦上的一侧对于每个侧面和每个角度都是常数。在这种情况下,我们知道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。
现在我们知道了所有角度和两个侧面。对于最后一个,我们可以应用与上面相同的公式:
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.
现在我们知道了一切,尤其是不列颠哥伦比亚省。
为了从知道C点到B点的距离来检索其坐标,我们可以做一个技巧:
使line(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之间增加角度。
关于javascript - 我需要根据不在中心的点来计算圆弧上的点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36954537/