37. 클래스 활용

Joy·2020년 4월 2일
0

두 점사이 거리 구하기

클래스를 활용하여 2차원 평면에서 위치를 표현한 뒤 두 점 사이의 거리를 구하기

1. 클래스로 점 구현

Point2D 클래스를 구현하고 x와 y를 속성으로

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

이걸 활용해 점 두개 만들기 p1, p2

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, b 길이 구하기(클래스의 인스턴스 활용)

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

  • 루트 구하기: math 모듈의 sqrt 함수를 사용 : math.sqrt(값)
  • 거듭제곱 : math.pow(값, 지수) or ** 연산자
  • 절대값: 내장 함수 abs 또는 math 모듈의 fabs 함수 : abs(값) or math.fabs(값)
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

c = math.sqrt((a a) + (b b))
c = math.sqrt(math.pow(a, 2) + math.pow(b, 2))
c = math.sqrt((a 2) + (b 2))

문제: 두 점 사이의 거리 구하기

표준 입력으로 x, y 좌표 4개가 입력되어 Point2D 클래스의 인스턴스 리스트에 저장됩니다. 여기서 점 4개는 첫 번째 점부터 마지막 점까지 순서대로 이어져 있습니다. 다음 소스 코드를 완성하여 첫 번째 점부터 마지막 점까지 연결된 선의 길이가 출력되게 만드세요.

import math
 
class Point2D:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
 
length = 0.0
p = [Point2D(), Point2D(), Point2D(), Point2D()]
p[0].x, p[0].y, p[1].x, p[1].y, p[2].x, p[2].y, p[3].x, p[3].y = map(int, input().split())

for i in range(len(p)-1):
    a = p[i+1].x - p[i].x    # 선 a의 길이
    b = p[i+1].y - p[i].y    # 선 b의 길이 
    length += math.sqrt((a ** 2) + (b ** 2))
    
print(length)

점 사이의 거리를 하나씩 구해보면

c1 = math.sqrt(( (p[1].x - p[0].x) 2) + (p[1].y - p[0].y 2) )
c2 = math.sqrt(( (p[2].x - p[1].x) 2) + (p[2].y - p[1].y 2) )
c3 = math.sqrt(( (p[3].x - p[2].x) 2) + (p[3].y - p[2].y 2) )
length = c1 + c2 + c3

이걸 반복문 사용해서 표현하면
for i in range(len(p)-1):
a = p[i+1].x - p[i].x # 선 a의 길이
b = p[i+1].y - p[i].y # 선 b의 길이
length += math.sqrt((a 2) + (b 2))

profile
roundy

0개의 댓글