#pragma once
class Region
{
public:
Region(void); // 생성자
Region(int l, int t, int r, int b); // 생성자
private:
/////////////////////////////////////////////////////////////
// 사각형 영역을 저장하기 위한 멤버변수들
int left; // 시작점의 x좌표
int top; // 시작점의 y좌표
int right; // 끝점의 x좌표
int bottom; // 끝점의 y좌표
/////////////////////////////////////////////////////////////
// 출력방식을 지정하기 위한 멤버변수
static int notation; // POINT_POINT 또는 POINT_SIZE
public:
enum { POINT_POINT, POINT_SIZE }; // 시작점과 끝점, 시작점과 길이
public:
/////////////////////////////////////////////////////////////
// 사각형 영역에 대한 정보를 얻는 함수들
int GetWidth() const; // 가로길이 얻기
int GetHeight() const; // 세로길이 얻기
void GetStartPoint(int &x, int &y) const; // 시작점 얻기
void GetEndPoint(int &x, int &y) const; // 끝점 얻기
void GetCenterPoint(int &x, int &y) const; // 중심점 얻기
bool IsPointInRegion(int x, int y) const; // 점이 영역 안에 있는지
/////////////////////////////////////////////////////////////
// 사각형 영역을 설정하고 처리하는 함수들
void SetRect(int l, int t, int r, int b); // 영역 설정
void Move(int x, int y); // 위치 이동
void Resize(int width, int height); // 크기 변경
void UnionRegion(const Region &r1, const Region &r2); // 교집합
void IntersectRegion(const Region &r1, const Region &r2); // 합집합
/////////////////////////////////////////////////////////////
// 사각형 영역을 표시하기 위한 함수들
void Show(void); // 영역 출력
static void SetNotation(int notation); // 출력 방식 지정
};
-----------------------------------------------------------------------------------
#include <stdio.h>
#include <iostream>
//c언어의 stude.h와 같은 역활의 header
#include "Region.h"
int Region::notation = Region::POINT_POINT;
Region::Region(void)
{
SetRect(0, 0, 0, 0); // 영역을 0으로 초기화
}
Region::Region(int l, int t, int r, int b)
{
SetRect(l, t, r, b); // 영역을 주어진 값으로 초기화
}
void Region::SetRect(int l, int t, int r, int b)
{
left = l; // 시작점의 x좌표 설정
top = t; // 시작점의 y좌표 설정
right = r; // 끝점의 x좌표 설정
bottom = b; // 끝점의 y좌표 설정
}
int Region::GetWidth() const
{
return right - left;
}
int Region::GetHeight() const
{
return bottom - top;
}
void Region::GetStartPoint(int &x, int &y) const
{
x = left; // 시작점의 x 좌표 얻기
y = top; // 시작점의 y좌표 얻기
}
void Region::GetEndPoint(int &x, int &y) const
{
x = right; // 끝점의 x 좌표 얻기
y = bottom; // 끝점의 y좌표 얻기
}
void Region::GetCenterPoint(int &x, int &y) const
{
x = (left + right) / 2; // 중심점의 x 좌표 얻기
y = (top + bottom) / 2; // 중심점의 y좌표 얻기
}
bool Region::IsPointInRegion(int x, int y) const
{
return (x >= left && x <= right && y >= top && y <= bottom);
}
void Region::Move(int x, int y)
{
left += x; // 시작점의 x좌표 이동
right += x; // 끝점의 x좌표 이동
top += y; // 시작점의 y좌표 이동
bottom += y; // 끝점의 y좌표 이동
}
void Region::Resize(int width, int height)
{
int x, y;
GetCenterPoint(x, y); // 중심점 좌표 얻기
left = x - width / 2; // 중심으로부터 가로길이의 절반만큼 이동
top = y - height / 2; // 중심으로부터 세로길이의 절반만큼 이동
right = left + width; // 가로길이가 width가 되도록 조절
bottom = top + height; // 세로길이가 height가 되도록 조절
}
void Region::UnionRegion(const Region &r1, const Region &r2)
{
left = r1.left > r2.left ? r1.left : r2.left;
right = r1.right < r2.right ? r1.right : r2.right;
top = r1.top > r2.top ? r1.top : r2.top;
bottom = r1.bottom < r2.bottom ? r1.bottom : r2.bottom;
if (left >= right || top >= bottom) // 교집합이 존재하지 않는 경우
{
left = top = right = bottom = 0;
}
}
void Region::IntersectRegion(const Region &r1, const Region &r2)
{
left = r1.left < r2.left ? r1.left : r2.left;
right = r1.right > r2.right ? r1.right : r2.right;
top = r1.top < r2.top ? r1.top : r2.top;
bottom = r1.bottom > r2.bottom ? r1.bottom : r2.bottom;
}
void Region::SetNotation(int n)
{
notation = n;
}
void Region::Show(void)
{
if (notation == POINT_POINT) // 시작점/끝점 형식
{
printf("(%d, %d), (%d, %d)\n", left, top, right, bottom);
}
else // 시작점/가로, 세로/길이 형식
{
printf("(%d, %d), [%d x %d]\n", left, top, GetWidth(), GetHeight());
}
}
------------------------------------------------------------------------------------------
#include <iostream>
#include "Region.h"
using namespace std;
int main(void)
{
Region::SetNotation(Region::POINT_POINT); // 출력 형식 지정
Region r1(10, 10, 100, 100); // 영역 r1 선언
Region r2(50, 50, 120, 120); // 영역 r2 선언
Region r3;
r3.IntersectRegion(r1, r2); // r1과 r2의 교집합을 r3에 저장
r3.Show();
r3.UnionRegion(r1, r2); // r1과 r2의 합집합을 r3에 저장
r3.Show();
r3.Move(100, 100); // r3의 위치 이동
r3.Show();
r3.Resize(200, 200); // r3의 크기 변경
r3.Show();
Region::SetNotation(Region::POINT_SIZE); // 출력 형식 변경
r1.Show();
r2.Show();
r3.Show();
system("PAUSE");
return 0;
}