多边形等距缩放

问题描述:将给定多边形进行等距离的缩小或放大
输入:多边形按照逆时针顺序排列的点集,缩放距离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)

如有不足,还请各位大佬不吝赐教

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值