在Microcity中对各个国家插入标签时,为使标识直观,通常需要调整标签的位置。
本文介绍的是利用Shoelace公式计算每个板块的面积,然后将其放在每个国家最大陆地板块的质心处。
鞋带公式:
这是一种快速且简便计算多边形面积的算法。当已知多边形每个顶点的x、y坐标时,比较适合于计算机中计算图形面积。
例如我们有一个顶点按照顺时针或者逆时针顺序给出的多边形,其顶点分别为(x1,y1),(x2,y2),…,(xn,yn),其中n是顶点的个数,此时我们便可以这样利用鞋带公式进行计算:
计算步骤:
1.将多边形的顶点坐标按顺序排列成两列,每个顶点的x坐标在第一列,y坐标在第二列。将第一个顶点的坐标重复一遍并放到列表的末尾,这样就形成了一个循环。
2.对于每一对相邻的顶点,将上面顶点的x坐标与下面顶点的y坐标相乘,然后求和得到一个值。
3.同样,对于每一对相邻的顶点,将上面顶点的y坐标与下面顶点的x坐标相乘,然后求和得到另一个值。
4.将步骤2和步骤3得到的两个和相减,取其绝对值。
5.最后,将得到的结果除以2,就得到了多边形的面积。
公式表达:
Microcity实现:
首先确定每个国家每个版块的顶点列表集合:
for ... (country:getchildren()) do
points = ... : getvertices()
然后进行数据处理:
for ... do --遍历顶点列表
x,y,z = points[i], points[i+1], points[i+2]
X_sum = x1 + x2 + ... --为计算质心做准备
nextX,nextY = points[i+3], points[i+4]
接着利用鞋带公式计算面积:
area = area + (x * nextY - y * nextX)
area = math.abs(area / 2)
再计算这部分版块的质心位置:
x_centroid = X_sum / 顶点数量
...
最后将每个国家的版块面积依次进行比较,使得标签放置在最大版块的质心位置:
if area > max_area then
max_area = area
至此,标签便可以放置在较为合适的位置,如下图所示: