기본 콘텐츠로 건너뛰기

라벨이 Polygon인 게시물 표시

[AutoCAD.NET] 주어진 폴리곤을 이용하여 Cloud 마크 그리기

아래와 같이 폴리곤이 주어졌을때 폴리곤 외곽선을 따라 Cloud 마크를 그리는 방안입니다. 폴리곤의 외곽선을 따라 아래와 같이 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); } } 여기서 주의할 것은 폴리...

Polygon 해칭

주어진 정점으로 이루어진 Polygon을 해칭하는 예제입니다. inData는 "HATCHPLINE,0,0,0.1,0,0.1,0.1,0,0.1,0,0," 이런식으로 주어지면 됩니다. Private Sub drawHatchPline(ByVal inData As String) Dim m_oShapeElement As ShapeElement Dim m_Points() As Point3d Dim ptrn As CrossHatchPattern Dim vertices() As Point3d Dim tokens() As String Dim i As Integer, index As Integer index = 0 tokens = Split(inData, ",") ReDim Preserve m_Points(UBound(tokens) / 2) For i = 1 To UBound(tokens) m_Points(index) = Point3dFromXY(Val(tokens(i)), Val(tokens(i + 1))) i = i + 1 index = index + 1 Next Set m_oShapeElement = CreateShapeElement1(msv8Element, m_Points, msdFillModeNotFilled) ActiveModelReference.AddElement m_oShapeElement ' Use a CrossHatchPattern object to set up the parameters for ' the hatching operation. Set ptrn = CreateCrossHatchPattern(0.01, 0.01, Pi / 4, -Pi / 4) ver...

[공유] simple polygon 만들기

helloktk의 블로그 | 드라곤 원문 https://blog.naver.com/helloktk/80028346861 기하 알고리즘을 특히 폴리곤알고리즘을 테스트하기 위해서는 폴리곤 데이터를 만들어야 한다. 여기서 2차원의 점들을 이용하여 간단히 simple polygon을 만드는 방법을 살펴본다. 단순폴리곤을 만들기 위해서는 점들을 정렬을 해야한다. 각각의 점들을 X축에 프로젝션을 시키면 x축에 대해서 정렬이 된다(같은 x값인경우에는 의 크기대로 정렬). 따라서 x값으로 정렬된 점들을 쭉 이어나가면 하나늬 폴리라인(poly-line)을 만들 수 있다. 그러나 원하는 폴리곤은 아니다. 이를 해결하기위해서는 점들을 직선으로 두부분으로 나누고, 직선의 윗부분은 x값이 큰순서대로 정렬을 하고, 아래 부분은 x값이 작은 순서대로 정열을 하면 폴리라인이 아닌 폴리곤을 얻을 수 있다. 직선은 어떻게 잡을까? 이것은 가장작은 x값을 갖는 점과 가장 큰 x값을 같는 점을 잇는 직선을 생각하면 편리하다. int CCW(CPoint A, CPoint B, CPoint C) { C -= B; //점B에서 C로 향하는 선분의 왼편인가, 아니면 오른편인가; A -= B; return C.x*A.y-C.y*A.x; } int comp(const void*A, const void *B) {//x->y의 크기순서대로 정렬용; int a=((POINT *)A)->x - ((POINT *)B)->x ; if(a>0) return 1 ; else if(a<0) return -1; a=((POINT *)A)->y - ((POINT *)B)->y ; if(a>0) return 1; else if(a<0) return -1; return 0; } void MakeSimplePolygon(POINT P[], i...

단순 폴리곤(Convex polygon)의 평면에 의한 분할

단순 폴리곤이 평면에 의해 분할이 일어난다면 폴리곤은 평면에 의해 2개로 나뉘어 집니다. 분할이 일어나는 조건은 폴리곤을 이루는 점들이 평면의 한쪽에 치우쳐 존재하지 않고 양쪽에 모두 존재해야 한다는 것입니다. 분할되는 교점은 아래 평면과 직선의 교점에서 구할 수가 있습니다. 단순 폴리곤에서 교점은 2개가 존재하게 됩니다.(intsec1 , intsec2) 2개의 폴리곤은 아래의 그림처럼 구할 수가 있습니다.(분홍색으로 이루어진 폴리곤 , 푸른색으로 이루어진 폴리곤) 이렇게 해서 단순 폴리곤의 평면에 대한 분할에 대해 간단히 알아보았습니다. CIsPoly3d* CIsPoly3d::PartionWithPlane3d(CIsPlane3d plane) { unsigned int count = 0; unsigned int edge[2] = {-1 ,}; CIsPoint3d intsec[2]; int i = 0; for(vector<CIsPoint3d>::iterator itr = m_pVertexEntry->begin();(itr + 1) != m_pVertexEntry->end() && (count < 2);itr++ , i++) { CIsPoint3d start = *itr; CIsPoint3d end = *(itr + 1); CIsPoint3d at; if(plane.FindIntersectionPoint(at , start , end)) { edge[count] = i; intsec[count++] = at; } } if(2 == count) { CIsPoint3d last; CIsPoly3d* pRet = new CIsPoly3d[2]; ////////////////////////////////////////////////////////////////////////// /// first poly3d for(i = ...