对不起,如果我把标题写错了,我的数学不太好,也不知道正确的术语,但我想有人会正确编辑它。
我正在 Lua 中创建一个脚本,我有一个目标位置和我的位置。我找到了它的斜率,所以现在我有 X1、X2、Y1、Y2 和 M(斜率)。我不知道添加一个距离为 x 的新点的数学。
有点像这个做得不好的 MS 油漆示例,其中 2 个黑点是最右边的目标,我的位置在左边,然后绿点就是我想要的。
我会假设
Y = Y1 + M (X-X1)
定义 (X1, Y1) 和 (X2, Y2) 之间的距离 D,由下式给出
D = Math.sqrt((X2 - X1)² + (Y2 – Y1)²)
哪里Math.sqrt(...)
是平方根函数。如果您希望该直线上的某个点d
与 (X1, Y1) 有一定距离,则有两个这样的点,一个在 (X1, Y1) 的左侧,一个在 (X1, Y1) 的右侧。这两个点的坐标是
(X1 + (X2 - X1) d/D, Y1 + (Y2 - Y1) d/D)
和
(X1 - (X2 - X1) d/D, Y1 - (Y2 - Y1) d/D)
带有+
符号的第一个点是d
在 (X2, Y2) 方向上距 (X1, Y1) 一定距离的点。-
带有符号的第二个点是距d
(X1, Y1) 一定距离但方向远离 (X2, Y2) 的点。如果你想要的情况总是如图所示,那么答案总是用-
符号取第二点。
你必须结合两个公式。
1. (y3-y2)^2 + (x3-x2)^2 = d
2. (y2-y1)/(x2-x1) = (y3-y2)/(x3-x2)
这是您问题的haskell代码。它可能有用。
foo x1 y1 x2 y2 d =
[(x3,y3) |
x3 <- [-100..100], y3 <- [-100..100],
(y3-y2)^2 + (x3-x2)^2 == d,
(y2-y1)/(x2-x1) == (y3-y2)/(x3-x2)]
ps:100是一个范围。你可以改变它。这个函数返回两对。像(-1,1),(11,9)。因为我没有指定方式。
另一种解决方案:(我结合公式)
let k = d / sqrt((y2-y1)^2 + (x2-x1)^2)
x3 = x2 + k * (x2-x1) other x3 = x2 - k * (x2-x1)
y3 = y2 + k * (y2-y1) other y3 = y2 - k * (y2-y1)