通过DDA 算法的伪代码再加上自己的理解实现的VC小程序
呵呵```很简单```
```初学```积累```
伪代码:
procedure DDA( x1, y1, x2, y2: integer);
var
dx, dy, steps: integer;
x_inc, y_inc, x, y: real;
begin
dx :
=
x2
-
x1; dy :
=
y2
-
y1;
if
abs(dx)
>
abs(dy) then

steps :
=
abs(dx);
{steps
is
larger of dx, dy}
else
steps :
=
abs(dy);
x_inc :
=
dx
/
steps; y_inc :
=
dy
/
steps;

{either x_inc or y_inc
=
1.0
, the other
is
the slope}
x:
=
x1; y:
=
y1;
set_pixel(round(x), round(y));
for
i :
=
1
to steps
do
begin
x :
=
x
+
x_inc;
y :
=
y
+
y_inc;
set_pixel(round(x), round(y));
end;

end;
{DDA}
下面是简单的实现```能画任意两点只间的线段:
void
CLineView::DDA(CPoint point_start, CPoint point_end)

{ MessageBox(
"
DDA Line Start!
"
);


CDC
*
pDC
=
GetDC();
int
color
=
RGB(
128
,
128
,
0
);
float
step_x , step_y;
float
dx , dy , k;
dx
=
(
float
)(point_end.x
-
point_start.x);
dy
=
(
float
)(point_end.y
-
point_start.y);
k
=
dy
/
dx;
step_x
=
(
float
)point_start.x;
step_y
=
(
float
)point_start.y;

if
(point_start.x
==
point_end.x)

{
//
平行Y轴的线
//
确定渐进方向
if
(point_start.y
<
point_end.y)

{
for
((
int
)(step_y
=
point_start.y);(
int
)step_y
<=
point_end.y ; step_y
++
)
pDC
->
SetPixel((
int
)step_x,(
int
)step_y,color);
}
else
{
for
(step_y ; step_y
>=
point_end.y ; step_y
--
)
pDC
->
SetPixel((
int
)step_x,(
int
)step_y,color);
}
}
else
if
(point_start.y
==
point_end.y)

{
//
平行X轴的线
//
确定渐进方向
if
(point_start.x
<
point_end.x)

{
for
(step_x ; step_x
<=
point_end.x ; step_x
++
)
pDC
->
SetPixel((
int
)step_x,(
int
)step_y,color);
}
else
{
for
(step_x ; step_x
>=
point_end.x ; step_x
--
)
pDC
->
SetPixel((
int
)step_x,(
int
)step_y,color);
}
}
else
{
//
斜线
if
(abs(k)
<
1
)

{
if
(point_start.x
<
point_end.x)

{
for
(step_x
=
(
float
)point_start.x;step_x
<=
point_end.x ; step_x
++
)

{
pDC
->
SetPixel((
int
)step_x,
int
(step_y
+
0.5
),color);
step_y
+=
k;
}
}
else
{
//
判断斜率符号 确定是增加还是减少
if
(k
>
0
)

{
for
(step_x
=
(
float
)point_start.x ; step_x
>
point_end.x ; step_x
--
)

{
pDC
->
SetPixel((
int
)step_x,(
int
)(step_y
+
0.5
),color);
step_y
+=
k;
}
}
else
{
for
(step_x
=
(
float
)point_start.x ; step_x
>
point_end.x ; step_x
--
)

{
pDC
->
SetPixel((
int
)step_x,(
int
)(step_y
+
0.5
),color);
step_y
-=
k;
}
}
}
}
else
{
if
(point_start.y
<
point_end.y )

{
for
(step_y ; step_y
<
point_end.y ; step_y
++
)

{
pDC
->
SetPixel((
int
)(step_x
+
0.5
) , (
int
)step_y , color);
step_x
=
step_x
+
1
/
k;
}
}
else
{
//
判断斜率符号 确定是增加还是减少
if
(k
>
0
)

{
for
(step_y ; step_y
>
point_end.y ; step_y
--
)

{
pDC
->
SetPixel((
int
)(step_x
+
0.5
) , (
int
)step_y , color);
step_x
+=
1
/
k;
}
}
else
{
for
(step_y ; step_y
>
point_end.y ; step_y
--
)

{
pDC
->
SetPixel((
int
)(step_x
+
0.5
) , (
int
)step_y , color);
step_x
-=
1
/
k;
}
}
}
}
}
ReleaseDC(pDC);

MessageBox(
"
DDA Line End!
"
);
}
这是调用它的响应函数:
void
CLineView::OnMenuitemDDA()

{
CPoint p1(
10
,
50
);
CPoint p2(
200
,
50
);
CPoint p3(
200
,
150
);
CPoint p4(
100
,
200
);
CPoint p5(
250
,
300
);
CPoint p6(
300
,
25
);

DDA(p1,p2);
DDA(p1,p3);
DDA(p1,p4);
DDA(p1,p5);
DDA(p1,p6);
DDA(p2,p3);
DDA(p2,p4);
DDA(p2,p5);
DDA(p2,p6);
DDA(p3,p4);
DDA(p3,p5);
DDA(p3,p6);
DDA(p4,p5);
DDA(p4,p6);
DDA(p5,p6);

MessageBox(
"
OK!
"
);
}
这是运行后的图像:

其实 颜色也可以作为参数传递进去的```不过我没有写```
posted on 2006-11-26 15:34
ornaking 阅读(703)
评论(1) 编辑 收藏 引用 所属分类:
Windows编程