[Shool_DHMT] 線を引くためのDDAアルゴリズム
コンテンツ
1. 構成アルゴリズム
2. フローチャートアルゴリズム
3. コードイラスト
4. すべてのケースのためのコード
続きを読む
1. 直線を描くの一般原則
2. アルゴリズムBreshenhamは直線を引く
3. 線を引くための中間点アルゴリズム
1. 建設DDAアルゴリズム (デジタルDifferentialAnalyzer)
与える 2 エンドポイントM1 (X1, Y1), M2(X2, Y2) とCを描く.
全部で 直線を描くの一般原則 我々は、フォームの直線方程式を構築しています:
アルゴリズムを簡略化するために、我々は行を考える
Xが増加するため、各ステップ1で、 1 すなわちユニット
* mが望むべきである実数であるため、 それは、画面を作るための座標を取得する前に、丸め整数でなければなりません.
* 直線mと > 1 私は、各ステップで私たちが持っているという意味で、変数y、xの反対を行います
* Dxを持つ直線で <0 それは減少するのではなく、Xが増加します.
2. DDAアルゴリズムのフローチャート

3. コードは、アルゴリズムを説明
/* Program create in Linux OS
* nguyenvanquan7826
*/
#include <graphics.h>
#define Round(a) (int)(a+0.5) // lam tron so
#define DELAY 10
int color = RED;
void lineDDA(int x1, int y1, int x2, int y2){ // thuat toan DDA
int x_unit = 1, Dx = x2 - x1, Dy = y2 - y1; // Khoi tao cac gia tri ban dau
int x = x1;
float y = y1;
float m = (float)Dy/Dx; // he so goc m
putpixel(x, Round(y), color);
while(x < x2){
delay(10); // thoi gian tre khi ve 1 diem anh
x += x_unit;
y += m;
putpixel(x,Round(y), color);
}
}
int main(){
int gd,gm=VGAMAX; gd=DETECT;
initgraph(&gd,&gm,NULL); // khoi tao cua so do hoa
setbkcolor(WHITE);
lineDDA(50,150, 300, 200); // ve duong thang
getchar();
return 0;
}
結果は示している
4. すべてのケースのためのコード
次のコードは、描画されます 8 下のセグメント 8 方向, 中心点から始まる.
/* Program create in Linux OS
* nguyenvanquan7826
*/
#include <graphics.h>
#include <stdio.h>
#define Round(a) (int)(a+0.5)
#define DELAY 10
int color = RED;
struct point // diem gom tung do x va hoanh do y
{
int x, y;
};
void lineDDA(int x1, int y1, int x2, int y2) // DDA algorithm
{
int x_unit = 1, Dx = x2 - x1, Dy = y2 - y1; // Init first value
int x = x1;
float y = y1;
float y_unit = 1;
if (Dx < 0)
x_unit = -1;
if (Dy < 0)
y_unit = -1;
if (x1 == x2) // duong thang dung
{
while (y != y2)
{
delay(DELAY);
y += y_unit;
putpixel(x, Round(y), color);
}
}
else if (y1 == y2) // duong ngang
{
while (x != x2)
{
delay(DELAY);
x += x_unit;
putpixel(x, Round(y), color);
}
}
else if (x1 != x2 && y1 != y2)// duong xien
{
float m = (float) abs(Dy) / abs(Dx);
x_unit = 1;
y_unit = m;
x = x1;
y = y1;
if (Dx < 0)
x_unit = -1; // ve x giam
if (Dy < 0)
y_unit = -m; // ve y giam
putpixel(x, Round(y), color);
while(x != x2)
{
delay(10); // thoi gian tre khi ve 1 diem anh
x += x_unit;
y += y_unit;
putpixel(x, Round(y), 1);
}
}
}
int main(){
int gd,gm=VGAMAX; gd=DETECT;
initgraph(&gd,&gm,NULL);
setbkcolor(2);
int x = 200, y = 100;
char s[] = "nguyenvanquan7826";
outtextxy(250,100, s);
point A[9] = {{getmaxx()/2, getmaxy()/2},
{A[0].x-x, A[0].y-y},
{A[0].x-x, A[0].y+y},
{A[0].x+x, A[0].y+y},
{A[0].x+x, A[0].y-y},
{A[0].x, A[0].y-y},
{A[0].x-x, A[0].y},
{A[0].x, A[0].y+y},
{A[0].x+x, A[0].y},
};
for (int i=1; i<9; i++)
{
lineDDA(A[0].x, A[0].y, A[i].x, A[i].y);
}
getchar();
return 0;
}



ありがとう. あなたは、ターボCまたは何で実行このポスト自問してみて? ありがとう
Mình chạy trên terminal của Linux 😀
chua sua dk loi duong thang bi dut doan
あなたはNHE検討します. DDAは、その後、標準です. どこがない不連続
Bị lỗi nét đứt ở các đường thẳng có độ dóc cao. với x2 và x1 quá gần thì đều bị. anh xem lại thử xem!