将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
找到三角类请记住,飞机可以位于跑道点周围的任何位置
答案 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
这可能是伪代码的基本思想,但它还有很多东西。你如何定义'最佳'方式?
需要考虑某些事项:
给我们一些细节,我们会看到我们得到了什么。 :d
答案 5 :(得分:0)
在此game中,积分坐标用于表示网格中的方块。方法move(int row, int col)
通过在八个半主方向之一中前进一个方格来移动到指定的行和列,如here所示。