Java 2D:将一个点P移动到一个距离更近的另一个点?

时间:2010-03-01 00:21:14

标签: java java-2d

将Point2D.Double x距离移近另一个Point2D.Double的最佳方法是什么?

编辑:尝试编辑,但是因此进行了维护。不,这不是功课

我需要将一架飞机(A)朝跑道(C)的末端移动并指向正确的方向(角度a)。

alt text http://img246.imageshack.us/img246/9707/planec.png

这是我到目前为止所做的,但看起来很乱,通常做这样的事情的方法是什么?

    //coordinate = plane coordinate (Point2D.Double)
    //Distance = max distance the plane can travel in this frame

    Triangle triangle = new Triangle(coordinate, new Coordinate(coordinate.x, landingCoordinate.y),  landingCoordinate);

    double angle = 0;

    //Above to the left
    if (coordinate.x <= landingCoordinate.x && coordinate.y <= landingCoordinate.y)
    {
        angle = triangle.getAngleC();
        coordinate.rotate(angle, distance);
        angle = (Math.PI-angle);
    }
    //Above to the right
    else if (coordinate.x >= landingCoordinate.x && coordinate.y <= landingCoordinate.y)
    {
        angle = triangle.getAngleC();
        coordinate.rotate(Math.PI-angle, distance);
        angle = (Math.PI*1.5-angle);
    }

    plane.setAngle(angle);

可以在http://pastebin.com/RtCB2kSZ

找到三角类

请记住,飞机可以位于跑道点周围的任何位置

6 个答案:

答案 0 :(得分:5)

两点之间的最短距离是一条线,所以只需沿连接两点的线移动该点x个单位。


编辑:如果这是作业,我不想泄露答案的具体内容,但这很简单,可以说明它而不会太过扰乱。

我们假设您有两个点A =(x 1 ,y 1 )和B =(x 2 ,y 2 )。包含这两个点的直线有等式

  

(x 1 ,y 1 )+ t·(x 2 - x 1 ,y < sub> 2 - y 1

其中t是一些参数。请注意,当t = 1时,该行指定的点为B,而当t = 0时,该行指定的点为A

现在,您希望将B移至B',这是距离d新距离A的点:

 A                       B'            B
(+)---------------------(+)-----------(+)

 <========={ d }=========>

B'与该线上的任何其他点一样,也受我们之前显示的等式控制。但是我们使用t的价值是多少?好吧,当t为1时,等式指向B,距离|AB| A个单位。因此,指定t的{​​{1}}的值为B' = t

求解| AB |并将其插入上述等式中作为练习留给读者。

答案 1 :(得分:5)

您可以将两个轴上的差异最小化一个百分比(取决于您想要移动多少点)。

例如:

Point2D.Double p1, p2;
//p1 and p2 inits

// you don't use abs value and use the still point as the first one of the subtraction
double deltaX = p2.getX() - p1.getX();
double deltaY = p2.getY() - p1.getY();

// now you know how much far they are
double coeff = 0.5; //this coefficient can be tweaked to decice how much near the two points will be after the update.. 0.5 = 50% of the previous distance

p1.setLocation(p1.getX() + coeff*deltaX, p1.getY() + coeff*deltaY);

所以你将p1移到p2的中途。避免abs的好处是,如果您选择移动哪个点以及哪个点将静止不动,您可以避免测试并使用原始系数。

答案 2 :(得分:5)

导航救援!

给定点A和B.从A到B创建向量V(通过执行B-A)。将矢量V归一化为单位矢量,然后将其乘以你想要的距离d,最后将得到的矢量加到A点。即:

  A_moved = A + |(B-A)|*d

的Java(ISH)

  Vector2D a_moved = a.add(b.subtract(a).norm().multiply(d));

没有角度,不需要讨厌的触发。

答案 3 :(得分:2)

double angle = Math.atan2(landingCoordinate.y-coordinate.y, landingCoordinate.x-coordinate.x);

coordinate.x += Math.cos(angle)*distance;
coordinate.y += Math.sin(angle)*distance;

//Add 90 degress to the plane angle
plane.setAngle(angle + 1.57079633);

答案 4 :(得分:0)

(point A is to be moved closer to B)

if (A.x > B.x)
    //decrement A.x
if (A.x < B.x)
    //increment A.x

这可能是伪代码的基本思想,但它还有很多东西。你如何定义'最佳'方式?

需要考虑某些事项:

  • 您是否希望点数彼此分开,或者您只是希望它们更接近?
  • 是否应始终修改两个坐标? (例如,如果你想移动(1,50)接近(0,0),你做(.5,25)还是只做(1,25)?
  • 如果该点距离1个单位,那么它应该是1个水平单位吗?直接对角线?在2点之间的线上1个单位?

给我们一些细节,我们会看到我们得到了什么。 :d

答案 5 :(得分:0)

在此game中,积分坐标用于表示网格中的方块。方法move(int row, int col)通过在八个半主方向之一中前进一个方格来移动到指定的行和列,如here所示。