【问题标题】:Java, Generate a direct path of points between two pointsJava,在两点之间生成点的直接路径
【发布时间】:2012-07-31 15:22:30
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否展示一下您现在是如何生成它的,以便我们了解您正在使用的 API(点类、路径类)。
  • 在我看来,这与其说是一个 Java 问题,不如说是一个三角问题。了解数学之后,在 Math API 中查找相关函数就很简单了。
  • 我不明白。为什么不返回一个点数组,其中第一个点是起点,第二个点是终点?您只能制作长度为 1 的步长吗?
  • 如果已解决,请接受答案。如果没有一个答案是全面的,请写下您自己的答案并接受!

标签: java path point


【解决方案1】:

一种有点幼稚的方法是计算斜率的比率,而不是角度。

类似:

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));
}

如果 float 不是您需要的,则需要进行一些转换。

您还需要处理 x1 == x2 的特殊情况,否则会出现被零除错误。

使用这种方法,线越陡,生成的点就越少。如果您希望无论角度如何,点都均匀分布,则需要分解 sin/cos/tan。

为至少主要 8 个罗盘方向上的线编写单元测试,以消除任何故障。

【讨论】:

  • 我认为斜率是 Y 的变化超过 X 的变化?那么(y2 - y1)/(x2 - x1) ?
  • 斜率无穷大时要小心。
  • 你能解释被零除的特殊情况吗?怎么解决
  • @mario 好吧,当 x1 == x2,x2 - x1 == 0 时,你会从我提供的代码中得到除以零。但是你知道你想画一条简单的垂直线,所以只需使用if(或其他)来绘制垂直线,而不是运行会中断的代码。
【解决方案2】:

这实际上是一个数学问题而不是编程问题。您需要找到从 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 应选择一个较小的值(取决于您的问题)以检查相等性(切勿将 != 用于浮点数!)。

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多