求tc 下的多边形裁剪算法的源代码

要c语言源代码,我的邮箱是hexun2005@sohu.com,可以发我邮箱,谢谢!... 要c语言源代码,我的邮箱是hexun2005@sohu.com,可以发我邮箱,谢谢! 展开
 我来答
云深不知处择言7247
2007-12-17
知道答主
回答量:2
采纳率:0%
帮助的人:0
展开全部
#include <graphics.h>

#include <dos.h>

union REGS i,o;

int xl=100,xr=540,yb=400,yt=200; /*方框边界*/

void init()

{

int driver=DETECT,gm;

initgraph(&driver,&gm,"");

printf("Instruction:\n");

printf("1.Press left mouse button to set the vertex;\n");

printf("2.Press right button to end drawing;\n");

/*printf("3.Press both button to clip.");*/

outtextxy(450, 440, "Edit by lcf&hy!");

setwritemode(2);

line(0,70,639,70);

setcolor(YELLOW);

rectangle(xl,yt,xr,yb);

i.x.ax=0;

int86(0x33,&i,&o);

if(o.x.ax==0)

{

printf("Mouse is not available...");

getch();

exit();

}

i.x.ax=1;

int86(0x33,&i,&o);

/*设置光标可用范围(Y方向)*/

i.x.ax=8;

i.x.cx=71;

i.x.dx=479;

int86(0x33,&i,&o);

}

int mousestatus(int *x,int *y)

{

i.x.ax=3; /*查询鼠标状态功能号为03H*/

int86(0x33,&i,&o);

*x=o.x.cx; /*鼠标横坐标 */

*y=o.x.dx; /*鼠标纵坐标 */

return o.x.bx; /*返回按键情况:0-NONE,1-LEFT,2-RIGHT,3-BOTH; */

}

void endpro() /*结束裁剪*/

{

char s[50]="Press any key to exit...";

setcolor(WHITE);

outtextxy(200,120,s); /*此处有可能出现乱码,正常现象,出现概率随机*/

getch();

closegraph();

exit();

}

void code(int x,int y,int *c )

{/*c为5元数组*/

int i;

for(i=1;i<=4;i++) c[i]=0;

if(x<xl) c[4]=1;

if(x>xr) c[3]=1;

if(y<yt) c[1]=1;

if(y>yb) c[2]=1;

}

void cut(int x1,int y1,int x2,int y2)/*把不需要的线置为黑色,不可见*/

{

setcolor(BLACK);

setlinestyle(0, 0, 3); /*设置三点宽实线*/

line(x1,y1,x2,y2);

}

int logic_ride(int *c1,int *c2)/*判断逻辑乘是否为0,是则返回0,否则返回1*/

{

int i;

for(i=1;i<=4;i++)

{

if(c1[i]*c2[i]==1) return 1;

}

return 0;

}

int logic2_ride(int *c)/*在内部则返回1,否则返回0*/

{

int m;

for(m=0;m<=4;m++)

if(c[m]==1) return 0;

return 1;

}

void clip(int *x,int *y,int k)

/*裁剪函数,如果某个线段不在可视区,我们将其颜色置为黑色,否则不作颜色改变*/

