通过两个点画出无限直线?

4
我正在寻找一种方法来通过两个点画出无限线(也称为射线)。使用Line2D可以在两个点之间画一条直线,这没有问题。
接下来需要考虑无限的部分。我想到了一个简单的方法,就是将第二个点的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));

这将首先绘制一条粗红线,接着它会绘制一条蓝色的细线。

与红线相比,蓝线的角度有所不同。以下是一个截图,以说明这种效果:

enter image description here

有人知道如何解决这个问题,或者有更好的方法通过两点绘制无限直线吗?


1
通过乘以100,你想要做的是“延长”这条线的长度? - juan.facorro
确实,我只是找不到我想要做的正确词语。"扩展"是正确的词语! - T. Akhayo
2个回答

7
通过将第二个点乘以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)。差向量只是b和a之间的差异;即d = b-a。要找到一个无限的终点,我们只需要将无穷大的常数乘以差向量加到起始点(a)上。所以,c = a + d*k,其中k是任意大的常数。替换d后,我们有c = a+(b-a)*k。

等一下,是我自己的问题还是点不应该是(9440,1556.22448979587974)而是(9440,1494.591836734660794)?你必须从新的y值中减去截距:(y1-y0)*k - b - lc.
哎呀,我犯了一个错误。谢谢。 - RedGreasel
应该是 (9440, 1617.857142857098686),而不是之前的结果(也就是你在 x=9440 时得到的结果)。我已经详细说明了我的操作过程。 - RedGreasel
1
感谢您的回复并抽出时间帮助我解决这个问题。 - T. Akhayo

4

让我们来算一下。

  • 第一条线段是 (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. 将斜率代入并解决 by - 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 + b,或者说 y3 = m * 10000 + b
我们也知道 b = y - m * x,所以将其代入并任意选择点1,得到 y3 = m * 10000 + y1 - m * x1
现在,让我们把 m 提取出来: y3 = 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,那么斜率是无限大的。这是一条竖直的线段,你需要单独处理此情况。

注意极端的斜率,因为你正在处理浮点值。特别是当斜率为无穷大时,你会遇到问题。 - RedGreasel
第一个正确回答并纠正我的答案将得到+1。 - RedGreasel
1
非常感谢您的详细回复,我不得不多次阅读才能完全理解,但这是因为我不太擅长数学和算法。但是您的解释对我来说甚至也很有意义。 - T. Akhayo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接