아래와 같이 폴리곤이 주어졌을때 폴리곤 외곽선을 따라 Cloud 마크를 그리는 방안입니다.
폴리곤의 외곽선을 따라 아래와 같이 Cloud 마크를 그릴수 있습니다.
AutoCAD.NET API를 이용하면 손쉽게 Cloud 마크를 생성할 수 있습니다.
폴리곤을 이루는 Vertex에 bulge값을 주면 arc가 생성됩니다.
arc length는 상황에 맞게 설정해주면 됩니다.
(사용자 옵션 혹은 폴리곤을 이루는 가장 작은 선분의 길이에 비례한 값)
폴리곤의 Clock wise일 경우에는 bulge값을 음수로 주면 Cloud가 제대로 생성됩니다.
폴리곤이 Counter clock wise인지 Clock wise인지는 폴리곤의 영역 통해 알수 있습니다.
폴리곤 영역이 양의 값이면 Counter clock wise 그렇지 않으면 Clock wise입니다.
좀더 심화된 내용으로 들어가 보면,
주어진 두 개의 폴리곤의 서로 겹져있을 경우 각각의 폴리곤을 개별적으로 Cloud 마크를 생성한다면 보기가 좋지 않을 겁니다.
이럴 경우 2개의 폴리곤을 병합하여 하나의 폴리곤으로 만든 뒤 Cloud 마크를 생성한다면 사용자들이 만족할 만한 결과를 얻을 수 있을 것입니다.
폴리곤 Boolean Operation에 관해서는 좋은 라이브러리가 있으니 그것을 사용하는 것이 좋습니다.
http://www.angusj.com/delphi/clipper.php
폴리곤의 외곽선을 따라 아래와 같이 Cloud 마크를 그릴수 있습니다.
AutoCAD.NET API를 이용하면 손쉽게 Cloud 마크를 생성할 수 있습니다.
폴리곤을 이루는 Vertex에 bulge값을 주면 arc가 생성됩니다.
Polyline polyline = new Polylin();
polyline.AddVertexAt(index, pt, bulge, 0, 0);
$(P0,P1,P2)$로 이루어지는 폴리곤에 Cloud 마크를 그리기 위해 정점$(P0,P1,P2)$ 사이에 임시 정점을 arc length만큼 띄워서 추가합니다.arc length는 상황에 맞게 설정해주면 됩니다.
(사용자 옵션 혹은 폴리곤을 이루는 가장 작은 선분의 길이에 비례한 값)
double dArcLength = 0.1;
List<Point2d> lstPoint = new List<Point2d>();
Point2d[] corners = new Point2d[] { P0, P1, P2 };
for(int i = 0; i < corners.Length;++i)
{
double l = corners[(i + 1) % corners.Length].GetDistanceTo(corners[i]);
int count = Convert.ToInt32(l / dArcLength);
Vector2d vec = corners[(i + 1) % corners.Length] - corners[i];
Vector2d normal = vec.GetNormal();
for(int j = 0; j < count;++j)
{
Point2d pt = corners[i] + normal * j * dArcLength;
lstPoint.Add(pt);
}
}
여기서 주의할 것은 폴리곤을 이루는 정점의 순서에 따라 Cloud의 Arc 모양이 달라진다는 것입니다.폴리곤의 Clock wise일 경우에는 bulge값을 음수로 주면 Cloud가 제대로 생성됩니다.
폴리곤이 Counter clock wise인지 Clock wise인지는 폴리곤의 영역 통해 알수 있습니다.
폴리곤 영역이 양의 값이면 Counter clock wise 그렇지 않으면 Clock wise입니다.
좀더 심화된 내용으로 들어가 보면,
주어진 두 개의 폴리곤의 서로 겹져있을 경우 각각의 폴리곤을 개별적으로 Cloud 마크를 생성한다면 보기가 좋지 않을 겁니다.
이럴 경우 2개의 폴리곤을 병합하여 하나의 폴리곤으로 만든 뒤 Cloud 마크를 생성한다면 사용자들이 만족할 만한 결과를 얻을 수 있을 것입니다.
폴리곤 Boolean Operation에 관해서는 좋은 라이브러리가 있으니 그것을 사용하는 것이 좋습니다.
http://www.angusj.com/delphi/clipper.php
댓글
댓글 쓰기