通过2点绘制无限线?

时间:2012-09-05 17:23:52

标签: java line graphics2d java-2d

我正在寻找一种通过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));

这将首先绘制一条红色的粗线,然后它将绘制一条蓝色的细线。

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

enter image description here

有人知道解决这个问题的方法吗,或者更好的方法是通过2分画出无限线?

2 个答案:

答案 0 :(得分:6)

通过将第二个点乘以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

答案 1 :(得分: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。在您的情况下,您已经拥有此值,因为y-intercept是x=0时的y坐标。
    3. 然后,你得到等式y = 0.16485428917329234533898305084746 * x + 61.632653061218946
  2. 现在,选择一个足够大的x,比如10000.将此值插入并求解y。你得到1710.1755447941423993898305084746

  3. 最后,将您的线条绘制到这个新点(0, 61.632653061218946)-(10000,1710.1755447941423993898305084746)

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

    • 我们有两个点(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,则表示无限斜率。这是一条垂直线,你必须单独处理这个案例。