[Shool_DHMT] DDA算法划清界线
内容
1. 构建算法
2. 流程图算法
3. 代码插图
4. 所有病例码
阅读更多
1. 画直线的一般原则
2. 算法Breshenham画直线
3. 中点算法划清界线
1. 建设DDA算法 (数字DifferentialAnalyzer)
给 2 端点M1 (X1, Y1), M2(X2, Y2) 和油漆Ç.
在所有 画直线的一般原则 我们已经建立了表格的直线方程:
为了简化算法,我们考虑与行
在对x的增加每一步都有一个 1 即单位
* 因为m是一个实数应该想 它必须是一个整数获取坐标,使屏幕前,圆.
* 用直线米 > 1 我会做相反的变量Y和X在这个意义上,在每一个环节我们都
* 与直线采用DX <0 这将减少而不是增加X.
/* 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; }
谢谢. 问问自己这个帖子,你运行的Turbo C或什么? 谢谢
Mình chạy trên terminal của Linux 😀
chua sua dk loi duong thang bi dut doan
你离线查看. DDA là chuẩn rồi. Ko có đứt đoạn đâu
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!