问题描述:将给定多边形进行等距离的缩小或放大
输入:多边形按照逆时针顺序排列的点集,缩放距离d
解决方法:
1. 如图所示,已知多边形上任意一点P坐标,等距放大后,得到点Q,求Q点坐标
2. 如图可知,向量PQ 等于 向量v1 与向量v2 之和
3. 向量v1与向量v2 方向分别与L1、L2方向相同,|v1| = |v2| = d/sinα
4. α 为 向量v1与向量v2之间的夹角,sinα = AP× PB / |AP| ·|PB| (叉乘公式)
最终结果如下图所示:
多边形等距缩放python实现
def scal(data,sec_dis):
"""多边形等距缩放
Args:
data: 多边形按照逆时针顺序排列的的点集
sec_dis: 缩放距离
Returns:
缩放后的多边形点集
"""
num = len(data)
scal_data = []
for i in range(num):
x1 = data[(i) % num][0] - data[(i-1) % num][0]
y1 = data[(i) % num][1] - data[(i-1) % num][1]
x2 = data[(i+1) % num][0] - data[(i) % num][0]
y2 = data[(i+1) % num][1] - data[(i) % num][1]
d_A = (x1**2 + y1**2) ** 0.5
d_B = (x2**2 + y2**2) ** 0.5
Vec_Cross = (x1 * y2) - (x2 * y1)
sin_theta = Vec_Cross / (d_A * d_B)
dv = sec_dis / sin_theta
v1_x = (dv / d_A) * x1
v1_y = (dv / d_A) * y1
v2_x = (dv / d_B) * x2
v2_y = (dv / d_B) * y2
PQ_x = v1_x - v2_x
PQ_y = v1_y - v2_y
Q_x = data[(i) % num][0] + PQ_x
Q_y = data[(i) % num][1] + PQ_y
scal_data.append([Q_x,Q_y])
return scal_data
data = [[2.0056,0.9829],[6.9787,0.9829],[4.0369,2.3365],[3.4765,3.7834],[4.4571,5.4871],[6.6986,6.7706],[2.6593,6.7706]]
data1 = scal(data,0.2)
如有不足,还请各位大佬不吝赐教