반응형

두 선분의 교점 찾기 /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
반응형

[mysql] 쿼리시 스트링을 수타입으로 정렬하기


mysql에서 쿼리시 특정 필드로 소팅 조회할 때, 숫자가 스트링인 필드일 경우, 스트링 타입으로 정렬이 된다. 

이럴 경우, 1, 10, 100이 2보다 작게 된다. (스트링 대소 비교)

따라서 넘버 타입으로 캐스팅하여 정렬하는 것이 필요하다.


select  * from MyTable order by cast(Num as unsigned) ;

or

select * from MyTable order by Num+0 ;





반응형

모든 성분에 따옴표붙여서 컴마 리스트로 출력하기

a=["abc", "def", "ghi"]

위 리스트의 요소들을 각각 따옴표 씌워 컴마를 구분자로 한 스트링을 생성하려면?


b=",".join( list( map(lambda x: '"'+x+'"', a) ) )

Out[70]: '"abc","def","ghi"'


좀 더 간단하게

b=",".join('"'+x+'"' for x in a)

Out[72]: '"abc","def","ghi"'



'Python' 카테고리의 다른 글

두 선분의 교차여부 체크  (0) 2019.04.11
두 선분의 교점 찾기  (0) 2019.04.11
[Python] enum  (0) 2019.03.28
랜덤스트링 만들기  (0) 2019.03.22
matplotlib subplot 화면분할 grid로 분할하기  (0) 2019.03.22

+ Recent posts