Java,生成两点之间点的直接路径

时间:2012-07-31 15:22:30

标签: java path point

我目前有一个不好的方法,它只是将起点转换为1 / -1,具体取决于x / y坐标是否超出或低于当前坐标,并将其添加到ArrayList直到起点。等于(结束),这是一个糟糕的解决方案,因为它会创建一个非常糟糕的路径,看起来像下面的黑色路径。

https://dl.dropbox.com/u/64681860/paths.png

我正在尝试生成两点之间的直接路径(与Graphics.drawLine相同的行)。

我猜我需要使用Math类来获得角度,但我对Math API并不是很熟悉。

4 个答案:

答案 0 :(得分:5)

一种有点天真的方法,就是计算斜率的比例,而不是角度。

类似的东西:

float ratio = (y2 - y1) / (x2 - x1);

然后:

width = x2 - x1;
for(int i = 0; i < width; i++) {
    float x = x1 + i;
    float y = y1 + (ratio * i);
    points.add(new Point(x,y));
}

如果浮动不是你需要的,你需要进行一些转换。

你还需要处理x1 == x2的特殊情况,否则你会得到被零除错误。

使用此方法,线越陡,您将生成的点越少。如果你想让这些点均匀分布,无论角度是多少,你都需要打破sin / cos / tan。

至少在主要的8个罗盘方向上对线路进行单元测试,以消除任何故障。

答案 1 :(得分:1)

这实际上是一个数学问题,而不是编程问题。您需要找到从startend的向量,然后对其进行缩放,并将其添加到start以获得所需的点数。

在伪代码中:

f(start,end,nPoints) -> (path)
   delta = (end-start) / nPoints //Find the best difference vector.
   current = start //Set the current point to the start.
   i = 0
   while(|current-end| < epsilon)
      current += delta
      path[i] = current
      i = i + 1

我假设这些点是浮点(由于划分)。应该选择epslion作为一个小值(取决于你的问题)来检查相等性(永远不要使用!=来表示浮点数!)。

答案 2 :(得分:1)

这是一个非常简单的概念,但你还不清楚自己究竟想要什么。根据定义,任意两点之间存在无数个点(在那些点之间存在无数个点。依此类推。)

最简单的解决方案是计算A点和B点之间的线的公式,然后确定您想要点的距离,并使用线公式计算这些点。

基本几何告诉我们,在x的变化中,y的变化中两点之间的斜率。所以m = (y1 - y2)/(x1 - x2)所有这些值都是双倍的,x1y1属于同一点。

然后两点之间的直线公式为y - y1 = m(x - x1)。然后你要做的就是开始为x插入值,然后取结果y并绘制它。

当然,这是整个事情背后的想法。使用矢量你会好得多。

答案 3 :(得分:0)

查看this之前回答的问题以计算角度。然后使用距离公式找到距离。

double dist = Math.sqr((x2 - x1)^2 + (y2 - y1)^2);  //obviously wont compile but you get the idea.