我目前有一个不好的方法,它只是将起点转换为1 / -1,具体取决于x / y坐标是否超出或低于当前坐标,并将其添加到ArrayList直到起点。等于(结束),这是一个糟糕的解决方案,因为它会创建一个非常糟糕的路径,看起来像下面的黑色路径。
我正在尝试生成两点之间的直接路径(与Graphics.drawLine相同的行)。
我猜我需要使用Math类来获得角度,但我对Math API并不是很熟悉。
答案 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)
这实际上是一个数学问题,而不是编程问题。您需要找到从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
作为一个小值(取决于你的问题)来检查相等性(永远不要使用!=
来表示浮点数!)。
答案 2 :(得分:1)
这是一个非常简单的概念,但你还不清楚自己究竟想要什么。根据定义,任意两点之间存在无数个点(在那些点之间存在无数个点。依此类推。)
最简单的解决方案是计算A点和B点之间的线的公式,然后确定您想要点的距离,并使用线公式计算这些点。
基本几何告诉我们,在x的变化中,y的变化中两点之间的斜率。所以m = (y1 - y2)/(x1 - x2)
所有这些值都是双倍的,x1
和y1
属于同一点。
然后两点之间的直线公式为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.