TIL.35 두점 사이의 거리 구하기
## 두점 사이 거리 구하기
## 클래스를 이용하여 2차원 평면의 x, y 점을 구현하고 이 두 점 사이의 거리를 구해보자.
class Point2D:
def __init__(self, x, y):
self.x = x
self.y = y
p1 = Point2D(30, 20)
p2 = Point2D(60, 50)
print('p1 {} {}'.format(p1.x, p1.y))
# p1 30 20
print('p2 {} {}'.format(p2.x, p2.y))
# p2 60 50
## 아래 p1 과 p2를 2차원 평면상에 표현하면 아래와 같다.

## 두점 사이의 거리를 구하기 위해선 피타고라스의 정의를 이용한다.
# a2 + b2 = c2
## 따라서, a 와 b 의 길이를 구해야한다.

a = p2.x - p1.x
b = p2.y - p1.y
print(a)
# 30
print(b)
# 30
## 해당 문제에서는 a가 -가 되는 것을 고려하지 않아도 된다. 제곱을해서 어짜피 부호가 +가 되기때문이다.
## 파이썬에서 루트 구현하기
# math 모듈의 sqrt 함수를 사용하면 편리합니다. sqrt는 제곱근을 뜻하는 square root에서 따옴.
# math.sqrt(값)
# sprt 함수는 n의 제곱근을 반환하며, 음수가 나올 경우 error가 발생한다.
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
## 위식에서 a2, b2 표현하는 방법을 알아보자. ##
## 먼저 제곱근을 구하는 math.sqrt(a2 + b2)을 표현해햐한다.
## 방법 1. a*a + b*b
## 방법 2. a**2 + b**2 (거듭제곱 연산자 ** 사용)
c = math.sqrt((a ** 2) + (b ** 2))
## 방법 3. 거듭제곱(power)을 구하는 pow 함수를 사용해도 됩니다(math 모듈)// math.pow(값, 지수)
c = math.sqrt(math.pow(a, 2) + math.pow(b, 2))
## 절대값 함수 알아보기
# 내장 함수 abs 또는 math 모듈의 fabs 함수를 사용하면 양수 또는 음수를 절댓값(absolute value)으로 만들 수 있다.
## abs(값)
# 정수는 절댓값을 정수로 반환, 실수는 절댓값을 실수로 반환
g = 10 - 50
print(abs(g))
# 40
## math.fabs(값)
# 절댓값을 실수로 반환
g = 10 - 50
print(math.fabs(g))
# 40.0
## namedtuple 함수 사용하기
# 파이썬에서는 각 요소에 이름을 지정해 줄 수 있는 튜플인 namedtuple을 제공합니다( collections 모듈)

# namedtuple을 사용하여 두 점의 거리를 구하기
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