본문 바로가기
파이썬으로 풀어보는 고딩수학/평면좌표

수직으로 만나는 점, 직선 구하기

by hustler78 2023. 12. 18.
728x90
반응형

 

이번 글은 수직으로 만나는 직선에 관련된 내용이야. sympy에서는 수직과 관련된 몇몇 툴을 제공해 주는데, 예제를 통해서 어떤 기능들이 있는지 한번 보자고.

 

 

문제 1

직선 $y= \frac12 x+4$와 $x$축에서 수직으로 만나는 직선을 구하여라.

 

아주 간단한 내용이야. 거의 암산으로도 될 지경이지. 일단 $y=\frac12x+4$와 수직으로 만나는 직선의 기울기는 $-2$가 되어야 하고, $x$축에서 수직으로 만난다고 했으므로 위 직선의 $x$절편인 $(-8,0)$을 지나야 함. 따라서

$$ y= -2(x+8)$$

이 정답이야.  그럼 이것을 sympy로는 어찌 풀어야 되나?

 

 

from sympy import *

x, y = symbols("x y")           # x,y 를 symbol 로 정의
f = Line((1 / 2) * x - y + 4)   # y = 1/2 * x + 4  직선

x_axis = Line(y)                # x축의 방정식은 y=0 이므로 Line(y)라 설정

x_intercept = x_axis.intersection(f)  # f와 x축의 교점

res = f.perpendicular_line(x_intercept[0])
# 늘 나오듯. intersection 함수는 list를 반환해 주므로  index를 통하여 점을 끄집어 내줘야 함
# x_intercept[0]

# res = res.equation()     # 이 주서은 차후 설명 (아래처럼 x=x, y=y)로 해줘야 함
res = res.equation(x=x, y=y)  # (x=x, y=y)를 해주어야지만, 위의 symbols x,y와 매치된다.

res_equation = solve(res, y)   # 해당 결과를 y에 대해서 품

print(res_equation)

 

결과는 아래와 같지.

 

[-2.0*x - 16.0]

 

손으로 푼 답이랑 똑같네.  위 코드에서 설명을 더 붙이자면,

 

 

res = f.perpendicular_line(x_intercept[0])
print(res)

 

일단 위 코드에서 구한 res 라는 변수를 출력해 보면,

 

Line2D(Point2D(-8.0, 0), Point2D(-8.5, 1))

 

위와 같은 형태로 표현이 되지. 우리가 익숙한 방정식으로 볼 수가 없다는 뜻이야. 그래서

아래와 같이 equation이라는 함수를 써서 방정식 형태로 보여줘야 해

res = res.equation(x=x, y=y)  # (x=x, y=y)를 해주어야지만, 위의 symbols x,y와 매치된다.

 

 

그런데 주석에서 보듯 (x=x , y=y)를 해 줘야 하는 이유가, 그냥

res = res.equation()

 

이렇게만 하면, 물론 출력은 x, y로 되지만, 위에서 symbol로 정의된 x, y와 매치가 되지 않아서 그 이후의 방정식이 안 풀리게 되지. 실제로, 이렇게 코딩을 하면 답이 안나오게 됨! 즉,

res = res.equation()
print(res)

게 하면 출력결과는

 

-x - 0.5*y - 8.0

와 같이 찍혀서 나오지만, 위의 x,y 가 우리가 선언한 symbol x, y와 매치가 안돼서 안 풀린다는 것! 그래서 (x=x , y=y) 이렇게 정의해줘야 한다는 것이야.

 

 

 

문제 2

두 점 $A(1,3), B(-3,7)$을 지나는 직선에 수직이고, 선분 $AB$를 $3:1$로 내분하는 점 $C$를 지나는 직선의 방정식을 구하여라.

 

이것도 수직인 직선을 찾는 문제네.  점 $A, B$를 3:1로 내분한 점 $C$는

$$ C\left( \frac{3\cdot(-3)+1\cdot1}{3+1} ~,~ \frac{3\cdot 7+1\cdot 3}{3+1} \right) = (-2,6)$$

이고 기울기는 $-1$이므로 점 $C$ 를 지나며 기울기 1인 직선의 방정식은

$$ y=x+8$$

이지.  이제 python으로 방정식을 찾아보겠어.

 

from sympy import *

A, B = Point(1, 3), Point(-3, 7) # 점 A,B 정의
C = B.scale(3 / 4, 3 / 4, pt=A)  # 3:1로 내분한 점 구하기

line = Line(A, B).perpendicular_line(C)   # A,B를 잇는 직선과 수직이고 점 C를 지나는 직선
print(line.equation())                    # 직선의 방정식 출력

 

결과를 볼까?

4*x - 4*y + 32

 

 

여기서 scale함수를 좀 더 구체적으로 알아볼 필요가 있을 것 같아.

 

scale 함수

sympy의 scale함수는 다음과 같이 정의되지.

 

B.scale(x=1, y=1, A=None)

A, B는 둘 다 Point 형

 

위 함수의 정의는 

B에서 A 점을 뺀 벡터의 $x, y$좌표를 각각 $x$배, $y배$ 하여 얻은 뒤 다시 그 벡터에 A를 더해준 것임

 

scale의 parameter인 x, y인 각 방향에 대한 비율을 뜻해.  그림으로 설명하면,

 

 

step1. 점 A, B에 대하여

step2. 점 B에서 점 A를 뺀 벡터 B-A (원점이 종점이 되게 만듦)를 $x$으로 $x$배, $y$축으로 $y$배 함

step3. 이 결과( step2의 빨간 점)에 다시 점 A를 더해서 빨간 점의 위치 원복

 

 

따라서 scale를 통해, 선분 $AB$를 내분할 수도 있는 것이지. 예컨대 선분 $AB$를 3:1로 내분하면 위의 python code같이 됨.

 

 

 

정리

이번 글에서 쓰였던 함수, 개념들을 정리해 볼게

line1.intersection(line2) line1과 line2의 교차점 : list형을 반환함
Line.perpendicular_line(pt) 점 pt를 지나고 Line에 수직인 직선
Line.equation() Line의 방정식을 표시한다. default변수는 $x, y$
B.scale(x,y,A) 선분 AB를 $x$축으로 $x$ 비율, $y$축으로 $y$비율만큼 스케일링

 

 

 

 

728x90
반응형

댓글