有一组坐标点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)
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
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
有帮助请点一下右上角的采纳,谢谢