반응형
두 선분의 교점 찾기 /intersection
선분1 ; (x11,y11) to (x12, y12)
선분2 ; (x21,y21) to (x22, y22)
위 두 선분이 주어졌을 때 교점의 좌표를 파이썬 함수로 만들어 보자.
선분 1의 기울기 ; m1
선분2의 기울기 ; m2
따라서 선분1의 직선은 기울기가 m1이고 (x11, y11)점을 지난다.
y = m1 (x-x11) + y11
선분2의 직선은 기울기가 m2이고 (x21,y21)점을 지난다.
y=m2(x-x21)+y21
위 두 직선의 교차점은 x, y가 같게 되므로 위 연립 방정식의 해가 된다.
m1x - m1 x11 + y11 = m2x - m2x21 + y21
(m1-m2)x = m1x11-y11-m2x21+y21
x = (m1x11-y11-m2x21+y21) / (m1-m2)
x를 구했으면 위 아무 방정식에 넣으면 y가 나온다.
y = m1(x-x11)+y11
import numpy as np
import matplotlib.pyplot as plt
def get_crosspt(x11,y11, x12,y12, x21,y21, x22,y22):
if x12==x11 or x22==x21:
print('delta x=0')
return None
m1 = (y12 - y11) / (x12 - x11)
m2 = (y22 - y21) / (x22 - x21)
if m1==m2:
print('parallel')
return None
print(x11,y11, x12, y12, x21, y21, x22, y22, m1, m2)
cx = (x11 * m1 - y11 - x21 * m2 + y21) / (m1 - m2)
cy = m1 * (cx - x11) + y11
return cx, cy
x11 =np.random.randint(1,50)
y11 =np.random.randint(1,50)
x12 =np.random.randint(50,100)
y12 =np.random.randint(50,100)
x21 =np.random.randint(1,50)
y21 =np.random.randint(50,100)
x22 =np.random.randint(50,100)
y22 =np.random.randint(1,50)
plt.figure()
plt.plot([x11,x12], [y11,y12], c='r')
plt.plot([x21,x22], [y21,y22], c='b')
cx, cy = get_crosspt(x11, y11, x12, y12, x21, y21, x22, y22)
plt.plot(cx, cy, 'ro')
plt.show()
선분이 수직, 수평인 경우는 기울기가 0가 되어 문제가 될 수 있다.
이 경우는 따로 처리한다.
# line1:(x11,y11)-(x12,y12) , line2:(x21,y21)-(x22,y22)
def get_crosspt(x11,y11, x12,y12, x21,y21, x22,y22):
if x12==x11 or x22==x21:
print('delta x=0')
if x12==x11:
cx = x12
m2 = (y22 - y21) / (x22 - x21)
cy = m2 * (cx - x21) + y21
return cx, cy
if x22==x21:
cx = x22
m1 = (y12 - y11) / (x12 - x11)
cy = m1 * (cx - x11) + y11
return cx, cy
m1 = (y12 - y11) / (x12 - x11)
m2 = (y22 - y21) / (x22 - x21)
if m1==m2:
print('parallel')
return None
print(x11,y11, x12, y12, x21, y21, x22, y22, m1, m2)
cx = (x11 * m1 - y11 - x21 * m2 + y21) / (m1 - m2)
cy = m1 * (cx - x11) + y11
return cx, cy
나중에 필요에 따라 겹치거나 평행한 경우도 검사해 주어야 한다. 이것은 다음에 직선이 두 점을 양분하는지 체크하면 된다.
'Python' 카테고리의 다른 글
[UI] Qt5 (0) | 2019.05.17 |
---|---|
두 선분의 교차여부 체크 (0) | 2019.04.11 |
모든 성분에 따옴표붙여서 컴마 리스트로 출력하기 (0) | 2019.04.11 |
[Python] enum (0) | 2019.03.28 |
랜덤스트링 만들기 (0) | 2019.03.22 |