我需要从两点画一条线,到目前为止我所做的是使用drawLine(x1,y1,x2,y2)
. 但我想做的是画一条与这两点相交的线(x1,y1)
和(x2,y2)
。
我不想在它们之间画一条线,这是我所拥有的和我想要做的图像:
我需要从两点画一条线,到目前为止我所做的是使用drawLine(x1,y1,x2,y2)
. 但我想做的是画一条与这两点相交的线(x1,y1)
和(x2,y2)
。
我不想在它们之间画一条线,这是我所拥有的和我想要做的图像:
你可以使用一些数学。得到你的线路的增加。你应该知道函数
f(x) = mx + b。使用您已经获得的两个点,您可以计算框架边界处的另外两个点,并在它们之间画一条线
您需要计算线与图形上下文边界相交的坐标。
如果您有 (x1,y1) 和 (x2,y2),请计算 x_a 和 y_a,使得 (x_a,0) 和 (0,y_a) 位于线上。如果 x_a = 0,则该行将从左边缘开始。如果 y_a = 0,则线将从上边缘开始。
重复该行的底部/右侧坐标。
Bresenham 线算法
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);
}
}