离散点顺时针重排需要提前约束为凸多边形,若不一定为凸多边形,没有唯一解……本文仅对离散点重排为凸多边形解释。
方法描述:step1,找出离散点最左边一点,即x最小的点p0,这一步保证之后剩余其他的离散点与p0组成边的角度位于(-90,90),
step2,对剩余点依次求斜率,
step3,点的顺序根据斜率的顺序依次从大到小排列,点即按顺时针排列完成。
代码如下:
private IPointCollection getMaxK(IPoint pt, IPointCollection ptcol)
{
if (ptcol.PointCount > 1)
{
//
IPointCollection rPtCol = new PolygonClass();
IPoint rpt = new PointClass();
rpt.X = pt.X;
rpt.Y = pt.Y;
rPtCol.AddPoint(rpt);
while (ptcol.PointCount > 1)
{
int i = this.GetmaxkIndex(pt, ptcol);//斜率最大的点序号索引
if (i != -1)
{
IPoint tpt = new PointClass();
tpt.X = ptcol.get_Point(i).X;
tpt.Y = ptcol.get_Point(i).Y;
rPtCol.AddPoint(tpt);
ptcol.RemovePoints(i, 1);
}
}
return rPtCol;
}
else
{
return null;
}
}