43. 두 점 사이의 거리
1. 키워드
- 2차원 평면
2. 두 점 사이의 거리 구하기
- 2차원 평면에서 위치를 표현하려면
x
와y
값이 필요하다. - 지금까지 봐온
Point2D
구조체를 활용해 보자.
- 이제 구조체로 변수 두 개를 선언하여 점 두 개를 표현한다.
#include <stdio.h>
struct Point2D
{
int x;
int y;
};
int main()
{
struct Point2D p1; // 점1
struct Point2D p2; // 점2
// 점1 위치
p1.x = 30;
p1.y = 20;
// 점2 위치
p2.x = 60;
p2.y = 50;
printf("p1: %d %d\n", p1.x, p1.y);
printf("p2: %d %d\n", p2.x, p2.y);
return 0;
}
// p1: 30 20
// p2: 60 50
- 2차원 평면에서 점을 표시해 보면 다음과 같다.
- 두 점의 거리를 구하려면 피타고라스의 정리를 이용하면 된다.
- 그럼 점
p1
과p2
로 직각삼각형을 그려본다.
- 피타고라스의 정리에 대입하려면 먼저 선
a
와b
의 길이를 구해야 한다. - 구조체 변수에 두 점의 좌표 정보가 들어있으므로 구조체 변수를 활용하면 된다.
a
는p2
의x
에서p1
의x
를 빼면 되고,b
는p2
의y
에서p1
의y
를 빼면 된다.- 그다음 피타고라스의 정리에서
c
의 길이를 계산하려면 제곱근을 구해야 한다. - 이때 C에서 제공하는
sqrt
함수를 사용하면 편리하다.
- 이제
sqrt
함수까지 사용해서p1
과p2
의 거리를 구해 보자.
#include <stdio.h>
#include <math.h> // sqrt 함수가 선언된 헤더 파일
struct Point2D
{
int x;
int y;
};
int main()
{
struct Point2D p1; // 점1
struct Point2D p2; // 점2
// 점1 위치
p1.x = 30;
p1.y = 20;
// 점2 위치
p2.x = 60;
p2.y = 50;
int a = p2.x - p1.x; // 선 a의 길이
int b = p2.y - p1.y; // 선 b의 길이
double c = sqrt((a * a) + (b * b)); // (a * a) + (b * b)의 제곱근을 구함
printf("%f\n", c);
return 0;
}
// 42.426407
sqrt
함수에 값을 넣으면 해당 값의 제곱근을 구해 준다.- 이때 제곱근은 소수로 나오므로
double
타입 변수에 저장해 준다. - 여기서는
a
의 제곱과b
의 제곱의 합을(a * a) + (b * b)
처럼 포현했는데 거듭제곱을 구하는pow
함수를 사용해도 된다.
- 즉
a * a
를 구하고 싶다면pow(a, 2)
처럼 사용한다. - 앞에서 작성한 코드를
pow
함수로 다시 작성하면 다음과 같은 모양이 된다.
- 만약 선의 위치를 구할 때
p2
에서p1
을 빼는 것이 아닌p1
에서p2
를 빼면 어떻게 되는지 확인해 보자.
30 - 60
은-30
이고20 - 50
도-30
이다.- 하지만 음수끼리 곱하기 때문에 항상 양수가 되므로 부호는 상관하지 않아도 된다.
절댓값 함수
math.h
헤더 파일에 선언되어 있는abs
,fabs
,fabsf
함수를 사용하면 양수 또는 음수를 절댓값으로 만들 수 있다.