我有两点作为程序A (x1,y1)
的B (x2,y2)
输入给出。我必须找到C
位于线上AB
并且10
与点 A 相距一定距离的第三点。
我可以很容易地得到直线的斜率,但这并没有给我完整的直线方程。即使我得到了完整的方程,我也不确定使用这个方程,我怎么能找到一个x
远离 A的点。
关于如何解决这个问题的任何建议?
每条线上总是有两个点:
A
从to获取向量B
(减去坐标)A
到C
请注意,如果A==B
,则未定义该行,并且此算法会导致除以零。您可能希望在开始时添加相等性测试。
您可以使用直线角度的正弦或余弦(乘以 10)来获得与给定点相距 10 的点的水平或垂直距离。一个捷径是使用水平或垂直距离除以点之间的直接距离来获得正弦或余弦。
你可以使用这样的向量来做到这一点:
令 D = B 和 A 之间的差 (D = B - A)
那么这条线上的任何一点都可以用这个公式来描述:
point = A + Dt
其中 t 是一个实数。
因此,只需为 t 插入任何值即可获得另一点。例如,如果您让 t == 1,那么上面的等式会简化为点 = B。如果您让 t = 0,那么它会简化为点 = A。所以您可以看到您可以使用它来找到 A 和 B 之间的点只需让 t 的范围从 0 到 1。此外,如果让 t > 1,您将找到 B 之后的点。
您可以从图像中看到您给定的点是 x1,y1 和 x2,y2。您需要在距点 x1,y1 的距离“R”处找到一个中间点。
您需要做的就是使用
Tan θ = (y2-y1)/(x2-x1)
然后可以得到中间点为 (R * cos θ),(R * Sin θ)
我画了这个假设正斜率。
继续类似的路线,您可以为其他特殊情况寻求解决方案:
一世。水平线 ii。垂直线 iii。负斜率
希望它澄清。
我已经使用 Sprite 对象在 Andengine 中完成了计算。我有两个数组列表 x 坐标和 y 坐标。在这里,我只是使用这两个数组列表中的最后两个值来计算距离您的点 B 800 像素的第三个点。您可以使用 800 以外的其他值对其进行修改。希望它会起作用。这里的坐标系是屏幕左上角的 (0,0) 位置略有不同。谢谢
private void addExtraCoordinate(CarSprite s) {
int x0, y0, x1, y1;
float x = 0f, y = 0f;
x0 = Math.round(xCoordinates.get(xCoordinates.size() - 2));
x1 = Math.round(xCoordinates.get(xCoordinates.size() - 1));
y0 = Math.round(yCoordinates.get(yCoordinates.size() - 2)) * (-1);
y1 = Math.round(yCoordinates.get(yCoordinates.size() - 1)) * (-1);
if (x1 == x0 && y1 == y0) {
return;
} else if (y1 == y0 && x1 != x0) {
if (x1 > x0) {
x = (float) x1 + 800f;
} else
x = (float) x1 - 800f;
y = Math.round(yCoordinates.get(yCoordinates.size() - 1));
} else if (y1 != y0 && x1 == x0) {
if (y1 > y0) {
y = (float) Math.abs(y1) - 800f;
} else
y = (float) Math.abs(y1) + 800f;
x = Math.round(xCoordinates.get(xCoordinates.size() - 1));
} else {
float m = (float) (yCoordinates.get(yCoordinates.size() - 1) * (-1) - yCoordinates
.get(yCoordinates.size() - 2) * (-1))
/ (float) (xCoordinates.get(xCoordinates.size() - 1) - xCoordinates
.get(xCoordinates.size() - 2));
if (x1 > x0) {
x = (float) ((float) x1 + 800f / (float) Math
.sqrt((double) ((double) 1f + (double) (m * m))));
} else
x = (float) ((float) x1 - 800f / (float) Math
.sqrt((double) ((double) 1f + (double) (m * m))));
if (y0 > y1) {
y = (float) ((float) Math.abs(y1) + 800f / (float) Math
.sqrt((double) (((double) 1f / (double) (m * m)) + (double) 1f)));
} else
y = (float) ((float) Math.abs(y1) - 800f / (float) Math
.sqrt((double) (((double) 1f / (double) (m * m)) + (double) 1f)));
}
xCoordinates.add(x);
yCoordinates.add(y);
}