[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!