一種計算凸包的演算法

2021-05-24 12:04:34 字數 2212 閱讀 5251

主要用到叉乘       編譯器為dev c++

/*計算輸入點的凸包*/

#include

#include

//#define n 100;

typedef struct pt

float x,y;

}point;

typedef struct lpt

float x,y;

struct lpt *next;

}lpoint,*lp;

point a[100];

float multi(point p0,point p1,point p2)  {

return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y) ;

float multi2(lpoint p0,lpoint p1,point p2)  {

return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y) ;

void swap(int p1,int p2)

point tempp;

tempp=a[p1];

a[p1]=a[p2];

a[p2]=tempp   ;

void getminy(int n,point c[100])

int i,loc=0;

point minp=c[0];

for(i=1;iif((c[i].yminp=c[i];

loc=i;

swap(0,loc);

//printf("/n/n%f    %f/n/n",a[0].x,a[0].y);

void sort(int n,point a[100])

int i,j;

for(i=1;ifor(j=i+1;jif(multi(a[0],a[i],a[j])<0||(multi(a[0],a[i],a[j])==0&&(((a[i].x-a[0].x)*(a[i].x-a[0].x)+(a[i].y-a[0].y)*(a[i].y-a[0].y))<((a[j].x-a[0].x)*(a[j].x-a[0].x)+(a[j].y-a[0].y)*(a[j].y-a[0].y)))))

swap(i,j) ;

// for(i=0;i// printf("%f       %f/n",a[i].x,a[i].y);

int  main()

int num,i;

lp  bel,top,sectop;

printf("please input the point number:/n") ;

scanf("%d",&num);

printf("please input the point with the form of x+space+y:/n") ;

for(i=0;iscanf("%f %f",&a[i].x,&a[i].y);

getminy(num,a) ;

sort(num,a) ;

bel=(lpoint*)malloc(sizeof(lpoint));

bel->x=a[0].x;

bel->y=a[0].y;

sectop=(lpoint*)malloc(sizeof(lpoint));

bel->next=sectop;

sectop->x=a[1].x;

sectop->y=a[1].y;

top=(lpoint*)malloc(sizeof(lpoint));

sectop->next=top;

top->x=a[2].x;

top->y=a[2].y;

top->next=null;

for(i=3;iif(multi2(*sectop,*top,a[i])>=0)

sectop=top;

top=(lpoint*)malloc(sizeof(lpoint));

sectop->next=top;

top->next=null;

top->x=a[i].x;

top->y=a[i].y;

else

top->x=a[i].x;

top->y=a[i].y;

while(bel!=null)

printf("%f/t%f /n",bel->x,bel->y) ;

bel=bel->next;

getch();

return 0;

凸包問題一種解法

凸包問題 凸包問題,即在一頂點的集合中找到一些點,使這些點構成的凸多邊形能將所有其它頂點包含在內 解決思想 顯然這些點中最左下 左上 右下 右上方的點一定包含在解集合裡 一些頂點構成的凸多邊形包含其它所有頂點等價於其它頂點都在它的邊所在直線的一邊,在構造解時由於已知一些頂點 如g 可遍歷其它頂點a構...

計算幾何 凸包演算法

凸包演算法總結 凸包是指覆蓋平面座標系內若干點的面積最小的凸多邊形。求凸包的第一步是確定 凸包的定點都在給定的點中。通過幾何方法反證很容易得到這一結論。所以,只要從所有點中挑選若干正確的點,按順序 順時針或逆時針 排列,就相當與求得了凸包。計算幾何中的凸包問題程式 graham演算法 include...

計算幾何 凸包演算法 收藏

計算幾何 凸包演算法 收藏 計算幾何中的凸包問題程式 graham演算法 i nclude i nclude i nclude define maxn 10000 頂點的型別定義 typedef struct point1 int n 頂點的個數 point1 points maxn 頂點陣列 in...