我正在开发一个绘图应用程序。我将主要问题概括为一个小场景:
用户绘制线 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)
我的猜测:我认为找到中心和旋转角度是最好的选择之一,但我不知道是否有快捷功能可以找到它们。
编辑:我更喜欢在在线网站中实现它,所以如果有一个现成的 javascript 库,它会有所帮助,但我现在只是在寻找数学逻辑。
答案 0 :(得分:1)
从A1和B1开始。
D = B1 - A1
C1 = D/|D|
将C1逆时针旋转90度得到C'1:
C1 = (cx, cy)
C'1 = (-cy, cx)
现在取 M1 - A1 并根据 C1 进行测量 和 C'1:
j = (M1 - A) · C1子>
k = (M1 - A) · C'1
现在很容易证明:
M1 = A1 + j C1 + k C'1
所以 j 和 k 告诉你 M1 在哪里,给定 A1 和 B 1.
当你得到A2和B2时,用它们来构造C2,旋转它得到C'2,然后你会得到:
M2 = A2 + j C2 + k C'2
答案 1 :(得分:0)
我假设点是具有 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}
}