UE4 Geometry Polygon
前人栽树,后人乘凉。
在计算几何中处理多边形的时候,经常会遇到这么一个问题,即给定多边形顶点,确定其顶点环绕顺序及计算多边面积。
多边形面积计算
在直角坐标系下,找到多边形上X坐标最小的点A,以A为起点,顺时针方向,找到下一个点B,计算ABB’A’梯形的面积,梯形的高是B’ - A’,是正值。在以B为起点,计算梯形BCC’B’的面积,顺时针计算小梯形的面积,最后会回到A点(梯形HH’A’A),小梯形的面积和就是多边形的面积。注意:从E点开始,梯形的高就是负值,比如梯形EE’F’F的高是F’-E’,等价于多边形ABCDEE’A’的面积减去AHGFEE’A’的面积。
多边形环绕方向
如上所述,计算多边形面积时,顺时针计算结果为正,逆时针计算结果为负,故可以用来判断给定多边形点的环绕方向。
同时,在UE4中坐标系与常规坐标系不同,故环绕方向与常识上相反。
代码示例
bool IsClockwise(const TArray<FVector>& Polygon)
{
return PolygonArea(Polygon) < 0;
}
float PolygonArea(const TArray<FVector>& Polygon)
{
float A = 0;
const int32 N = Polygon.Num();
for(int32 i = 0; i < N; ++i) {
const auto P0 = Polygon[i];
const auto P1 = Polygon[(i + 1) % N];
A += (P1.X - P0.X) * (P1.Y + P0.Y); //梯形面积计算的形式
}
return A;
}