2

我目前有一个不好的方法来执行此操作,它只是将起点平移 1/-1,具体取决于 x/y 坐标是在当前坐标之上还是之下,并将其添加到 ArrayList 直到起点 .equals(end ),这是一个糟糕的解决方案,因为它创建了一个非常糟糕的路径,看起来像下面的黑色路径。

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

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

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

4

4 回答 4

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 个罗盘方向上的线编写单元测试,以消除任何故障。

于 2012-07-31T15:44:05.247 回答
1

这实际上是一个数学问题而不是编程问题。您需要找到从start到的向量,end然后对其进行缩放并将其添加到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应该选择一个小的值(取决于你的问题)来检查相等性(永远不要!=用于浮点!)。

于 2012-07-31T15:44:18.947 回答
1

这是一个非常简单的概念,但您并不清楚您到底想要什么。根据定义,任意两点之间有无数个点(并且在其中两个点之间存在无数个点。依此类推。)

最简单的解决方案是计算点 A 和点 B 之间的线的公式,然后决定你希望你的点相距多远,并使用你的线公式计算这些点。

初等几何告诉我们,两点之间的斜率在 y 的变化超过 x 的变化。因此m = (y1 - y2)/(x1 - x2),所有这些值都是双精度值,并且x1y1属于同一点。

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

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

于 2012-07-31T15:45:49.217 回答
0

查看这个先前回答的问题以计算角度。然后使用距离公式求距离。

double dist = Math.sqr((x2 - x1)^2 + (y2 - y1)^2);  //obviously wont compile but you get the idea.
于 2012-07-31T15:29:01.343 回答