Microcity——标签位置的确定

在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,就得到了多边形的面积。

公式表达:

\frac{1}{2}\left | \sum_{n}^{i=1}(x_{i}\cdot y_{i+1}-x_{i+1}\cdot y_{i}) \right |

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

至此,标签便可以放置在较为合适的位置,如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值