我知道如何计算给定半径和距离的圆上点的X / Y位置。这不是我需要计算的。
我需要计算一个圆上的X / Y位置,但是要根据不是该圆心的点和角度来计算。
已知值为:
我正在做的是计算仪表显示的曲线上的线条。线条需要与仪表的针脚平行,但它的枢轴点可能与刻度弧的半径点不同。
它需要使用Javascript并用于绘制HTML5画布对象。
这是一张图片,可以帮助解释我在寻找的内容:
Calc Arcs http://www.sloansweb.com/dl_files/temp/CalcArcs.png
参考图纸,CP1将始终位于具有CP2的圆的内半径内。
编辑:我已经更新了图纸以简化它,只显示CP2周围的一个圆圈。注意,相对于CP2的交叉点的角度是未知的。此外,相对于CP1的交叉点距离未知。
提前致谢!!
答案 0 :(得分:1)
也许这有可能:如果你有半径和圆心,你可以写出你的等式(比如Cr(x))。现在,如果你只有CP2和A1_angle,你可以用角度系数= A1_angle写出从CP2开始的直线方程,这样你就可以在几何上截取某个地方的“交叉点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开始并继续斜率= 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分(因为该行截获了两次圆圈),仅仅是为了选择权利并做你需要的东西。
半径2也是如此第二个圆圈,只是得到半径为2的圆的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。当然,我们知道两个方面和一个角度......也许我们不需要任何其他东西
从理论上讲,我们知道在任何一个三角形中,相反角度的一个方面的一侧是每个边和每个角度的常数。在这种情况下,我们知道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之间添加角度。