Python:有一组坐标点A和另外一组坐标点B是对应的,还有一组坐标点C和另外一组坐标点D是对应的,求AB和CD中重复的部分

我的解答思路和尝试过的方法

有一组坐标点A和另外一组坐标点B是对应的,还有一组坐标点C和另外一组坐标点D是对应的,求AB和CD中重复的部分

我想要达到的结果

有一组坐标点A和另外一组坐标点B是对应的,还有一组坐标点C和另外一组坐标点D是对应的,求AB和CD中重复的部分

用set集合求交集即可
你题目的解答代码如下:

A=[(1,2),(7,9),(10,12)]
B=[(8.5,2.6),(0.6,9.3),(12.5,12)]
C=[(0.6,9.3),(12.5,12),(2,4)]
D=[(7,9),(10,12),(5,6)]

li = list(zip(set(A) & set(D), set(B) & set(C)))
print(li)

img

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img


import functools
from functools import cmp_to_key


class SegmentsIntersect(object):
    def __init__(self,p1,p2,q1,q2):
        self.result = self.judge_segments_intersect(p1,p2,q1,q2)
    
    def __sort_by_coordiante(self,x1,x2,k):
        if x1[k] < x2[k]:
            return -1
        elif x1[k] == x2[k]:
            return 0
        else:
            return 1
    
    def judge_segments_intersect(self,p1,p2,q1,q2):
        p = self.minus(p2,p1)
        q = self.minus(q2,q1)
        
        denominator = self.crossmultiply(p,q)  # p × q
        t_molecule = self.crossmultiply(self.minus(q1,p1),q)  # (q1 - p1) × q
        
        if denominator == 0:
            if t_molecule == 0:  # 分子分母都为零时,共线
                p_q = [p1,p2,q1,q2]
                if p1 != q1 and p1 != q2 and p2 != q1 and p2 != q2:
                    p_q = sorted(p_q,key = cmp_to_key(functools.partial(self.__sort_by_coordiante,
                                                                        k = 1 if (p2[0] - p1[0]) / (p2[1] - p1[
                                                                            1]) == 0 else 0)))  # 当线段平行于y轴时,需要用y坐标来排序
                    if p_q[0:2] == [p1,p2] or p_q[0:2] == [p2,p1] or p_q[0:2] == [q1,q2] or p_q[0:2] == [q2,
                                                                                                         q1]:  # 共线+没有交点的情况
                        return "没有重合部分"
                    else:
                        result=[]
                        
                        if sum(p1)<sum(q1):
                            result.append(q1)
                        else:
                            result.append(p1)
                        if sum(p2)>sum(q2):
                            result.append(q2)
                        else:
                            result.append(p2)
                        return f"重合:{result}"
                else:  # 共线+端点重合,可以继续细分为两对端点都重合(相同线段)or只有一对端点重合 这两种情况
                    result = []
                    if sum(p1)==sum(q1):
                        result=q1
                    else:result=q2
                    return f"交点:{result}"
            else:  # 分母为零,分子不为零,平行
                return "没有重合部分"
        
        t = t_molecule / denominator
        if t >= 0 and t <= 1:
            u_molecule = self.crossmultiply(self.minus(q1,p1),p)  # (q1 - p1) × p
            u = u_molecule / denominator
            if u >= 0 and u <= 1:  # t, u都满足[0,1]区间,返回交点坐标
                
                return f"交点:{self.plus(p1,self.nummultiply(t,p))}"
            else:  # u超出区间,则相离
                return "没有重合部分"
        else:  # t超出区间,则相离
            return "没有重合部分"

    # 向量相加
    def plus(self,a,b):
        c = []
        for i,j in zip(a,b):
            c.append(i + j)
        return c

    # 向量相减
    def minus(self,a,b):
        c = []
        for i,j in zip(a,b):
            c.append(i - j)
        return c

    # 向量叉乘
    def crossmultiply(self,a,b):
        return a[0] * b[1] - a[1] * b[0]

    # 向量数乘
    def nummultiply(self,x,a):
        c = []
        for i in a:
            c.append(x * i)
        return c


print(SegmentsIntersect([0,0],[0,1],[0,1],[0,3]).result)  # collinear part coincide

print(SegmentsIntersect([0,0],[0,2],[0,1],[0,3]).result)  # collinear part coincide

print(SegmentsIntersect([0,0],[2,2],[1,1],[3,3]).result)  # collinear part coincide

print(SegmentsIntersect([0,0],[1,1],[2,2],[3,3]).result)  # collinear separation

print(SegmentsIntersect([0,0],[1,1],[1,0],[2,1]).result)  # parallel

print(SegmentsIntersect([0,0],[2,2],[1,0],[0,1]).result)  # [0.5, 0.5]

print(SegmentsIntersect([0,0],[1,2],[1,0],[0,1]).result)  # [0.3333333333333333, 0.6666666666666666]

print(SegmentsIntersect([0,0],[1,3],[1,0],[0,1]).result)  # [0.25, 0.75]

print(SegmentsIntersect([1,0],[1,2],[0,3],[2,3]).result)  # separation

print(SegmentsIntersect([0,0],[0,2],[1,1],[2,1]).result)  # separation

有帮助请点一下右上角的采纳,谢谢

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632