多边形的裁剪算法
网上我看到有很多这样的算法,几乎是差不多,都是一些雷同的程序,没有什么新意,而且有很多的错误,现在我给大家介绍2种,可能有一些错误,希望大家帮我改一改,欢迎大家来提一点宝贵的意见。我的这个是原创如有雷同不胜荣幸,但我觉得是不可能的。我是首次发表文章,可能很多地方考虑不周,以后会不断的改正。
多边形裁剪算法是由Sutherland和hodgman提出的多边形裁剪算法,此方法把被裁减的多边形依次与窗口的各边界
作比较,裁剪去除多余的部分,算法最后的输出是定义裁剪后区域的一组顶点,这些顶点连接起来用彩色或浓淡图案填充。一个多边形区域可用有序的一系列顶点定义。为了裁剪此多边形,可把各顶点依次与窗口边界作比较。在窗口边界内的顶点保留下来,窗口边界外的顶点则排除而不考虑,窗口边界内外两点连线与窗口边界的交点也应保留下来。设相对于某一边界处理的当前点为P,处理的前一点为S,此时有4种可能。
(1)如果S及P均在窗口边界之内,则p点保留。
(2)如果S在窗口内,P在窗口外,则应计算出SP与边界的交点I,并保留此交点。
(3)如果S及P均在窗口边界之外,则排除p点。
(4)如果S在窗口外,P在窗口内,则应计算出SP与边界的交点I,并保留此交点。
第一种算法
#define LEN sizeof(struct node)
#include <math.h>
#include<stdio.h>
#include<graphics.h>
struct node {
int dx,dy;
struct node *next;
};
struct node *creat()
{ struct node *h,*q,*r;
int p[8][2]={100,120,160,50,180,100,200,80,240,160,210,220,170,160,140,190};
int i;
setcolor(12);
for (i=0;i<7;i++) line(p[i][0],p[i][1],p[i+1][0],p[i+1][1]);
line(p[0][0],p[0][1],p[7][0],p[7][1]);
rectangle(120,200,230,70);
h=NULL;
for (i=0;i<8;i++)
{ q=(struct node *)malloc(LEN);
q->dx=p[i][0]; q->dy=p[i][1];
if (h==NULL) h=q;
else r->next=q;
r=q;
}
r->next=NULL;
return(h);
}
struct node *builx(h,x)
struct node *h;
int x;
{int s[2],j[2];
struct node *hh,*p,*r,*q;
int max,min;
p=h; hh=NULL;
s[0]=p->dx; s[1]=p->dy;
p=p->next;
while (p!=NULL)
{ j[0]=x;
j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p-&g