반응형
Region.h
#pragma once
#include <iostream>
//const char* p = 0; //비상수 포인터, 상수 데이터
//char* const p = 0; //상수 포인터, 비상수 데이터
//const char* const p = 0; //상수 포인터, 상수 데이터
//void a() const { } // 상수 함수 : 함수에서 멤버 변수 값 변경 불가능
//const 함수에서는 const 함수만 호출 가능
//const int a() { } // 반환값이 상수, 상수 변수로만 반환 값을 받을 수 있음.
class Region
{
public:
enum { POINT_POINT, POINT_SIZE }; //시작점과 끝점, 시작점과 길이
int m_iWidth;
int m_iHeight;
private:
//사각형 영역을 저장하기 위한 멤버변수들
int m_iLeft; //시작점의 x좌표
int m_iTop; //시작점의 y좌표
int m_iRight; //끝점의 x좌표
int m_iBottom; //끝점의 y좌표
//출력방식을 지정하기 위한 멤버 변수
static int notation; //POINT_POINT OR POINT_SIZE
public :
const Region* Get() const { return this; }
const Region& GetRef() const { return *this; }
//사각형 영역에 대한 정보를 얻는 함수들
const int GetLeft() { return m_iLeft; }
const int GetTop() { return m_iTop; }
const int* GetRight() { return &m_iRight; }
const int& GetBottom() { return m_iBottom; }
int GetWidth() const; //가로길이 얻기
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); //합집합
bool IntersectRegion(const Region &r1, const Region &r2); //교집합
//사각형 영역을 표시하기 위한 함수들
void Show(); //영역 출력
static void SetNotation(int n); //출력 방식 지정
public:
Region();
Region(int l, int t, int r, int b);
~Region();
};
Region.cpp
#include "Region.h"
int Region::notation = Region::POINT_POINT;
Region::Region()
{
SetRect(0, 0, 0, 0);
//영역을 0으로 초기화
}
Region::Region(int l, int t, int r, int b)
{
SetRect(l, t, r, b);
//영역을 주어진 값으로 초기화
}
Region::~Region()
{
}
void Region::SetRect(int l, int t, int r, int b)
{
m_iLeft = l; //시작점의 x좌표 설정
m_iTop = t; //시작점의 y좌표 설정
m_iRight = r; //끝점의 x좌표 설정
m_iBottom = b; //끝점의 y좌표 설정
}
int Region::GetWidth() const
{
return m_iRight - m_iLeft;
}//가로길이 얻기
const int Region::GetHeight() const
{
return m_iBottom - m_iTop;
}//세로길이 얻기
void Region::GetStartPoint(int &x, int &y) const
{
x = m_iLeft;
y = m_iTop;
} //시작점 얻기
void Region::GetEndPoint(int &x, int &y) const
{
x = m_iRight;
y = m_iBottom;
}//끝점 얻기
void Region::GetCenterPoint(int &x, int &y) const
{
x = (m_iLeft + m_iRight) / 2;
y = (m_iHeight + m_iBottom) / 2;
}//중심점 얻기
bool Region::IsPointInRegion(int x, int y) const
{
if (x > m_iLeft && x < m_iRight && y > m_iHeight && y < m_iBottom) {
return true;
}
else {
return false;
}
}//점이 영역 안에 있는지
void Region::Move(int x, int y)
{
m_iLeft += x;
m_iTop += y;
m_iRight += x;
m_iHeight += y;
}//위치 이동
void Region::Resize(int width, int height)
{
if (width > 0 && height > 0) {
m_iRight = m_iLeft + width;
m_iBottom = m_iTop + height;
}
else {
std::cout << "길이가 음수가 될 수 없습니다." << std::endl;
}
}//크기 변경
void Region::UnionRegion(const Region &r1, const Region &r2)
{
m_iLeft = r1.m_iLeft < r2.m_iLeft ? r1.m_iLeft : r2.m_iLeft;
m_iTop = r1.m_iTop < r2.m_iTop ? r1.m_iTop : r2.m_iTop;
m_iRight = r1.m_iRight > r2.m_iRight ? r1.m_iRight : r2.m_iRight;
m_iBottom = r1.m_iBottom > r2.m_iBottom ? r1.m_iBottom : r2.m_iBottom;
}; //합집합
bool Region::IntersectRegion(const Region &r1, const Region &r2)
{
m_iLeft = r1.m_iLeft > r2.m_iLeft ? r1.m_iLeft : r2.m_iLeft;
m_iTop = r1.m_iTop > r2.m_iTop ? r1.m_iTop : r2.m_iTop;
m_iRight = r1.m_iRight < r2.m_iRight ? r1.m_iRight : r2.m_iRight;
m_iBottom = r1.m_iBottom < r2.m_iBottom ? r1.m_iBottom : r2.m_iBottom;
//한점 또는 라인이 중첩되었을 때는 교차로 판정하지 않음.
//교집합이 존재하지 않는 경우
if (m_iLeft >= m_iRight || m_iTop >= m_iBottom) {
SetRect(0, 0, 0, 0);
return false;
}
return true;
}; //교집합
void Region::SetNotation(int n)
{
notation = n%2;
}//출력 방식 지정
void Region::Show()
{
if (notation == POINT_POINT) {
printf("(%d,%d) , (%d,%d) \n", m_iLeft, m_iTop, m_iRight, m_iBottom);
}
else if(notation == POINT_SIZE) {
printf("(%d, %d), [%d x %d]\n", m_iLeft, m_iTop, GetWidth(), GetHeight());
}
}//영역 출력
main.cpp
#include "Region.h"
int main()
{
Region::SetNotation(Region::POINT_SIZE); // 출력 형식 지정
Region r1(10, 10, 30, 20);
Region r2(50, 50, 5, 5);
}반응형