コンピュータグラフィックの線(DDA、Bresenham、中点線)は各種の傾きに対して
2731 ワード
どうしてこの文章を書きますか.
ブロガーも最初はあちこちで多くのコードを参考にして研究していましたが、任意の傾きを考えると、if文で別々に議論されているコードが多いことに気づきました.実は重複するコードの部分がたくさんあります.コードが簡潔ではないと思います.あちこちで参考にして考えてから、比較的簡潔なコードをまとめました.皆さんが好きで、もっと良い方法で共有することを期待しています.
その中のコードはJavaScriptで書きましたが、その原理は通じていて、基本的に文法を変えても使えます.
本文に入ります.数値微分法DDA:xの傾きを見て増加の方向を決定し、DrawPixel(x,y,color)は画点個人関数である. Bresenham線引きアルゴリズム:dxで毎回増加するか減少するかを決定し、このようにk<0の場合を考慮し、|k|>1の場合、2点のXY座標を交換して描画を行い、描画点の関数を呼び出す場合、XY座標を同時に置き換えることを覚えておく必要があります. 中点画線法:考え方はほぼBresenhamアルゴリズム と同じである.
ブロガーも最初はあちこちで多くのコードを参考にして研究していましたが、任意の傾きを考えると、if文で別々に議論されているコードが多いことに気づきました.実は重複するコードの部分がたくさんあります.コードが簡潔ではないと思います.あちこちで参考にして考えてから、比較的簡潔なコードをまとめました.皆さんが好きで、もっと良い方法で共有することを期待しています.
その中のコードはJavaScriptで書きましたが、その原理は通じていて、基本的に文法を変えても使えます.
本文に入ります.
function DDA(x0, y0, x1, y1, color) {
var dx, dy, m, k;
var incX, incY, x, y;
dx = x1 - x0; dy = y1 - y0;
// : ? true m=Math.abs(dx) , m=Math.abs(dy)
m = (Math.abs(dx) > Math.abs(dy)) ? Math.abs(dx) : Math.abs(dy);//Math.abs
incX = dx / m;
incY = dy / m;
x = x0; y = y0;
for (k = 1; k < m; k++) {
x += incX;
y += incY;
DrawPixel(Math.floor(x + 0.5), Math.floor(y + 0.5), color);//Math.floor
}
}
function Bresenham(x0, y0, x1, y1, color) {
var x, y, dx, dy, e, m;
dx = x1 - x0; dy = y1 - y0;
var flag = Math.abs(dx) - Math.abs(dy);// 1
if (flag < 0) {// 1 XY
m = y0; y0 = x0; x0 = m;
m = y1; y1 = x1; x1 = m;
}
dx = x1 - x0; dy = y1 - y0;
e = 2 * Math.abs(dy) - Math.abs(dx);
x = x0; y = y0;
incX = (dx > 0) ? 1 : -1; // , <0
incY = dy / Math.abs(dy);//
for (var i = 0; i < (Math.abs(dx)-1) ; i++) {
x += incX;
if (e < 0)
e += 2 * Math.abs(dy);
else {
y += incY;
e = e + 2 * (Math.abs(dy) - Math.abs(dx));
}
if (flag < 0)// 1 XY
DrawPixel(y, x, color);
else
DrawPixel(x, y, color);
}
}
function MiddlePiont(x0, y0, x1, y1, color) {
var dx, dy, d1, d2, d, x, y, m;
dy = y0 - y1; dx = x1 - x0;
var flag = Math.abs(dx) - Math.abs(dy);// 1
if (flag < 0) {// 1 XY
m = y0; y0 = x0; x0 = m;
m = y1; y1 = x1; x1 = m;
}
dy = y0 - y1; dx = x1 - x0;
d = 2 * dy + Math.abs(dx);
d1 = 2 * dy; d2 = 2 * (Math.abs(dx) + dy);
x = x0; y = y0;
var incX = (dx > 0) ? 1 : -1;// , <0
var incY = (dy > 0) ? -1 : 1;
for (var i = 0; i < Math.abs(dx) ; i++) {
x += incX;
if (d < 0) {
y += incY; d += d2; }
else
d += d1;
if (flag < 0)// 1 XY
DrawPixel(y, x, color);
else
DrawPixel(x, y, color);
}}