TIL

TIL.35 두점 사이의 거리 구하기

codermun 2020. 11. 12. 20:47
728x90
반응형

## 두점 사이 거리 구하기

## 클래스를 이용하여 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
728x90
반응형