python计算闵科夫斯基和

找了半天网上只有两种版本的计算闵科夫斯基和

夏天大佬的c++闵科夫斯基和这个大佬的闵科夫斯基和更好理解

饕餮传奇大佬的c++闵科夫斯基和这个大佬讲的更加细致,同时他的博客里还有很多其他的数学计算的讲解,挺好的(比如极角排序)

注意,该方法对输入点集的顺序有要求,必须要是逆时针顺序输入点集才行
当然。。。这也就叉乘判断一下,然后一个reverse就能解决问题的了

import math
import time


def Minkowski_sum(rec1, rec2):
    vectors=[]
    ans=[]

    #
    tmp_rec=rec1
    init_point1=rec1[0]
    for i in range(len(tmp_rec)):
        point=tmp_rec[i]
        if init_point1[1]==point[1] and init_point1[0]>point[0]:
            init_point1=point
        if point[1]>init_point1[1]:
            init_point1=point
        if i>0:
            vectors.append([tmp_rec[i][0] - tmp_rec[i - 1][0], tmp_rec[i][1] - tmp_rec[i - 1][1]])
        if i==len(tmp_rec)-1:
            vectors.append([tmp_rec[0][0] - tmp_rec[i][0], tmp_rec[0][1] - tmp_rec[i][1]])

    tmp_rec=rec2
    init_point2=rec2[0]
    for i in range(len(tmp_rec)):
        point=tmp_rec[i]
        if init_point2[1]==point[1] and init_point2[0]>point[0]:
            init_point2=point
        if point[1]>init_point2[1]:
            init_point2=point
        if i>0:
            vectors.append([tmp_rec[i][0] - tmp_rec[i - 1][0], tmp_rec[i][1] - tmp_rec[i - 1][1]])
        if i==len(tmp_rec)-1:
            vectors.append([tmp_rec[0][0] - tmp_rec[i][0], tmp_rec[0][1] - tmp_rec[i][1]])

    tmp_point=[init_point1[0]+init_point2[0],init_point1[1]+init_point2[1]]
    ans.append([tmp_point[0],tmp_point[1]])


    tmp_cmp=[]
    for i in range(len(vectors)):
        tmp_cmp.append([math.atan2(vectors[i][1],vectors[i][0]),vectors[i]])
    tmp_cmp=sorted(tmp_cmp,key= lambda tmp:tmp[0])
    # for i in tmp_cmp:
    #     print(i[0],i[1].x,i[1].y)
    vectors=[]
    for i in range(1,len(tmp_cmp)):
        if tmp_cmp[i][0]==tmp_cmp[i-1][0]:
            tmp_cmp[i][1][0]+=tmp_cmp[i-1][1][0]
            tmp_cmp[i][1][1]+=tmp_cmp[i-1][1][1]
        else:
            vectors.append(tmp_cmp[i-1][1])
    vectors.append(tmp_cmp[len(tmp_cmp)-1][1])


    for i in range(len(vectors)-1):
        tmp_point[0]+=vectors[i][0]
        tmp_point[1]+=vectors[i][1]
        ans.append([tmp_point[0],tmp_point[1]])

    return ans

def main():
    a=[]
    a.append([0,0])
    a.append([2,3])
    a.append([-3,1])

    b=[]
    b.append([0,0])
    b.append([1,1])
    b.append([0,4])
    b.append([-2,3])

    c=Minkowski_sum(a,b)
	print(c)

if __name__ == '__main__':
    start_time=time.time()*1000
    main()
    end_time=time.time()*1000
    print('time ',(end_time-start_time),' ms ')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值