主要用到叉乘 编译器为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;
}