一起移动后找到点相对于线的新相对位置
Finding the new relative position of a point against the line after moved together
我正在开发绘图应用程序。我将主要问题概括为一个小场景:
用户绘制线 A1-B1 和点 M1。现在用户将线 A1-B1 移动到新位置 A2-B2,同时点 M1 也应随线移动(如刚体)。如何计算M2点的新位置?
我知道有可能对直线或圆的连线进行复杂的计算,并最终确定新点是在直线 (this question) 的右侧还是左侧等。但是因为我想重新计算拖动的任何步骤,我想应该有一个所有建模软件都使用的快捷方式和轻量级解决方案。真的有比直线连词或圆连词更快捷的公式吗?
为了再次总结问题,我正在寻找具有给定 A1、B1、A2、B2、M1 的光函数并寻找 M2 位置(x 和 y 的两个单独公式)
M2 = f(A1,B1,A2,B2,M1)
我的猜测:我认为找到中心和旋转角度是最好的选择之一,但我再次不知道是否有一个 shotcut 函数可以找到它们.
编辑: 我更喜欢在在线网站上实现它,所以如果有现成的 javascript 库,那将会很有帮助,但是我现在只是寻找数学逻辑。
从A1和B1[=108开始=].
D = B1 - A1
C1 = D/|D|
逆时针旋转C190度得到C'1:
C1 = (cx, cy)
C'1 = (-cy, cx)
现在取M1 - A1 并根据 C1 和 C'1[=108 进行测量=]:
j = (M1 - A) · C1
k = (M1 - A) · C'1
现在很容易证明:
M1 = A1 + j C1 + kC'1
所以 j 和 k 告诉你 M1 在哪里,给定 A1 和 B1.
当你得到A2和B2,用它们构造C2,旋转得到C'2,然后你将有:
M2 = A2 + j C2 + kC'2
我假设点是具有 x 和 y 值的对象。像这样:
A1 = {x: 100, y:100}
这是一个轻量级的解决方案:
function reposition(A1,A2,B1,B2,M1)
{
//Getting the Angle Between Lines
var angle = Math.atan2(B2.y-B1.y, B2.x-B1.x)-Math.atan2(A2.y-A1.y, A2.x-A1.x);
//Rotating the point
var xdif = M1.x-A1.x; //point.x-origin.x
var ydif = M1.y-A1.y; //point.y-origin.y
//Returning M2
return {x:B1.x + Math.cos(angle) * xdif - Math.sin(angle) * ydif, y: B1.y + Math.sin(angle) * xdif + Math.cos(angle) * ydif}
}
我正在开发绘图应用程序。我将主要问题概括为一个小场景:
用户绘制线 A1-B1 和点 M1。现在用户将线 A1-B1 移动到新位置 A2-B2,同时点 M1 也应随线移动(如刚体)。如何计算M2点的新位置?
我知道有可能对直线或圆的连线进行复杂的计算,并最终确定新点是在直线 (this question) 的右侧还是左侧等。但是因为我想重新计算拖动的任何步骤,我想应该有一个所有建模软件都使用的快捷方式和轻量级解决方案。真的有比直线连词或圆连词更快捷的公式吗?
为了再次总结问题,我正在寻找具有给定 A1、B1、A2、B2、M1 的光函数并寻找 M2 位置(x 和 y 的两个单独公式)
M2 = f(A1,B1,A2,B2,M1)
我的猜测:我认为找到中心和旋转角度是最好的选择之一,但我再次不知道是否有一个 shotcut 函数可以找到它们.
编辑: 我更喜欢在在线网站上实现它,所以如果有现成的 javascript 库,那将会很有帮助,但是我现在只是寻找数学逻辑。
从A1和B1[=108开始=].
D = B1 - A1
C1 = D/|D|
逆时针旋转C190度得到C'1:
C1 = (cx, cy)
C'1 = (-cy, cx)
现在取M1 - A1 并根据 C1 和 C'1[=108 进行测量=]:
j = (M1 - A) · C1
k = (M1 - A) · C'1
现在很容易证明:
M1 = A1 + j C1 + kC'1
所以 j 和 k 告诉你 M1 在哪里,给定 A1 和 B1.
当你得到A2和B2,用它们构造C2,旋转得到C'2,然后你将有:
M2 = A2 + j C2 + kC'2
我假设点是具有 x 和 y 值的对象。像这样:
A1 = {x: 100, y:100}
这是一个轻量级的解决方案:
function reposition(A1,A2,B1,B2,M1)
{
//Getting the Angle Between Lines
var angle = Math.atan2(B2.y-B1.y, B2.x-B1.x)-Math.atan2(A2.y-A1.y, A2.x-A1.x);
//Rotating the point
var xdif = M1.x-A1.x; //point.x-origin.x
var ydif = M1.y-A1.y; //point.y-origin.y
//Returning M2
return {x:B1.x + Math.cos(angle) * xdif - Math.sin(angle) * ydif, y: B1.y + Math.sin(angle) * xdif + Math.cos(angle) * ydif}
}