给出两点,找到第三点

时间:2012-11-09 05:07:21

标签: c++ algorithm

我有两个点A (x1,y1)B (x2,y2)作为程序的输入。我必须找到位于C行上的第三个点AB,距离点A的距离为10

我可以很容易地得到线的斜率,但这并没有给出线的完整等式。即使我得到完整的等式,我也不确定使用这个等式,我怎样才能找到距离A x距离{。}}的点。

有关如何处理此事的任何建议?

5 个答案:

答案 0 :(得分:6)

每一行总有两个点:

  • AB(减去坐标)
  • 归一化向量(除以其长度;毕达哥拉斯定理)
  • 将向量乘以10 -10
  • 将向量添加到A以获取C

请注意,如果A==B,则未定义该行,并且此算法会导致除以零。您可能希望在开头添加一个相等的测试。

答案 1 :(得分:2)

您可以使用直线角度的正弦或余弦(乘以10)来获得与给定点距离为10的点的水平或垂直距离。一个捷径是使用水平或垂直距离除以点之间的直接距离来获得正弦或余弦。

答案 2 :(得分:1)

你可以使用这样的矢量来实现:

设D = B与A之间的差(D = B-A)

然后该线上的任何一点都可以用这个公式来描述:

point = A + Dt 

其中t是实数。

所以只需插入t的任何值即可获得另一个点。例如,如果你让t == 1,那么上面的等式减少到point = B.如果你让t = 0然后它减少到point = A.所以你可以看到你可以用它来找到A和B之间的一个点简单地说,让t的范围从0到1.另外,如果你让t> 1,你会发现过了B点。

答案 3 :(得分:1)

enter image description here

您可以从图像中看到您的给定点是x1,y1和x2,y2。你需要在点x1,y1的距离'R'找到一个中间点。

您需要做的就是使用

找到θ

Tan θ = (y2-y1)/(x2-x1)

然后你可以得到中间点为(R *cosθ),(R *Sinθ)

我已假设正斜率。

在类似的路线上,您可以寻求其他特殊案例的解决方案:

我。水平线 II。垂线 III。负斜率

希望它澄清。

答案 4 :(得分:0)

我使用Sprite对象在Andengine中完成了计算。我有两个Array List 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);

}