多边形等距放缩原理与python实现

7 篇文章 0 订阅
2 篇文章 0 订阅

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。
参考:https://blog.csdn.net/happy__888/article/details/315762

在日常图像处理中,经常用到多边形的等距缩放。实现方法有多种,本文介绍一种比较简单的方法,并附上能实现的python代码。效果图如下
红色边框为原图,蓝色为缩放后的图
算法目的:求得两条邻边缩放后的交点坐标
算法思路:
在这里插入图片描述

1.计算两条邻边L1,L2的长度d1,d2
2.求L1,L2的夹角
在这里插入图片描述
3.利用叉积,判断图形的凹凸性
这个参考我另一个博客
4.计算向量v1,v2长度dv
在这里插入图片描述

在这里插入图片描述
5.计算v1,v2向量
用向量V的长度除以向量L的长度,再乘以向量L得出向量V的向量
6.向量PiQi,点Qi的坐标

在这里插入图片描述
在这里插入图片描述

from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data=[[(10,10),(10,20),(15,20),(15,17),(30,15),(25,0),(20,12)]]
sd=-1#安全距离
def Pic(data):
    x = []
    for i in range(len(data)):
        x.append(data[i][0])
    y = []
    for i in range(len(data)):
        y.append(data[i][1])
    return x, y
for i in range(len(data)):
    x, y = Pic(data[i])
    x.append(x[0])  # 增加第一个坐标使得矩形封闭
    y.append(y[0])

    plt.plot(x, y, c='r')

x.append(x[1])

y.append(y[1])
#求两条邻边的向量
new_data=[]
Qi_x_list=[]
Qi_y_list=[]
for i in range(len(x)):
    if i <(len(x)-2):
        #求边的长度
        d1=((x[i+1]-x[i])**2+(y[i+1]-y[i])**2)**0.5
        d2=((x[i+1]-x[i+2])**2+(y[i+1]-y[i+2])**2)**0.5
        #两条边的夹角
        #内积ab,sinA
        #ab=(x[i+1]-x[i])*(y[i+1]-y[i])+(x[i+1]-x[i+2])*(y[i+1]-y[i+2])
        ab = (x[i + 1] - x[i]) * (x[i + 1] - x[i + 2]) + (y[i + 1] - y[i]) * (y[i + 1] - y[i + 2])
        cosA=ab/(d1*d2)

        if cosA>0:
            sinA=(1-cosA**2)**0.5

            # 向量V1,V2的坐标
            dv1 = sd / sinA  # V1,V2长度相等
            v1_x = (dv1 / d1) * (x[i + 1] - x[i])
            v1_y = (dv1 / d1) * (y[i + 1] - y[i])
            v2_x = (dv1 / d2) * (x[i + 1] - x[i + 2])
            v2_y = (dv1 / d2) * (y[i + 1] - y[i + 2])
            PiQi_x = v1_x + v2_x
            PiQi_y = v1_y + v2_y
            Qi_x = PiQi_x + x[i + 1]
            Qi_x_list.append(Qi_x)
            Qi_y = PiQi_y + y[i + 1]
            Qi_y_list.append(Qi_y)
            #new_data.append(zip(Qi_x, Qi_y))
        elif cosA<0:
            # x[]
            # 判断凹凸点(叉积)
            P1P3_x=x[i+2]-x[i]
            P1P3_y=y[i+2]-y[i]
            P1P2_x=x[i+1]-x[i]
            P1P2_y=y[i+1]-y[i]
            #P=P1P3 x P1P2
            P=(P1P3_y*P1P2_x)-(P1P3_x*P1P2_y)
            #为凹时
            if P>0:
                sinA = -((1 - cosA ** 2) ** 0.5)

                #向量V1,V2的坐标
                dv1=sd/sinA#V1,V2长度相等
                v1_x=(dv1/d1)*(x[i+1]-x[i])
                v1_y=(dv1/d1)*(y[i+1]-y[i])
                v2_x = (dv1 / d2) * (x[i+1]-x[i+2])
                v2_y = (dv1 / d2) * (y[i + 1] - y[i + 2])
                PiQi_x=v1_x+v2_x
                PiQi_y=v1_y+v2_y
                Qi_x=PiQi_x+x[i+1]
                Qi_x_list.append(Qi_x)
                Qi_y=PiQi_y+y[i+1]
                Qi_y_list.append(Qi_y)
            elif P<0:
                sinA = -((1 - cosA ** 2) ** 0.5)

                # 向量V1,V2的坐标
                dv1 = -sd / sinA  # V1,V2长度相等
                v1_x = (dv1 / d1) * (x[i + 1] - x[i])
                v1_y = (dv1 / d1) * (y[i + 1] - y[i])
                v2_x = (dv1 / d2) * (x[i + 1] - x[i + 2])
                v2_y = (dv1 / d2) * (y[i + 1] - y[i + 2])
                PiQi_x = v1_x + v2_x
                PiQi_y = v1_y + v2_y
                Qi_x = PiQi_x + x[i + 1]
                Qi_x_list.append(Qi_x)
                Qi_y = PiQi_y + y[i + 1]
                Qi_y_list.append(Qi_y)
        elif cosA==0:

            sinA=1
            print('sinA')
            print(sinA)
            # 向量V1,V2的坐标
            dv1 = sd / sinA  # V1,V2长度相等
            v1_x = (dv1 / d1) * (x[i + 1] - x[i])
            v1_y = (dv1 / d1) * (y[i + 1] - y[i])
            v2_x = (dv1 / d2) * (x[i + 1] - x[i + 2])
            v2_y = (dv1 / d2) * (y[i + 1] - y[i + 2])
            PiQi_x = v1_x + v2_x
            PiQi_y = v1_y + v2_y
            Qi_x = PiQi_x + x[i + 1]
            Qi_x_list.append(Qi_x)
            Qi_y = PiQi_y + y[i + 1]
            Qi_y_list.append(Qi_y)
            #new_data.append(zip(Qi_x, Qi_y))
Qi_x_list.append(Qi_x_list[0])
Qi_y_list.append(Qi_y_list[0])
print(Qi_x_list)
print(Qi_y_list)
plt.plot(Qi_x_list,Qi_y_list)
plt.show()

注:暂时未考虑自交情况

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值