파이썬 | 두 점 사이의 거리

CHOI·2021년 12월 31일
0

Python

목록 보기
28/33
post-thumbnail

이번에는 클래스를 사용하여 2차원 평면 위에 있는 두 점 사이의 거리를 구해보자.

1. 두 점 사이의 거리

두 점 사이의 거리를 구하기 전에 먼저 클래스로 점을 구현해보자.

클래스로 점 구현

2차원 평면에서 위치를 표현하려면 xy 가 필요할 것이다. 다음과 같이 클래스를 구현하고 x, y 를 속성으로 넣은다.

class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y

이제 위 클래스를 활용하여 두 점을 만들자.

class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
p1 = Point2D(x=30, y=20)    # 점1
p2 = Point2D(x=60, y=50)    # 점2
 
print('p1: {} {}'.format(p1.x, p1.y))    # 30 20
print('p2: {} {}'.format(p2.x, p2.y))    # 60 50

실행 결과

p1: 30 20
p2: 60 50

피타고라스

두 점 사이를 구하려면 피라코라스의 정리를 사용하면 된다.

a2+b2=c2a^2 + b^2 = c^2

임의의 직각사각형에서 빗변을 한 변으로 하는 정사각형의 넓이는 다른 두 변을 각각 한 변으로 하는 정사각형의 넓이의 합과 같다.

그러면 선의 길이를 구하면 두 점 사이의 거리를 구할 수 있다. 선의 길이는 다음과 같다.

a = p2.x - p1.x    # 선 a의 길이
b = p2.y - p1.y    # 선 b의 길이

이제 두 점 사이의 거리를 구하면 되는데 피타고라스의 정리는 제곱이기 때문에 제곱근을 해줘야 최종적으로 우리가 원하는 두 점 사이의 거리를 구할 수 있게 된다.

파이썬에서 제곱근을 사용하는 방법은 math 모듈에서 sqrt 함수(square root)를 사용하면 편리하다.

import math
 
class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
p1 = Point2D(x=30, y=20)    # 점1
p2 = Point2D(x=60, y=50)    # 점2
 
a = p2.x - p1.x    # 선 a의 길이
b = p2.y - p1.y    # 선 b의 길이
 
c = math.sqrt((a * a) + (b * b))    # (a * a) + (b * b)의 제곱근을 구함
print(c)    # 42.42640687119285

실행 결과

42.42640687119285

여기에서는 제곱을 할 때 a * a 이런식으로 했는데 math 모듈에서 pow 함수를 사용해서 제곱을 구할 수도 있다.

  • math.pow(값, 지수)
c = math.sqrt(math.pow(a, 2) + math.pow(b, 2))

물론 파이썬에서는 거듭제곱 연산자 ** 를 사용해도 된다.

c = math.sqrt((a ** 2) + (b ** 2))

그런데 선의 길이를 구할 때 p2 - p1 이 아닌 p1 - p2 가 되면 어떻게 될까?

a = p1.x - p2.x    # 선 a의 길이
b = p1.y - p2.y    # 선 b의 길이

그러면 ab 가 음수가 나오겠지만 어차피 제곱하기 때문에 최종적으로 우리가 원하는 c 의 길이를 구하는데 문제가 없다.

% 절대값 구하기

abs(숫자)

% nametuple 사용하기

파이썬에서는 각 요소에 이름을 지정해줄 수 있는 튜플인 nametuple 을 제공한다( collections 모듈). nametuple 은 자료형 이름과 요소의 이름을 지정하면 클래스를 생성해준다. 여기선 자료형 이름은 문자열, 요소의 이름은 문자열 리스트에 넣는다.

  • 클래스 = nametuple(’자료형이름’, [’요소이름1’, ‘요소이름2’])

nametuple 로 생성한 클래스는 값을 넣어서 인스턴스를 만들 수 있으며 인스턴스.요소이름 또는 인스턴스[인덱스] 형식으로 요소에 접근할 수 있다.

인스턴스 = 클래스(값1, 값2)

인스턴스 = 클래스(요소이름1=값1, 요소이름2=값2)

인스턴스.요소이름1

인스턴스[인덱스]

다음은 nametuple 을 사용하여 두 점의 거리를 구한다.

import math
import collections
 
Point2D = collections.namedtuple('Point2D', ['x', 'y'])    # namedtuple로 점 표현
 
p1 = Point2D(x=30, y=20)    # 점1
p2 = Point2D(x=60, y=50)    # 점2
 
a = p1.x - p2.x    # 선 a의 길이
b = p1.y - p2.y    # 선 b의 길이
 
c = math.sqrt((a * a) + (b * b))
print(c)    # 42.42640687119285
profile
벨로그보단 티스토리를 사용합니다! https://flight-developer-stroy.tistory.com/

0개의 댓글