Skip to content

43. 두 점 사이의 거리


1. 키워드

  • 2차원 평면


2. 두 점 사이의 거리 구하기

  • 2차원 평면에서 위치를 표현하려면 xy값이 필요하다.
  • 지금까지 봐온 Point2D 구조체를 활용해 보자.


struct Point2D
{
    int x;
    int y;
};


  • 이제 구조체로 변수 두 개를 선언하여 점 두 개를 표현한다.


#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차원 평면에서 점을 표시해 보면 다음과 같다.


001


  • 두 점의 거리를 구하려면 피타고라스의 정리를 이용하면 된다.
  • 그럼 점 p1p2로 직각삼각형을 그려본다.


002


  • 피타고라스의 정리에 대입하려면 먼저 선 ab의 길이를 구해야 한다.
  • 구조체 변수에 두 점의 좌표 정보가 들어있으므로 구조체 변수를 활용하면 된다.


int a = p2.x - p1.x; // 선 a의 길이
int b = p2.y - p1.y; // 선 b의 길이


  • ap2x에서 p1x를 빼면 되고, bp2y에서 p1y를 빼면 된다.
  • 그다음 피타고라스의 정리에서 c의 길이를 계산하려면 제곱근을 구해야 한다.
  • 이때 C에서 제공하는 sqrt 함수를 사용하면 편리하다.


sqrt()
제곱근을 반환, 입력값이 음수이면 NaN을 반환


  • 이제 sqrt 함수까지 사용해서 p1p2의 거리를 구해 보자.


#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 함수를 사용해도 된다.


pow(, 지수)
입력값의 지수만큼의 거듭제곱을 반환


  • a * a를 구하고 싶다면 pow(a, 2)처럼 사용한다.
  • 앞에서 작성한 코드를 pow 함수로 다시 작성하면 다음과 같은 모양이 된다.


double c = sqrt(pow(a, 2) + pow(b, 2));


  • 만약 선의 위치를 구할 때 p2에서 p1을 빼는 것이 아닌 p1에서 p2를 빼면 어떻게 되는지 확인해 보자.


int a = p1.x - p2.x; // 선 a의 길이
int b = p1.y - p2.y; // 선 b의 길이


  • 30 - 60-30이고 20 - 50-30이다.
  • 하지만 음수끼리 곱하기 때문에 항상 양수가 되므로 부호는 상관하지 않아도 된다.


절댓값 함수

  • math.h 헤더 파일에 선언되어 있는 abs, fabs, fabsf 함수를 사용하면 양수 또는 음수를 절댓값으로 만들 수 있다.


abs(정수);
정수 절댓값을 반환
fabs(double타입실수);
double 타입 실수 절댓값을 반환
fabsf(float타입실수);
float 타입 실수 절댓값을 반환

References