API_Polygon
2차원 폴리곤을 의미합니다.
typedef struct { Int32 nCoords; Int32 nSubPolys; Int32 nArcs; GS::IntPtr filler_1; } API_Polygon;
멤버
- nCoords
-
- 좌표 배열 내 요소들의 개수입니다. 외곽선의 시작점은 중복됩니다.
- nSubPolys
-
- 메인 폴리곤을 포함하는 폐쇄 서브 폴리곤의 개수입니다. 폴리라인의 경우 항상 1입니다.
- nArcs
-
- 폴리곤/폴리라인 내 아치형 세그먼트들의 개수입니다.
설명
이 structure는 해당 기하 도형의 크기만 갖고 있습니다. 즉, 폴리곤 도형의 노드의 개수, 서브 폴리곤의 개수, 호 세그먼트의 개수를 의미합니다. 기하 데이터는 항상 API_ElementMemo structure를 통해 전달됩니다.
구성요소는 무엇이 있습니까:
- 2D 좌표: API_Coord 배열로 표현됨.
- 서브 폴리곤: 좌표에 대한 인덱스 (Int32) 배열로 표현됨. 각 인덱스는 외곽선의 마지막 좌표를 가리킵니다.
- 호 세그먼트: API_PolyArc 배열로 표현됨.
규칙 리스트와 함께 예제를 보도록 하겠습니다.
좌표:
poly->nCoords = BMGetHandleSize ((GSHandle) memo->coords) / sizeof (API_Coord) - 1;
- 배열의 처음 좌표는 사용하지 않습니다; 폴리곤의 경우 (0.0, 0.0)으로, 폴리라인의 경우 (-1.0, 0.0)으로 초기화되어야 합니다.
- 각 서브 외곽선에 대하여 끝 노드들에 대하여 좌표들이 중복됩니다. (c1과 c7을 보십시오)
외곽선 끝점들:
poly->nSubPolys = BMGetHandleSize ((GSHandle) memo->pends) / sizeof (Int32) - 1;
pends
배열은 좌표 배열에 대한 인덱스들을 포함하고 있습니다. 이것은 서브 외곽선을 닫는 정점들을 의미합니다.- 처음 요소는 항상 0입니다.
호 세그먼트:
poly->nArcs = BMGetHandleSize ((GSHandle) memo->parcs) / sizeof (API_PolyArc);
parcs
배열은 폴리곤 안에 호 세그먼트가 있어야만 할당됩니다.- 각 레코드는 폴리곤 모서리가 호인 2개의 좌표 인덱스(
begIndex
,endIndex
)를 참조합니다. - 각 레코드는 부호화된 호 각도를 제공합니다. 만약 호가 (begPoint, endPoint) 세그먼트의 오른손 방향 위에 있다면 각도는 Positive 값입니다.
- 각도는 Radian 값으로 주어집니다. (가독성을 위해 그림에서만 Degree 값으로 표시하였음)
정점(Vertex) ID:
- 좌표들의 개수와 정점 ID의 개수는 동일합니다; 각 좌표는 정점 ID를 갖고 있습니다. 그래서
API_Polygon
structure가nVertexID
필드를 갖고 있지 않습니다. - 정점 ID는 노드 유일 ID라고도 합니다. (c1과 c6가 동일한 정점 ID를 갖는 이유입니다)
- 최대 정점 ID 값은 0번 셀에 저장됩니다.
- 좌표 인덱스와 할당된 정점 ID 사이에는 일치하는 것이 전혀 없습니다; 어쩌다가 같을 수는 있습니다. (c6는 ID 1입니다.),
- 폴리곤 도형을 편집하면 최대 정점 ID를 줄일 수 없습니다. 그리고 노드들은 정점 ID 값들을 유지해야 합니다.
- 정점 ID들은 치수 측정 및 편집할 때 유용합니다.
폴리곤의 도형을 편집하는 것은 다음과 같이 처리해야 할 많은 어려움들을 부담해야 합니다:
- 반드시 정점 ID들을 유지, 관리해야 합니다.
- 호 레퍼런스들은 반드시 업데이트 되어야 합니다; 부분적으로
- 외곽선 끝 레퍼런스들은 반드시 업데이트 되어야 합니다; 부분적으로
폴리곤의 도형을 변경하려면 제공되는 함수들을 사용하십시오. 이 함수들은 다음과 같습니다:
예제
Int32 FindArc (const API_PolyArc *parcs, Int32 nArcs, Int32 node) { Int32 i; if (parcs == NULL) return (-1); for (i = 0; i < nArcs; i++) if (parcs [i].begIndex == node) return (i); return (-1); } void TrackPoly (const API_Polygon *poly, const API_ElementMemo *memo) { int j, i, begInd, endInd; API_Coord begC, endC; for (j = 1; j <= poly->nSubPolys; j++) { begInd = (*memo->pends) [j-1] + 1; endInd = (*memo->pends) [j]; for (i = begInd; i < endInd; i++) { begC = (*memo->coords) [i]; endC = (*memo->coords) [i+1]; arcInd = FindArc (*memo->parcs, poly->nArcs, i); } } }
위의 예제는 서브 외곽선 레퍼런스들을 기반으로 폴리곤 노드들을 횡단합니다.
요구사항
- 버전: API 2.1 또는 이후
- 헤더: APIdefs_Base.h
참고사항
API_PolyArc, API_ElementMemo,
APIAny_InsertPolyNodeID, APIAny_DeletePolyNodeID, APIAny_InsertSubPolyID, APIAny_DeleteSubPolyID,
API 타입