{

/*int i;

for(i=1;i<=k;i++)

printf("%d,%d\n",x[i],y[i]);*/ /*此段代码检测模板存入的数据没错*/

int c1[5],c2[5],c[5],p,x0,y0,ultra_x,ultra_y,t;/*x0,y0储存临时交点*/

x[k+1]=x[1];y[k+1]=y[1];

for(p=1;p<=k;p++)

{

code(x[p],y[p],c1);

code(x[p+1],y[p+1],c2);

if(logic_ride(c1,c2)) cut(x[p],y[p],x[p+1],y[p+1]);/*完全不可见,则完全剪除*/

else if(logic2_ride(c1)==1&&logic2_ride(c2)==1) ;/*排除一种情况*/

else /*不完全在里面,也不完全在外面*/

{

if(logic2_ride(c1)!=1)/*起点在外面*/

{

t=1;

while(t)

{

if(logic_ride(c,c2)) {cut(x[p],y[p],x[p+1],y[p+1]);break;}/*完全不可见,则完全剪除*/

else

{

if(c1[4]==1)/*判断四边的情况*/

{

x0=xl;

y0=y[p]+(y[p+1]-y[p])*(xl-x[p])/(x[p+1]-x[p]);

}

else if(c1[3]==1)

{

x0=xr;

y0=y[p]+(y[p+1]-y[p])*(xr-x[p])/(x[p+1]-x[p]);

}

else if(c1[1]==1)

{

y0=yt;

x0=x[p]+(x[p+1]-x[p])*(yt-y[p])/(y[p+1]-y[p]);

}

else if(c1[2]==1)

{

y0=yb;

x0=x[p]+(x[p+1]-x[p])*(yb-y[p])/(y[p+1]-y[p]);

}

cut(x[p],y[p],x0,y0);

x[p]=x0;y[p]=y0; code(x0,y0,c);

if(logic2_ride(c)==1) t=0;

}

}

}

if(logic2_ride(c2)!=1)/*终点在外面*/

{

t=1;

if(c2[4]==1)/*判断四边的情况*/

{

x0=xl;

y0=y[p]+(y[p+1]-y[p])*(xl-x[p])/(x[p+1]-x[p]);

}

else if(c2[3]==1)

{

x0=xr;

y0=y[p]+(y[p+1]-y[p])*(xr-x[p])/(x[p+1]-x[p]);

}

else if(c2[1]==1)

{

y0=yt; x0=x[p]+(x[p+1]-x[p])*(yt-y[p])/(y[p+1]-y[p]);

}

else if(c2[2]==1)

{

y0=yb; x0=x[p]+(x[p+1]-x[p])*(yb-y[p])/(y[p+1]-y[p]);

}

cut(x0,y0,x[p+1],y[p+1]);

code(x0,y0,c);

if(logic2_ride(c)==0)

{

if(c[4]==1)/*判断四边的情况*/

{

ultra_x=xl;

ultra_y=y0+(y[p+1]-y0)*(xl-x0)/(x[p+1]-x0);

}

else if(c[3]==1)

{

ultra_x=xr;

ultra_y=y0+(y[p+1]-0)*(xr-0)/(x[p+1]-x0);

}

else if(c[1]==1)

{

ultra_y=yt;

ultra_x=x0+(x[p+1]-x0)*(yt-y0)/(y[p+1]-y0);

}

else if(c[2]==1)

{

ultra_y=yb;

ultra_x=x0+(x[p+1]-x0)*(yb-y0)/(y[p+1]-y0);

}

cut(x0,y0,ultra_x,ultra_y);

}

}

}

}

endpro();

}

void draw(int *x,int *y)

{

int k=0,lx,ly,color,i;

int tempx,tempy;

while(1){

/*描点并存储顶点*/

if(mousestatus(&tempx,&tempy)==1)

{

if(x[k]!=tempx||y[k]!=tempy) k++; /*这一步有关键,想想看为什么?*/

x[k]=tempx;

y[k]=tempy;

setcolor(WHITE);

circle(tempx,tempy,1);

if (k!=1)

{

setcolor(WHITE);

line(x[k-1],y[k-1],x[k],y[k]);

}

}

lx=tempx,ly=tempy;

if(mousestatus(&tempx,&tempy)==2) /*如果按下右键*/

{

line(x[1],y[1],x[k],y[k]);

clip(x,y,k);

}

putpixel(tempx,tempy,WHITE);/* trace the mouse,*/

putpixel(lx,ly,BLACK);

}

}

void main()

{

int x[100],y[100];

init();

draw(x,y);

}

参考资料: 忘记

ZESTRON
2024-09-04 广告
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸... 点击进入详情页
本回答由ZESTRON提供
萌哒牛
2007-12-15 · TA获得超过1910个赞
知道小有建树答主
回答量:1100
采纳率:0%
帮助的人:136万
展开全部
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
#include<alloc.h>
#include<math.h>
main()
{
void *ptr;
int gd=DETECT;
int gm;
float i;
initgraph(&gd,&gm,"d:\\tc");
setactivepage(1);
setcolor(RED);
setfillstyle(1,14);
fillellipse(10,10,10,10);
ptr=malloc(imagesize(0,0,20,20));
getimage(0,0,20,20,ptr);
randomize();
setactivepage(0);
for (i=0;i<3000;i++)
putpixel(random(640),random(480),random(15));
for (i=0;i<6.28*4;i=i+0.005)
{
putimage(300+8*(cos(i)+i*sin(i)),240+6*(sin(i)-i*cos(i)),ptr,COPY_PUT);
putimage(300+8*(cos(i)+i*sin(i)),240+6*(sin(i)-i*cos(i)),ptr,COPY_PUT);
if (kbhit())
break;
delay(10);
}
getch();
closegraph();
}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
华蓝
2007-12-11 · TA获得超过179个赞
知道小有建树答主
回答量:266
采纳率:0%
帮助的人:231万
展开全部
VC的以前做过
代码找不到了 不然可以发给你参考下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友7d9494a47
2007-12-12 · TA获得超过286个赞
知道答主
回答量:190
采纳率:0%
帮助的人:126万
展开全部
明天给你
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式