使用Java的图形类绘制一条直线

3
我需要从两个点画一条线,目前我使用的是drawLine(x1,y1,x2,y2)。但是我想要做的是画一条与这两个点(x1,y1)(x2,y2)相交的线。

我不仅仅想在它们之间画一条线,下面是我所拥有的和我想要做的图像:

Line Drawings

3个回答

3

你可以运用一些数学知识,让你的线条更加顺畅。你应该了解函数

f(x) = mx + b。通过你已经得到的两个点,你可以计算出边框上的另外两个点,并在它们之间画一条直线。


是的,没错,但如果我能找到已经存在的函数就太好了...不过谢谢你,如果找不到其他解决方案,我会使用它的 :) - Ben
我刚刚发现了这个问题 ;) https://dev59.com/nGjWa4cB1Zd3GeqPnRpy - SomeJavaGuy

1

您需要计算线条与图形上下文边界相交的坐标。

如果您有(x1,y1)和(x2,y2),请计算x_a和y_a,使得(x_a,0)和(0,y_a)位于该直线上。 如果x_a = 0,则该线将从左侧开始。如果y_a = 0,则该线将从顶部开始。

对于线条的底部/右侧坐标,请重复此过程。


0

布雷森汉姆直线算法

private int sign (int x) {
    return (x > 0) ? 1 : (x < 0) ? -1 : 0;  
}

public void drawBresenhamLine (int xstart, int ystart, int xend, int yend, Graphics g){
    int x, y, dx, dy, incx, incy, pdx, pdy, es, el, err;

    dx = xend - xstart;
    dy = yend - ystart;

    incx = sign(dx);

    incy = sign(dy);


    if (dx < 0) dx = -dx;
    if (dy < 0) dy = -dy;

    if (dx > dy){
        pdx = incx; pdy = 0;
        es = dy;    el = dx;
    } else {
        pdx = 0;    pdy = incy;
        es = dx;    el = dy;
    }

    x = xstart;
    y = ystart;
    err = el/2;
    g.drawLine (x, y, x, y);

    for (int t = 0; t < el; t++)//if I multiply el a line will be longer
    {
        err -= es;
        if (err < 0) {
            err += el;
            x += incx;
            y += incy;
        } else {
            x += pdx;
            y += pdy;
        }

        g.drawLine (x, y, x, y);
    }
}

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