�빫�� ����� ���

Archive for the ‘c/c++’ Category.

[STL] vector, set, iterator를 이용한 사각형 조각 나누기


stl_example

작업을 하던 중 열심히 만든 코드를 공개합니다~

작업하던 내용은 한 이미지에 줄을 쭉쭉 그어서 조각내는 거였습니다. 그림과 같이 큰 사각형(이미지)이 하나 있고 내부에 선을 가로 또는 세로로 그어 놓은 후, 작은 사각형으로 나누는 것이죠. 입력은 l개의 x좌표와 t개의 y좌표입니다.

결과는 Rn((x1, y1), (x2, y2))의 두 꼭지점을 가진 Rectangle 형태가 되어야 합니다.

그림에서의 좌표를 각 x축과 y축으로 나누어서 표현한다면

set<l> = {0, l1, l2, l3, l4, le}
set<t> = {0, t1, t2, t3, te}
(le와 te는 큰 사각형의 오른쪽 하단 좌표)

라고 볼 수 있습니다.

소스코드는 다음과 같습니다.
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <stdio.h>
#include <set>
#include <vector>
#include <algorithm>
#pragma hdrstop
 
#include <tchar.h>
//---------------------------------------------------------------------------
using namespace std;
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> vars_l;
	vector<int> vars_t;
	vars_l.push_back(12);vars_l.push_back(66);vars_l.push_back(48);
	vars_l.push_back(874);vars_l.push_back(0);vars_l.push_back(150);
	vars_t.push_back(487);vars_t.push_back(234);vars_t.push_back(124);
	vars_t.push_back(34);vars_t.push_back(0);
 
	set<int> set_l;
	set<int> set_t;
	set<TRect> set_rect;
 
	for(int i = 0; i < vars_l.size(); i++) {
		set_l.insert(vars_l.at(i));
	}
	for(int j = 0; j < vars_t.size(); j++) {
		set_t.insert(vars_t.at(j));
	}
 
	int l = 0; int t = 0; int r_index = 0;
 
	set<int>::iterator iter_t1 = set_t.begin();
	set<int>::iterator iter_t2 = set_t.begin(); iter_t2++;
	while(iter_t2 != set_t.end()) {
		set<int>::iterator iter_l1 = set_l.begin();
		set<int>::iterator iter_l2 = set_l.begin(); iter_l2++;
		while(iter_l2 != set_l.end()) {
			printf("\nR%d\t((%d, %d),\t(%d, %d))", r_index, *iter_l1, *iter_t1, *iter_l2, *iter_t2);
			iter_l1++; iter_l2++;
			l++;
			r_index++;
		}
		iter_t1++; iter_t2++;
		t++;
	}
 
 
	return 0;
}
//---------------------------------------------------------------------------

그래서 결과는 이렇게 나오죠.

R0      ((0, 0),        (12, 34))
R1      ((12, 0),       (48, 34))
R2      ((48, 0),       (66, 34))
R3      ((66, 0),       (150, 34))
R4      ((150, 0),      (874, 34))
R5      ((0, 34),       (12, 124))
R6      ((12, 34),      (48, 124))
R7      ((48, 34),      (66, 124))
R8      ((66, 34),      (150, 124))
R9      ((150, 34),     (874, 124))
R10     ((0, 124),      (12, 234))
R11     ((12, 124),     (48, 234))
R12     ((48, 124),     (66, 234))
R13     ((66, 124),     (150, 234))
R14     ((150, 124),    (874, 234))
R15     ((0, 234),      (12, 487))
R16     ((12, 234),     (48, 487))
R17     ((48, 234),     (66, 487))
R18     ((66, 234),     (150, 487))
R19     ((150, 234),    (874, 487))

컴파일러는 bcc를 사용했습니다. vcl.h요거만 봐도 딱 알 수 있지만.. ~_~

Borland C++에서 Windows API 사용할 때..

// 컴퓨터 이름을 알아내서 저장하는 것.

// DataMod는 VCL의 DataModule을 상속받은 것.

 

char szBuffer[MAX_COMPUTERNAME_LENGTH+1];
// 컴퓨터 이름을 저장할 버퍼

DWORD dwcNameSize = MAX_COMPUTERNAME_LENGTH + 1;

// Windows만의 데이터타입인 DWORD

// unsigned long을 typedef 한 것
GetComputerName(szBuffer, &dwcNameSize);

// 이 함수(WinAPI)가 이름을 알아냄. 인자값 둘 다 address reference
DataMod->IssueUnit = StrPas(szBuffer);

// StrPas()는 PChar형의 데이터를 String형으로 변환
DataMod->IssueUnit = DataMod->IssueUnit.SubString(DataMod->IssueUnit.Length(),1);

 

뭐.. 그렇게~