算法思想
1.首先计算出凸多边形的重心点
2.构建原点到重心点的向量,作为参照向量
3.分别计算重心点和各个定点组成的向量与参照向量之间的夹角
4.根据夹角大小进行排序
def tdimSort(plist: List[Point]) = {
//求多边形的重心
val orthocenter = Point(plist.map(_.x).sum / plist.size, plist.map(_.y).sum / plist.size)
val x = orthocenter.x
val y = orthocenter.y
// 计算从v1到v2的夹角公式
// θ=atan2(v1.y,v1.x)−atan2(v2.y,v2.x)
val voatan2 = atan2(y, x)
plist.map(p => {
// 计算向量夹角
val theta: Double = voatan2 - atan2(p.y - y, p.x - x)
(p, theta)
})
.sortBy(_._2).map(_._1) // 根据角度排序(顺逆时针都可以)
}
// 构造点集
val list = List(Point(0, 0), Point(4, 0), Point(0, 4), Point(-4, 2), Point(6, 2), Point(4, 4), Point(-6, 0))
// 方法调用
tdimSort(list).foreach(println)
输出结果
Point(-4.0,2.0)
Point(0.0,4.0)
Point(4.0,4.0)
Point(6.0,2.0)
Point(4.0,0.0)
Point(0.0,0.0)
Point(-6.0,0.0)
如有不当之处,欢迎指正
参考资料
https://blog.csdn.net/csxiaoshui/article/details/73498340?utm_source=copy