【问题标题】:Draw an infinite line through 2 points?通过2点画一条无限线?
【发布时间】:2012-08-30 11:35:12
【问题描述】:

我正在寻找一种方法来通过 2 个点绘制一条无限线(一条没有尽头的线,也称为射线)。我可以用 Line2D 在 2 点之间画一条线,这里没问题。

接下来需要看看无限部分。以我简单的想法,让我们将第二个点的 x 和 y 坐标乘以 100 并重画线。这有效,但仅适用于简单的情况。

例如这里是一个产生不同角度的线条的例子:

    g.setColor(Color.red);
    g2.setStroke(new BasicStroke(4.0f));
    g2.draw(new Line2D.Double(0, 61.632653061218946, 944, 217.25510204080692));
    g.setColor(Color.blue);
    g2.setStroke(new BasicStroke(1.0f));
    g2.draw(new Line2D.Double(0, 61.632653061218946, 944*10, 217.25510204080692*10));

这将首先画一条粗红线,然后画一条蓝色细线。

蓝线与红线的角度不同。这是一个截图来说明这种效果:

是否有人知道解决此问题的方法,或者可能是通过 2 个点绘制无限线的更好方法?

【问题讨论】:

  • 乘以100,你想要做的是“延长线的长度”?
  • 确实,我只是找不到合适的词来表达我想做的事情。 “扩展”是正确的词!

标签: java line graphics2d java-2d


【解决方案1】:

通过将第二个点乘以 10,您不会保持 x 与 y 的比率。相乘前需要减去原点。

g2.draw(new Line2D.Double(0, 61.632653061218946, 944*10, (217.25510204080692-61.632653061218946)*10+61.632653061218946)); 应该可以工作。

一般来说,g2.draw(new Line2D.Double(x0,y0,(x1-x0)*k+x0,(y1-y0)*k+y0) 应该可以工作。

这背后的数学是将两个点视为向量(a & b)。现在,定义第三个和第四个向量:差向量 (d) 和无限端点向量 (c)。差向量就是ba之间的差值;那是d = b-a。要找到一个无穷大的终点,我们只需将差向量的无穷乘以添加到起点 (a)。所以,c = a + d*k,其中k 是任意大的常数。替换d后,我们有了c = a+(b-a)*k

【讨论】:

  • 等一下,是我自己还是不应该是(9440,1494.591836734660794),而不是(9440,1556.22448979587974)?您必须从新的 y 值中减去截距:(y1-y0)*k - b
  • 糟糕,我确实犯了一个错误。谢谢。
  • 应该是 (9440, 1617.857142857098686),而不是我之前的(x=9440 的情况)。我已经详细说明了我在做什么。
  • 感谢您的回复并花时间帮助我解决这个问题。
【解决方案2】:

让我们算一算。

  • 第一行是(0, 61.632653061218946)-(944, 217.25510204080692)。斜率为rise/run,因此为m = 0.16485428917329234533898305084746
  • 第二行是(0, 61.632653061218946)-(9440, 2172.5510204080692)m = 0.22361423382911549300847457627119

坡度不同,也就是角度不同的另一种说法。

你需要做的是延长这条线。您不能将其中一个点的两个坐标都乘以 10。首先确定画布边界之外的 x 或 y,然后求解另一个值

你是怎么做到的?

  1. 首先,得到直线的方程。一条线由y=m*x+b 定义,其中m 是斜率,b 是y 轴截距。

    1. 我们已经知道如何计算斜率 (rise/run = y2 - y1 / x2 - x1)。我们得到0.16485428917329234533898305084746
    2. 插入斜坡并求解b (y - m*x),得到61.632653061218946。在您的情况下,您已经有了这个值,因为当 x=0 时 y 截距是 y 坐标。
    3. 然后你得到等式y = 0.16485428917329234533898305084746 * x + 61.632653061218946
  2. 现在,选择一个足够大的 x,比如 10000。代入这个值并求解 y。你会收到1710.1755447941423993898305084746

  3. 最后,画一条线到这个新点,(0, 61.632653061218946)-(10000,1710.1755447941423993898305084746)

很好,现在让我们概括一下。

  • 我们有两个点(x1, y1)(x2, y2)。我们要解决(10000, y3)
  • 因此,y3 = m*x3 + by3 = m * 10000 + b
  • 我们也知道b = y - m * x,所以插上这个,任意选择点1,y3 = m * 10000 + y1 - m * x1
  • 好的,让我们排除my3 = m * (10000 + x1) - y1
  • 我们知道m = (y2 - y1) / (x2 - x1),所以将其插入:y3 = ((y2 - y1) / (x2 - x1)) * (10000 + x1) - y1

如果您的线不是从x = 0 开始,您将需要对x = 0 重复此过程,这意味着您应该绘制一条线(0, ((y2 - y1) / (x2 - x1)) * x1 - y1)-(10000,((y2 - y1) / (x2 - x1)) * (10000 + x1) - y1)

注意:如果x2 - x1 为 0,则斜率无限大。这是一条垂直线,您必须单独处理这种情况。

【讨论】:

  • 当心极端斜率,因为您正在处理浮点值。特别是,当斜率无穷大时,您就会遇到问题。
  • +1 先得到正确答案并更正我的答案。
  • 感谢您的广泛回复,我不得不阅读多次才能完全理解,但那是因为我不太擅长数学和算法。但你的解释对我来说更有意义。
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 2019-12-13
  • 2013-06-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多