求tc 下的多边形裁剪算法的源代码
答案:4 悬赏:10 手机版
解决时间 2021-02-24 16:51
- 提问者网友:雨不眠的下
- 2021-02-24 09:09
求tc 下的多边形裁剪算法的源代码
最佳答案
- 五星知识达人网友:举杯邀酒敬孤独
- 2021-02-24 10:46
#include
#include
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");
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);
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;
int86(0x33,&i,&o);
*x=o.x.cx;
*y=o.x.dx;
return o.x.bx;
}
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 )
{
int i;
for(i=1;i<=4;i++) c[i]=0;
if(x
if(x>xr) c[3]=1;
if(y
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)
{
int i;
for(i=1;i<=4;i++)
{
if(c1[i]*c2[i]==1) return 1;
}
return 0;
}
int logic2_ride(int *c)
{
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 c1[5],c2[5],c[5],p,x0,y0,ultra_x,ultra_y,t;
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);
putpixel(lx,ly,BLACK);
}
}
void main()
{
int x[100],y[100];
init();
draw(x,y);
}参考资料:忘记
#include
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");
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);
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;
int86(0x33,&i,&o);
*x=o.x.cx;
*y=o.x.dx;
return o.x.bx;
}
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 )
{
int i;
for(i=1;i<=4;i++) c[i]=0;
if(x
if(x>xr) c[3]=1;
if(y
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)
{
int i;
for(i=1;i<=4;i++)
{
if(c1[i]*c2[i]==1) return 1;
}
return 0;
}
int logic2_ride(int *c)
{
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 c1[5],c2[5],c[5],p,x0,y0,ultra_x,ultra_y,t;
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);
putpixel(lx,ly,BLACK);
}
}
void main()
{
int x[100],y[100];
init();
draw(x,y);
}参考资料:忘记
全部回答
- 1楼网友:狂恋
- 2021-02-24 14:17
明天给你
- 2楼网友:十鸦
- 2021-02-24 12:38
VC的以前做过
代码找不到了 不然可以发给你参考下
代码找不到了 不然可以发给你参考下
- 3楼网友:执傲
- 2021-02-24 11:12
#include
#include
#include
#include
#include
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();
}
#include
#include
#include
#include
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();
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