项目记录-凸包修正

圆的凸包修正思路:

依据圆形边界上各点的坐标容易算出圆的外围矩形的左上角顶点O的坐标(lx, ly)

项目记录-凸包修正_第1张图片

以O点为原点,重新给所有点进行排序,排序的规则如下:
OA方向越靠近垂直方向,则排序越靠前;
如果OA和OB在一条直线上,则比较|OA|和|OB|的大小,如果|OA|小,A距离O点更近,则A排序靠前。

项目记录-凸包修正_第2张图片

(更理论的说法是依据极坐标系下的坐标值进行排序,具体如下:以O点为原点,创建极坐标系,对圆上每个点,依据直角坐标系中的坐标值推算出极坐标系下的坐标。如果A点在极坐标系下的角度值更大,或者角度值相等情况下半径值更小,则A点排序靠前。)

具体实现时,比较半径的方法就是计算两点的距离,至于比较角度,下面需要详细说明:

两个点之间的角度比较方法是做叉积,OA×OB=|OA|*|OB|*sin(OA到OB的夹角)。从公式容易看出,如果OA×OB叉积结果为负数,表示OA到OB的夹角超过了180度,对应到图中的情况只可能是A在极坐标系下的角度值大于了B的角度值。

排完序之后,需要计算相邻点的凸包性,方法也是使用上面的叉积,每判断一个点C时,和最近确定了的两个点A,B进行进行计算,如果CB×CA为非正数,则表示A,B,C为凹形,C点需要剔除掉。

这样遍历之后余下的就是符合凸形的样本点了,依据这些样本点继续做插值可以得到近似的圆形了。

你可能感兴趣的:(项目问题记录)