凸壳可以看作是点集合的边界。
其精确定义如下:
设集合S是n维空间的k个点组成的集合,即S={x1,x2,...xk},xi是n维向量。
定义S的凸壳Conv(S)为:
Conv(S)={x=λ1*x1+λ2*x2+...+λk*xk | λ1+λ2+ . . .+λk=1}
VC6.0编译运行,实例运行后,打开文件就可以生成凸壳。可以下载学习
这个例程实现凸壳生成功能。
- /* for(j=0;j<pts.GetSize();j++)
- {
- for(k=0;k<final_point.GetSize();k++)
- {
- change_pts.Add( (CPoint)final_point.GetAt(k) );
- }
-
- for(p=0,k=0;k<final_point.GetSize();k++)
- {
- if( pts.GetAt(j)==final_point.GetAt(k) ) p=1;
- }
-
- if(p==0)
- {
- change_pts.Add( (CPoint)pts.GetAt(j) );
- }
- }
-
- */
- pti=(CPoint)change_pts.GetAt(i);
- ptii=(CPoint)change_pts.GetAt(i+1);
- pt_ii=(CPoint)change_pts.GetAt(i-1);
- w=( ptii.x-pti.x ) * ( pti.x-pt_ii.x )+( ptii.y-pti.y ) * ( pti.y-pt_ii.y );
- q1x=(ptii.x-pti.x)*(ptii.x-pti.x); q1y=(ptii.y-pti.y)*(ptii.y-pti.y);
- q2x=(pti.x-pt_ii.x)*(pti.x-pt_ii.x); q2y=(pti.y-pt_ii.y)*(pti.y-pt_ii.y);
- q1cos=w/ ( sqrt(q1x+q1y)*sqrt(q2x+q2y) );
-
-
- for(j=i+1,p=i+1; j<change_pts.GetSize();j++)
- { pt_j_i=(CPoint)change_pts.GetAt(j);
- pti=(CPoint)change_pts.GetAt(i);
-
- w=(pt_j_i.x-pti.x) * (pti.x-pt_ii.x)+(pt_j_i.y-pti.y) * (pti.y-pt_ii.y);
- q1x=(pt_j_i.x-pti.x)*(pt_j_i.x-pti.x);
- q1y=(pt_j_i.y-pti.y)*(pt_j_i.y-pti.y);
-
- q1cos=w/ ( sqrt(q1x+q1y)*sqrt(q2x+q2y) );
-
- if( (q1cos!=1)&&((q1cos-q0cos)>0) )
- {
- q0cos=q1cos; p=j;
- }
- }
- final_point.Add( (CPoint)change_pts.GetAt(p) );
- point_change=(CPoint)final_point.GetAt( final_point.GetSize()-1 );
- i++;
复制代码
|