我正试图在GraphicsPath周围做一个边界,以方便分组大小。这工作得很好,但当我将其中一个点转换为贝塞尔时,它包括贝塞尔手柄在边界内的位置,使选择矩形比预期的要大得多。
这是路径第一次创建时的样子,默认情况下,点是没有bezier的线。选择矩形按预期工作
非bezier行为右
当我双击一个点时,它会自动将这些点转换为贝塞尔曲线(如果是贝塞尔曲线,则切换回直线),然后选择矩形也会在路径中反映手柄点。
当使用bezier路径时
正如你所看到的,它应该在贝塞尔曲线下方停止矩形,但它似乎也扩展到手柄。
下面是计算矩形周长的代码。
Public Overrides subdrawselectionrectangle (ByVal g As Graphics)SelectionRectangle = New RectangleF(0,0,0,0)
Dim GP As GraphicsPath = _lastGp 'DAVE
如果GP不是Nothing则如果_lastGp。PointCount祝辞1然后试一试Dim BH作为新单曲;Dim TH作为新单曲;Dim LW作为新单曲;Dim RW作为新单曲
TH = GP.PathPoints(0).Y
LW = GP.PathPoints(0).X
For i = 0 To GP.PathPoints.Length - 1
With GP.PathPoints(i)
If .Y < TH Then TH = .Y
If .X < LW Then LW = .X
If .Y > BH Then BH = .Y
If .X > RW Then RW = .X
End With
Next i
'DAVE - This code won't work as it doesn't factor in for space made by the actual bezier curves, GP path must be followed. BUT! this is a tidier solution.
'SelectionRectangle = New RectangleF(0, 0, 0, 0)
'If _pointArray IsNot Nothing Then
' If _pointArray.Count > 1 Then
' Try
' Dim BH As New Single : Dim TH As New Single : Dim LW As New Single : Dim RW As New Single
' LW = _pointArray(0).P.X
' TH = _pointArray(0).P.Y
' For i = 0 To _pointArray.Count - 1
' With _pointArray(i).P
' If .Y < TH Then TH = .Y
' If .X < LW Then LW = .X
' If .Y > BH Then BH = .Y
' If .X > RW Then RW = .X
' End With
' Next i
'=================================
SelectionRectangle = New RectangleF(New PointF(LW, TH), New SizeF(RW - LW, BH - TH))
Dim r As RectangleF = DrawRectangle.GetNormalizedRectangle(SelectionRectangle)
Dim gpen As Pen = New Pen(Color.Gray, MyBase.StrokeWidth)
gpen.DashStyle = DashStyle.Dash
g.DrawRectangle(gpen, r.X, r.Y, r.Width, r.Height)
gpen.Dispose()
Catch ex As Exception
ErrH.Log("DrawSelectionRectangle", "Draw", ex.ToString(), ErrH._LogPriority.Info)
End Try
End If
如果结束
结束子
对一个简单的解决方案的任何帮助将不胜感激。:)
我已经尝试使用实际的点数组作为参考,但这并没有考虑到贝塞尔抛出的曲线。如果运行上面注释的代码,请参见示例。
尝试遵循路径数组而不是图形路径
WOW…
花了一段时间,但我找到了答案!
字面意思是1行!
GP。平
固定线路