求凸包程序 几个问题
#include <stdio.h>#define true 1
#define false 0
struct point2{
double x;
double y;
};
struct edge{
int s; /* number of starting point */
int e; /* number of end point */
};
double d_distance(struct point2 p, struct point2 q, struct point2 r);
int main(){
int edges, points=9, i, j, k, valid; /* edges是边的数 points是点的数 */
struct point2 P[256] = {{0.0,0.0}, {4.0,2.5}, {0.0,2.0}, {5.8,1.2}, {5.6,3.4},
{7.0,1.0}, {3.6,1.4}, {2.0,2.6}, {2.4,0.0}, {1.2,3.8}};
struct edge E[256];
edges=0;
for(i=1;i<=points;j++){ /*(p,q)属于(p*q) */
for(j=1;j<=points;j++){
if(i==j) continue; /* 仅p!=q时 */
valid=true;
for(k=1;k<=points;k++){
if((k==i) || (k==j) continue;
if(d_distance(P[i],P[j],P[k])>0.0){
/*r代表从p到q的有向直线 如果在左边返正值 如果在右边返负值*/
valid=false;
}
}
if(valid==true){
edges++;
E[edges].s=i;
E[edges].e=j;
}
}
}
for(i=1;i<=edges;i++){
printf("Edge[%d]=(%d,%d)/n", i, E[i].s, E[i].e);
}
int L[256], points_of_CH, edge_no;
L[1]=E[1].s; /* E[1]的起点登录到L[1]*/
L[2]=E[1].e; /* E[1]的终点登录到L[2]*/
rm(E,edges,1); edges--; /*从E里把E[1]取出*/
points_of_CH=2;
while(edges>1){
edge_no=find(E,edges,L[points_of_OH]);
points_of_CH++;L[points_of_CH]=E[edge_no].e;
rm(E,edges,edge_no);edges--;
}
for(i=1;i<=points_of_CH;i++){
printf("L[%d]=%d /n", i, L[i]);
}
ruturn 0;
}
问题1
上面的程序中使用的函数 d_distance(), rm(), find() 把它完成
double d_distance(struct point2 p, struct point2 q, struct points2 r)
/* r代表从p到q的有向直线 如果在左边返正值 如果在右边返负值 */
{
····
}
int rm(struct edge E[], int edges, int rm_no) /*从E里把指定的边去除*/
{
····
ruturn (0);
}
int find(struct edge E[], int edges, int pt_no) /*搜索以L的最后的点为起点的边*/
{
····
}
问题2
加上一句代码就能解决 SlowConvexHull的计算量的消减策
程序的***行后面加上****代码