我知道如何计算给定半径和距离的圆上一个点的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 回答
也许这可能是这样的:如果你有半径和圆心,你可以写出你的等式(比如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代码中尝试这个,希望它正常工作:
那些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数据了!
我们知道A和B在哪里,所以它们的距离,我们知道α角,所以B的所有整个角度(90°alpha)我们都知道AC . 当然,我们知道两个方面和一个角度......也许我们不需要任何其他东西 .
从理论上讲,我们知道在任何一个三角形中,相反角度的一个边上的一个边是每个边和每个角的常数 . 在这种情况下,我们知道AC(它是半径)和B_angle(它是90度加上你的值alpha),所以
AC/sin(alpha+pi/2)
等于AB/sin(C_angle)
,再等于BC/sin(A_angle)
. 制定一些等式:所以
和
现在,如果我们知道C_angle和alpha,我们可以计算A_angle,因为三角形中所有3个角的总和为180° . 所以A_angle = 180°-alpha-C_angle . 现在我们知道所有角度和2个方面 . 对于最后一个,我们可以应用与上面相同的公式:
选择你喜欢的并检索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之间添加角度 .