标题:[求助]求一个中点画线法的源码
只看楼主
neverDie
Rank: 1
等 级:新手上路
威 望:1
帖 子:123
专家分:0
注 册:2007-5-5
 问题点数:0 回复次数:6 
[求助]求一个中点画线法的源码
网上所谓的中点画线都是基于 1象限且斜率<1 的。
要兼顾8个方向的源程序。

语言不限(最好用graphic图形库),自己也写了个,但是在其他象限上仍然有些问题。
搜索更多相关主题的帖子: 源码 点画 
2007-11-11 19:10
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
得分:0 
其他情况都可以转换到第一种情况

上善若水,水善利万物而不争,处众人之所恶
2007-11-11 21:31
neverDie
Rank: 1
等 级:新手上路
威 望:1
帖 子:123
专家分:0
注 册:2007-5-5
得分:0 
以下是引用diaoxue在2007-11-11 21:31:34的发言:
其他情况都可以转换到第一种情况

这我当然知道,问题是方法!


2007-11-12 16:20
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
得分:0 
回复:(neverDie)以下是引用diaoxue在2007-11-11 21...

这好像是计算机图形学中的作业题
就是说 比如斜率k<1和斜率k>1的关系就是把x的增量和y的增量交换
别的情况有的要交换起点和终点的坐标值


上善若水,水善利万物而不争,处众人之所恶
2007-11-18 14:35
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
楼上说的似乎是DDA算法。

中点算法跟bresenham算法类似,但是仍然用到了浮点运算。
代码没写过,也仅仅晓得原理。

Fight  to win  or  die...
2007-11-18 14:39
冰烨
Rank: 1
来 自:不咔界
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2007-10-30
得分:0 

学图形学时候写的。。。看看吧TC2.0运行通过,三种算法,第三种我用中点分割做的, 不知道和你所说的中点是不是一样的


#include<math.h>
#include<dos.h>
#include<stdio.h>
#include<graphics.h>
main(){
void DDAline(int,int,int,int);
void Bline(int,int,int,int);
void MiddlePoint(int,int,int,int);
int gd=VGA,gm=VGAHI;
int i=1;
int x1,y1,x2,y2,n;
float a1,a2,r;
struct time runtime1,runtime2,runtime3,runtime4,runtime5,runtime6;
initgraph(&gd,&gm,"c:\\tc");

setcolor(12);
printf("StartPoint and EndPoint:");
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
line(0,240,640,240);
line(320,0,320,480);
gettime(&runtime1);
for(i=1;i<10;i++){
DDAline(x1,y1,x2,y2);
DDAline(-x1,y1,-x2,y2);
DDAline(x1,-y1,x2,-y2) ;
DDAline(-x1,-y1,-x2,-y2);
DDAline(y1,x1,y2,x2);
DDAline(-y1,x1,-y2,x2);
DDAline(y1,-x1,y2,-x2);
DDAline(-y1,-x1,-y2,-x2);
}
gettime(&runtime2);

getch();
gettime(&runtime3);
for(i=1;i<10;i++){
Bline(x1,y1,x2,y2);
Bline(-x1,y1,-x2,y2);
Bline(x1,-y1,x2,-y2);
Bline(-x1,-y1,-x2,-y2);
Bline(y1,x1,y2,x2);
Bline(-y1,x1,-y2,x2);
Bline(y1,-x1,y2,-x2);
Bline(-y1,-x1,-y2,-x2);
}
gettime(&runtime4);

getch();

gettime(&runtime5);
for(i=1;i<10;i++){
MiddlePoint(x1,y1,x2,y2);
MiddlePoint(-x1,y1,-x2,y2) ;
MiddlePoint(x1,-y1,x2,-y2) ;
MiddlePoint(-x1,-y1,-x2,-y2) ;
MiddlePoint(y1,x1,y2,x2) ;
MiddlePoint(-y1,x1,-y2,x2) ;
MiddlePoint(y1,-x1,y2,-x2) ;
MiddlePoint(-y1,-x1,-y2,-x2);
}
gettime(&runtime6);

printf("\n\n\n\n DDA begin: %d %d\n",runtime1.ti_sec,runtime1.ti_hund);
printf(" DDA end: :%d %d\n",runtime2.ti_sec,runtime2.ti_hund);
printf(" B begin: :%d %d\n",runtime3.ti_sec,runtime3.ti_hund);
printf(" B end: :%d %d\n",runtime4.ti_sec,runtime4.ti_hund);
printf(" Mid begin: :%d %d\n",runtime5.ti_sec,runtime5.ti_hund);
printf(" Mid end: :%d %d\n",runtime6.ti_sec,runtime6.ti_hund);
getch(); closegraph();
}
void DDAline(int x1,int y1,int x2,int y2){
int steps,i;
float dx,dy,x,y;

x=x1+0.5;y=y1+0.5;
steps=abs(x2-x1)>=abs(y2-y1)?abs(x2-x1):abs(y2-y1);
dx=(float)(x2-x1)/steps;
dy=(float)(y2-y1)/steps;
for(i=0;i<=steps;i++){
putpixel((int)(320+x),(int)(240-y),4);
x+=dx;y+=dy;
}
}
void Bline(int x1,int y1,int x2,int y2){
int e,dx,dy,x,y,i,xsign,ysign,interchange=0,temp;
x=x1;y=y1;

dx=abs(x2-x1);
dy=abs(y2-y1);
if(dx<dy){
temp=dx;dx=dy;dy=temp;interchange=1;}
xsign=(x1<x2)?1:-1;
ysign=(y1<y2)?1:-1;
e=-dx;
for(i=0;i<=dx;i++){
putpixel(320+x,240-y,15);
e+=2*dy;
if(e>=0){
e-=2*dx;
if(interchange)
x+=xsign;
else
y+=ysign;
}

if(interchange)
y+=ysign;
else x+=xsign;
}
}

void MiddlePoint(int x1,int y1,int x2,int y2){//中点分割
int x,y;
if(abs(x1-x2)>1&&abs(y1-y2)>1){
x=(x1+x2)/2;
y=(y1+y2)/2;
putpixel(320+x,240-y,30);
MiddlePoint(x1,y1,x,y);
MiddlePoint(x,y,x2,y2);
}
}


要么死去,要么奋斗!
2007-11-18 19:50
neverDie
Rank: 1
等 级:新手上路
威 望:1
帖 子:123
专家分:0
注 册:2007-5-5
得分:0 

感谢楼上


2007-11-18 20:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-185305-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.192682 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved