※ 요약
이전에는 C언어로 두 점 사이의 거리를 구했는데, 같은 예제를 이번엔 C++로 작성해보았다.
사실 매일 하나의 글을 포스팅하기 위해 C언어와 C++을 나눠서 하느라 가끔 억지스러운 면이 없지 않아 있는거 같다.

※ 특징
C++을 이용해 피타고라스 정리를 구현하여 두 점 사이의 거리를 구한다.
좀 더 자세한 설명은 이전 글에 있으니 필요하다면 참고하기 바란다.

큰 틀은 C언어로 작성한 것과 같다. template 클래스와 template 함수로 작성하여 타입에 상관없이 거리를 구할 수 있게 하였다.
이렇게 template으로 만든 이유는, 윈도우 클라이언트 영역은 정수 타입이고, OpenGL이나 DirectX는 보통 실수 타입이기 때문이다.
또 필자는 아직 template 문법에 약하기 때문에 조금씩이나마 연습을 하고자 아래와 같이 작성하였다.


아래 화면은 상기 코드에 대한 디버깅 화면이다.

p1은 실수 타입으로, p2는 정수 타입으로 찍힌걸 보니 마음에 든다.

위 소스코드는 2010 기준으로 만들었다, 2013 이상이라면 GetDistance에서 double형으로 형변환을 안해줘도 에러가 발생하지 않는다.




#include <cmath>

template<typename T>
class CPoint
{
public:
	T x;
	T y;

public:
	CPoint( ) : x(0), y(0) { }
	CPoint( T _x, T _y ) : x(_x), y(_y) { }
};

template<typename T1, typename T2>
double GetDistance( const T1& p1, const T2& p2 )
{
	return std::sqrt( double( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) ) );
}

int main( )
{
	CPoint<double> p1( 432, 189 );
	CPoint<int> p2( 38, 392 );

	double dDistance = GetDistance( p1, p2 );

	return 0;
}


 

※ 요약
피타고라스의 정리를 이용한 두 점 사이의 거리 구하기다.
아래 그림과 같은 직각 삼각형이 있을때, 세 변의 길이는 a^2+b^2=c^2인 관계가 성립한다는 것이 피타고라스 정리다.


위 같은 공식을 아래 그림에 적용해보자.

먼저 빨간점 p1과 p2가 있고, 각각 가상의 수직선과 수평선을 그었다. 

그리고 가상의 노란 빗변을 이어주니 직각 삼각형이 되었다.

이제 a^2+b^2=c^2를 이용하여 두 점 사이의 거리를 구한다는게 느낌이 올 것이다.

(좀더 자세히 쓰려다가 그림 그리기도 귀찮고 수식 입력도 안되서 여기까지 작성함)


※ 특징
C언어를 이용해 피타고라스 정리를 구현하여 두 점 사이의 거리를 구한다.

C언어 소스는 아래와 같다. 임의의 점 p1(432, 189)과 p2(38, 392)의 거리를 측정해보니 443.2212가 나왔다.
헤더는 math.h를 추가해주고 GetDistance 함수와 구조체를 복사하면 어느 프로젝트에서든 두 점의 거리를 구할 수 있다.
C++를 이용하여 아래와 같은 예제를 구현하였으니 관심있으면 한 번 보기 바란다.



#include <stdio.h>
#include <math.h>

typedef struct tagPoint
{
	double x;
	double y;
}_Point;

double GetDistance( const _Point p1, const _Point p2 );

int main( )
{
	_Point p1 = { 432, 189 };
	_Point p2 = { 38, 392 };

	double dDistance = GetDistance( p1, p2 );

	return 0;
}

double GetDistance( const _Point p1, const _Point p2 )
{
	return sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) );
}


+ Recent posts