一种计算凸包的算法

主要用到叉乘       编译器为DEV C++

先上代码吧,不懂留言

/*计算输入点的凸包*/

#include<stdio.h>

#include<malloc.h>

//#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;i<n;i++)

 {

   if((c[i].y<minp.y)||(c[i].y==minp.y&&c[i].x<minp.x) )

   {

      minp=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;i<n;i++)

  for(j=i+1;j<n;j++)

  {

   if(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<n;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;i<num;i++)

scanf("%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;i<num;i++)

{

 if(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;

 }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值