4

我正在寻找一种方法来通过 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 个点画一条无限线?

4

2 回答 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)。差向量只是 和 之间的ba;那就是d = b-a。要找到一个无穷大的终点,我们只需将差向量的无穷大乘以起点(a)。所以, c = a + d*k, 哪里k是任意大的常数。更换后d,我们有c = a+(b-a)*k

于 2012-09-05T17:35:54.233 回答
4

让我们来算一算。

  • 第一行是(0, 61.632653061218946)-(944, 217.25510204080692). 坡度是rise/run,因此m = 0.16485428917329234533898305084746
  • 第二行是(0, 61.632653061218946)-(9440, 2172.5510204080692)m = 0.22361423382911549300847457627119.

坡度不同,这只是角度不同的另一种说法。

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

你怎么做到这一点?

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

    1. 我们已经知道如何计算斜率 ( rise/run= y2 - y1 / x2 - x1)。我们得到0.16485428917329234533898305084746
    2. 插入斜率并求解b( y - m*x),得到61.632653061218946。在您的情况下,您已经有了这个值,因为 y 截距是 y 坐标 when x=0
    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,则斜率无限。这是一条垂直线,您必须单独处理这种情况。

于 2012-09-05T17:38:30.240 回答