2009-11-24 2 views
1

나는 다음과 같은 PathPoints 및 PathTypes 배열이GraphicsPath PathPoints 및 PathTypes 배열에서 호의 끝점을 결정하는 방법은 무엇입니까? (: X, Y, 유형 형식) :

-177.477900, 11021.670000, 1 
-614.447200, 11091.820000, 3 
-1039.798000, 10842.280000, 3 
-1191.761000, 10426.620000, 3 
-1591.569000, 10493.590000, 3 
-1969.963000, 10223.770000, 3 
-2036.929000, 9823.960000, 3 
-2055.820000, 9711.180000, 3 
-2048.098000, 9595.546000, 3 
-2014.380000, 9486.278000, 3 
다음

이 GraphicsPath 물리적 모습입니다. 2 아크는 매우 구별됩니다. alt text http://i45.tinypic.com/2agj1gl.jpg

이 GraphicsPath.PathData 배열은 2 개의 AddArc 명령에 의해 생성 된 것으로 알고 있습니다. 디버거에서 코드를 살펴보면 처음 4 개의 PathData 값이 첫 번째 AddArc 명령에 의해 추가되고 나머지 6 개 점이 두 번째 AddArc 명령에 의해 추가 된 것을 보았습니다.

원시 경로/경로 유형 배열을 조사하여 (2 개의 AddArc 명령임을 알지 못했기 때문에 2 개의 시작점과 끝 점이 있음을 알 수 있음) 각 호의 시작점과 끝점을 결정하고 싶습니다.

배열의 점을 '다시 만들려면'여러 베 지어 계산을 시도했지만 별도의 시작점과 끝점을 결정하는 방법을 결정할 때는 손실이됩니다. GDI +는 호들 사이의 시작점/끝점 (같은 점과 호가 연결되어 있음)을 결합하는 것처럼 보입니다. 그리고 한 호가 끝나고 다른 호가 시작된다는 사실을 잃어 가고 있습니다.

아이디어가 있으십니까?

답변

1

사용 GraphicsPathIterator 클래스 마스크 0 시작 (경로) 1 라인을 의미한다. 예를 들어

:이 도움이

dim gp as new GraphicsPath 
gp.AddArc(-50, 0, 100, 50, 270, 90) 'Arc1 
gp.SetMarkers() 
gp.AddArc(0, 25, 100, 50, 270, 90) 'Arc2 
Dim iterator as New GraphicsPathIterator(gp) 
Dim i as Integer = 0 
Dim MyPts(3) As PointF 
Dim temp as New GraphicsPath 
Do until i > 2 
    iterator.NextMarker(temp) 
    MyPts(i) = temp.PathPoints(0) 
    MyPts(i + 1) = temp.GetLastPoint() 
    i += 2 
Loop 

'Free system resources... 
iterator.Dispose() 

temp.Dispose() 

Arc1 -> start: MyPts(0); end: MyPts(1) 
Arc2 -> start: MyPts(2); end: MyPts(3) 

희망!

+0

경로를 만들 때 실제로 마커를 추가 할 수있는 한 도움이 될 수 있습니다. 하지만 항상 가능한 것은 아닙니다. 더 잘 이해하려면 [이 답변] (http://stackoverflow.com/questions/1790862/how-to-determine-endpoints-of-arcs-in-graphicspath-pathpoints-and-pathtypes-arra/17339215#17339215)을보십시오. 'GraphicsPath'가 내부적으로 어떻게 구성되어 있는지를 보여줍니다. – SiliconMind

0

PathPointType Enum (System.Drawing.Drawing2D)을 살펴보십시오. 가치 3 베지/Bezier3 7 PathType가 GraphicsPath.SetMarkers 방법과 조합 16 대시 모드 32 경로 마커 128 근접에 Subpath

+0

위 목록의 세 번째 번호 (PathPointType)입니다. 내가 가진 문제는 위의 배열에서 2 Bezier/Bezier3 (PathPointType = 3) 커브입니다. 배열을 나눌 위치를 결정하는 방법을 알아야합니다. 나는 '-1191.761000, 10426.620000, 3'값이 첫 번째 원호의 끝점이고 두 번째 원호의 시작점이라는 점을 프로그래밍 방식으로 추가한다는 것을 알고 있습니다. 그러나이를 프로그래밍 방식으로 결정하는 방법을 알아야합니다. –

0

이 사람도 나를 괴롭 히고있었습니다. 나는 마커없이 내 통제를 넘어서 만든 경로를 가지며 곡선 종점을 파악할 수 없었다.

이 경우 곡선은 [i + 1]에서 시작하지만 그렇지 않습니다. GDI는 아마도 경로 배열을 결합하여 점 배열을 더 짧게 만듭니다. 이 경우 곡선 점은 [0], [1], [2], [3]입니다.

 
-177.47, 11021.67, 1 // Draw line to this point AND use it as a Bezier start! 
-614.44, 11091.82, 3 // Second Bezier point 
-1039.79, 10842.28, 3 // Third Bezier point 
-1191.76, 10426.62, 3 // Fourth Bezier point AND first point of the next Bezier! 
-1591.56, 10493.59, 3 // Second Bezier point 
-1969.96, 10223.77, 3 // Third Bezier point 
-2036.92, 9823.96, 3 // Fourth Bezier point AND first point of the next Bezier! 
-2055.82, 9711.18, 3 // Second Bezier point 
-2048.09, 9595.54, 3 // Third Bezier point 
-2014.38, 9486.27, 3 // Fourth Bezier point
:

PathPointType.Start 또는 PathPointType.LinePathPointType.Bezier 뒤에 있다면, 당신이 이런 식으로해야합니다 귀하의 예제에서, 그래서 당신의 베 지어 곡선의 첫 번째 점으로 PathPontType.Start 또는 Path.PointType.Line을 치료해야 할 것 같습니다

따라서 PathPoints 배열을 포인트별로 분석 할 때 색인을 따라 현재 을 점검해야합니다. PatPointType에있는 문서가 도움이 될 수 있습니다. 대부분의 경우 처음 세 개가 아닌 비트에 저장된 추가 데이터는 무시할 수 있습니다.이 세 개는 Start, LineBezier을 정의합니다. 단 하나의 예외는 CloseSubpath이지만 다음 조언을 고려하면 관련이 없습니다.

PathPoints이라는 엄청난 숫자로 구성된 복잡한 경로가있는 경우 GraphicsPathIterator을 사용하여 경로를 청크로 분할하면 편리 할 수 ​​있습니다. 이것은 PathPointType.CloseSubpath을 무시할 수있는 전체 절차를 단순화합니다. 항상 GraphicsPath 청크의 마지막 지점이됩니다.

Reflector 또는 here을 빠르게 살펴보고 PointTypes 어레이를 더 잘 이해하려면 도움이 될 수 있습니다.