2016-08-18 2 views
0

.NET WinForms에서 폴리 라인을 그리기 위해 SharpDX를 사용하고 있습니다. 이 폴리선은 판금 프로파일을 나타냅니다.PathGeometry.Widen()을 사용할 때 StrokeStyle이있는 불필요한 End-Caps

' update m_fillTransformedGeometry based on m_pathGeometry & the current transform matrix3x2, 
m_fillTransformedGeometry = New TransformedGeometry(D2DCanvas.canvas_factory2D, m_pathGeometry, Matrix3x2.Rotation(m_rotation, InsertPoint) * _transformMatrix) 

' to draw the polyline 
D2DCanvas.canvas_renderTarget2D.DrawGeometry(m_fillTransformedGeometry, m_fillBrush, plaatdikte * _transformMatrix.ScaleVector(1), m_strokeStyle) 

폴리 라인 가져 : I은 A가 (계정 변환에 & 규모를 취할) 변환을 적용 스크리닝 그려지 전에

'reset m_pathGeometry (the core geometry of this sheetmetal profile) 
m_pathGeometry = New PathGeometry(D2DCanvas.canvas_factory2D) 

' pointsRef = collection of points showing the segments & bends in this sheetmetal profile 
Dim pointsRef As List(Of Vector2) = calculateSegmentsPoints() 

' Add lines to m_pathGeometry using our points collection 
Using sink As SimplifiedGeometrySink = m_pathGeometry.Open() 
    sink.BeginFigure(pointsRef.First(), FigureBegin.Filled) 
    sink.AddLines(pointsRef.ToArray) 
    sink.EndFigure(FigureEnd.Open) 
    sink.Close() 
End Using 

:

PathGeometry 객체는 폴리 라인을 정의 구성된다 스트로크 스타일, 둥근 라인 조인 및 플랫 엔드 캡으로 그려 짐

With m_strokeStyleProps 
    .LineJoin = LineJoin.Round 
    .EndCap = CapStyle.Flat 
    .StartCap = CapStyle.Flat 
End With 
' First draw a wider stroke 
D2DCanvas.canvas_renderTarget2D.DrawGeometry(m_fillTransformedGeometry, m_strokeBrush, (plaatdikte + 0.2) * _transformMatrix.ScaleVector(1), m_strokeStyle) 

' Then draw the fill 
D2DCanvas.canvas_renderTarget2D.DrawGeometry(m_fillTransformedGeometry, m_fillBrush, plaatdikte * _transformMatrix.ScaleVector(1), m_strokeStyle) 

: 약간 넓은 StrokeWidth와 함께, 어두운 색으로 동일한 폴리 라인을 그릴

JustAFill

먼저 생각 하였다결과는 스트로크를 사용할 수 약간 옅은 결과는 좋지만 엔드 캡은 다음과 같이 획을 긋지 않습니다. NoEndCapStroke

두 번째 아이디어은 원본 polyline-PathGeometry에서 Widen() 메서드를 호출하여 획 자체에 대해 약간 확대 된 PathGeometry를 만드는 것입니다.

' update m_transGeom based on m_widenedPathGeometry & the current transform matrix3x2, 
m_transGeom = New TransformedGeometry(D2DCanvas.canvas_factory2D, m_widenedPathGeometry, Matrix3x2.Rotation(m_rotation, InsertPoint) * _transformMatrix) 
' to draw the stroke of the Polyline 
D2DCanvas.canvas_renderTarget2D.DrawGeometry(m_transGeom, m_strokeBrush, plaatdikte * _transformMatrix.ScaleVector(1), m_strokeStyle) 

' update m_fillTransformedGeometry based on m_pathGeometry & the current transform matrix3x2, 
m_fillTransformedGeometry = New TransformedGeometry(D2DCanvas.canvas_factory2D, m_pathGeometry, Matrix3x2.Rotation(m_rotation, InsertPoint) * _transformMatrix) 
' to draw the fill of the PolyLine 
D2DCanvas.canvas_renderTarget2D.DrawGeometry(m_fillTransformedGeometry, m_fillBrush, plaatdikte * _transformMatrix.ScaleVector(1), m_strokeStyle) 

이 불필요한 생성이 넓어진 형상 (! 모두 동일한 StrokeStyle 사용) 전에 "채우기"도면에 "스트로크"로 (계정 변환 도입) 그린 얻는다

'define m_widenedPathGeometry (makes op the outline/stroke of this sheetmetal profile) 
m_widenedPathGeometry = New PathGeometry(D2DCanvas.canvas_factory2D) 
Using sink As SimplifiedGeometrySink = m_widenedPathGeometry.Open() 
    m_pathGeometry.Widen(0.2, sink) 
    sink.Close() 
End Using 

최종 캡에 미치는 영향 : 를 (어느 둥근, 느릅 나무는 StrokeStyle에 정의되지 않았거나 사이에 뭔가)

enter image description here

이 스트로크/채우기 - I가 사용 StrokeStyle가 '둥근'엔드 캡을 가지고 다시 정의 할 때 방법은 벽돌 쌓는 제대로 작동 :

enter image description here

그러나 '평면'엔드 캡이 난 후 정말로 것입니다.

왜 이런 일이 발생하는지 또는 어떻게 다르게 해결할 수 있습니까?

건배!

+0

StrokeStyle을 전혀 사용하지 않고 위 테스트를 한 결과, '확대 된'PathGeometry는 여전히 폴리 라인의 끝에서 이러한 아티팩트를 산출합니다. [예] (http://i.stack.imgur.com/wgVrH.jpg) – BertCoding

답변

0

무엇이 잘못 되었습니까?

이와 비슷한 문제가 발생할 수있는 다른 사용자에게 쓰기.

확장 된 지오메트리를 생성 할 때 'FigureEnd'속성이 'Open'으로 설정되었다고 추가하면 '닫힌 루프'를 만드는 지오 메트릭을 방지하여 이러한 아티팩트를 발생시킵니다.

m_widenedPathGeometry = New PathGeometry(D2DCanvas.canvas_factory2D) 
Using sink As SimplifiedGeometrySink = m_widenedPathGeometry.Open() 
    m_pathGeometry.Widen(0.2, sink) 
    **sink.EndFigure(FigureEnd.Open)** <- adding this line leaves the stroke open! 
    sink.Close() 
End Using