이번에는 클래스를 사용하여 2차원 평면 위에 있는 두 점 사이의 거리를 구해보자.
두 점 사이의 거리를 구하기 전에 먼저 클래스로 점을 구현해보자.
2차원 평면에서 위치를 표현하려면 x
와 y
가 필요할 것이다. 다음과 같이 클래스를 구현하고 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
두 점 사이를 구하려면 피라코라스의 정리를 사용하면 된다.
임의의 직각사각형에서 빗변을 한 변으로 하는 정사각형의 넓이는 다른 두 변을 각각 한 변으로 하는 정사각형의 넓이의 합과 같다.
그러면 선의 길이를 구하면 두 점 사이의 거리를 구할 수 있다. 선의 길이는 다음과 같다.
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
함수를 사용해서 제곱을 구할 수도 있다.
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의 길이
그러면 a
와 b
가 음수가 나오겠지만 어차피 제곱하기 때문에 최종적으로 우리가 원하는 c
의 길이를 구하는데 문제가 없다.
abs(숫자)
파이썬에서는 각 요소에 이름을 지정해줄 수 있는 튜플인 nametuple
을 제공한다( collections
모듈). nametuple
은 자료형 이름과 요소의 이름을 지정하면 클래스를 생성해준다. 여기선 자료형 이름은 문자열, 요소의 이름은 문자열 리스트에 넣는다.
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