2点から線を引く必要がありますが、これまでに行ったことはを使用していdrawLine(x1,y1,x2,y2)
ます。しかし、私がやりたいのは、これらの2つの点(x1,y1)
とと交差する線を引くこと(x2,y2)
です。
それらの間に線を引くだけではありません。これが私が持っているものと私がやりたいことのイメージです。
2点から線を引く必要がありますが、これまでに行ったことはを使用していdrawLine(x1,y1,x2,y2)
ます。しかし、私がやりたいのは、これらの2つの点(x1,y1)
とと交差する線を引くこと(x2,y2)
です。
それらの間に線を引くだけではありません。これが私が持っているものと私がやりたいことのイメージです。
あなたはいくつかの数学を使うことができます。あなたのラインの増加を取得します。あなたは機能を知っている必要があります
f(x)= mx+b。すでに取得した2つのポイントを使用して、フレームの境界にある他の2つのポイントを計算し、それらの間に線を引くことができます。
線がグラフィックスコンテキストの境界と一致する座標を計算する必要があります。
(x1、y1)と(x2、y2)がある場合は、(x_a、0)と(0、y_a)が線上にくるようにx_aとy_aを計算します。x_a = 0の場合、線は左端から始まります。y_a = 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);
}
}