在地图制图时,有时需要依据多边形的长轴方向决定文字注记的轴线,如下图
为此达到上述目的,需要计算多边形的长轴方向。对不规则多边形计算长轴方向,一个可行的办法是计算出多边形的最小斜外包矩形,并根据该斜外包矩形的长边,来计算轴线。
斜外包矩形计算的总体思路:
1、设多边形顶点数为n,编号为1-n,以12作为参考边
2、将参考边以起始点(x1,y1)为轴逆时针旋转θ,使得L12边平行于x轴,旋转后的多边形各顶点坐标为(x1,y1),(x2',y2'),……,(xn',yn')
3、外包矩形左下角坐标为(min{xn'},min{yn'}),右上角角坐标为(max{xn'},max{yn'})
4、记录外包矩形的面积,长中轴
5、将外包矩形以起始点(x1,y1)为轴顺时针旋转θ(复原),求得复原后外包矩形的坐标
6、以23、34、……、n1依次作为参考边,重复上述过程
7、最终将面积最小者作为最小斜外包矩形,进行输出
需要用到的公式:
平面内直角坐标系中坐标旋转变换公式
x'=xcos(θ)-ysin(θ)
y'=ycos(θ)+xsin(θ)
由于本需求中,并非对坐标绕坐标系原点旋转,所以需要对上述公式进行变换:
设点(x,y)绕点(x1,y1)逆时针旋转θ角,旋转后的点坐标(x',y')计算公式为:
x'=(x - x1)cos(θ) - (y - y1)sin(θ) + x1
y'=(y - y1)cos(θ) + (x - x1)sin(θ) + y1
对应的,复原时,需要将外包矩形的顶点(x',y')绕点(x1,y1)再顺时针旋转θ角,这样得到的复原后斜外包矩形的顶点坐标(x'',y'')计算公式为:
x'' = (x' - x1)cos(θ) + (y' - y1)sin(θ) + x1
y'' = (y' - y1)cos(θ) - (x' - x1)sin(θ) + y1
多边形与最小斜外包矩形叠加效果如下:
需要留意的是,本算法中,斜外包矩形旋转的角度,局限于原多边形每一条边的方位角,也就是说斜外包矩形一定与多边形的某一条边重合或者平行,但实际情况中,可能存在不平行的情况。考虑到本算法已经能满足生成倾斜注记需要,对这种特殊情况未做进一步优化调整。