我目前有一个不好的方法来执行此操作,它只是将起点平移 1/-1,具体取决于 x/y 坐标是在当前坐标之上还是之下,并将其添加到 ArrayList 直到起点 .equals(end ),这是一个糟糕的解决方案,因为它创建了一个非常糟糕的路径,看起来像下面的黑色路径。
我正在尝试在两点之间生成点的直接路径(与 Graphics.drawLine 制作的线相同)。
我猜我需要使用 Math 类来获取角度,但我对 Math API 不是很熟悉。
一种有点幼稚的方法是计算斜率的比率,而不是角度。
就像是:
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 个罗盘方向上的线编写单元测试,以消除任何故障。
这实际上是一个数学问题而不是编程问题。您需要找到从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
应该选择一个小的值(取决于你的问题)来检查相等性(永远不要!=
用于浮点!)。
这是一个非常简单的概念,但您并不清楚您到底想要什么。根据定义,任意两点之间有无数个点(并且在其中两个点之间,存在无数个点。依此类推。)
最简单的解决方案是计算点 A 和点 B 之间的线的公式,然后决定你希望你的点相距多远,并使用你的线公式计算这些点。
初等几何告诉我们,两点之间的斜率在 y 的变化超过 x 的变化。因此m = (y1 - y2)/(x1 - x2)
,所有这些值都是双精度值,并且x1
和y1
属于同一点。
那么两点之间的直线的公式是y - y1 = m(x - x1)
。然后你所要做的就是开始插入值,比如说,x
获取结果y
,然后绘制它。
当然,这是整个事情背后的想法。使用向量会好得多。
查看这个先前回答的问题以计算角度。然后使用距离公式求距离。
double dist = Math.sqr((x2 - x1)^2 + (y2 - y1)^2); //obviously wont compile but you get the idea.