放大矢量绘图 .NET 时线宽增加
Linewidth increases when zooming in on vector drawing .NET
在 Visual Basic .NET 中放大矢量绘图时,在某个点之后,每次缩放操作都会使线条变粗。
应用程序功能基本上就是画一些线:
- 使用变换和缩放设置图形矩阵以使整个图形填充 canvas(使用 g.Transform = myMatrix)
- 绘制线条(使用"g.DrawLine(...)")
... 放大时:
- 调整变换矩阵以放大鼠标指针位置
- 矩阵的比例因子增加 1.1
矩阵在PrepareDrawing方法中设置:
Private Function PrepareDrawing(ByRef g As Graphics) As Matrix
'Create transformation matrix
Dim myMatrix = New Matrix
'Determine the zoom factor
If zoomfactor > 10000 Then zoomfactor = 10000
If zoomfactor < 0.001 Then zoomfactor = 0.001
scaleFactor = zoomfactor * BORDERFACTOR * Math.Min(pb.Width / viewportModel.Width, pb.Height / viewportModel.Height)
'Determine the offset to keep everything centered
If panningOffset.IsEmpty Then
ZoomToNetwork()
End If
myMatrix.Translate(panningOffset.X, panningOffset.Y)
myMatrix.Scale(scaleFactor, -scaleFactor, MatrixOrder.Append)
'transform current graphics
g.Transform = myMatrix
Return myMatrix
End Function
缩放功能在 ZoomInWithMouseWheel 方法中设置:
Public Sub ZoomInWithMouseWheel(ByVal e As Point, ByVal delta As Single)
Dim orgZoomfactor = zoomfactor
Dim screenX As Double = e.X
Dim screenY As Double = e.Y
If delta > 0 Then
zoomfactor = zoomfactor * 1.1
Else
zoomfactor = zoomfactor / 1.1
End If
scaleFactor = zoomfactor * BORDERFACTOR * Math.Min(pb.Width / viewportModel.Width, pb.Height / viewportModel.Height)
Dim perc = zoomfactor / orgZoomfactor
panningOffset.Offset(-(perc * screenX - screenX) / scaleFactor, (perc * screenY - screenY) / scaleFactor)
End Sub
原来当矩阵的第一个元素变得大于1时,线宽随着这个数增加
对正在发生的事情以及如何防止线宽增加有什么想法吗?
好的,找到答案了。线宽应补偿矩阵元素(0),例如:
g.DrawLines(New Pen(Color.Blue, lineWidth / g.Transform.Elements(0)), pnts)
例如 lineWidth 为 1
在 Visual Basic .NET 中放大矢量绘图时,在某个点之后,每次缩放操作都会使线条变粗。
应用程序功能基本上就是画一些线:
- 使用变换和缩放设置图形矩阵以使整个图形填充 canvas(使用 g.Transform = myMatrix)
- 绘制线条(使用"g.DrawLine(...)")
... 放大时:
- 调整变换矩阵以放大鼠标指针位置
- 矩阵的比例因子增加 1.1
矩阵在PrepareDrawing方法中设置:
Private Function PrepareDrawing(ByRef g As Graphics) As Matrix
'Create transformation matrix
Dim myMatrix = New Matrix
'Determine the zoom factor
If zoomfactor > 10000 Then zoomfactor = 10000
If zoomfactor < 0.001 Then zoomfactor = 0.001
scaleFactor = zoomfactor * BORDERFACTOR * Math.Min(pb.Width / viewportModel.Width, pb.Height / viewportModel.Height)
'Determine the offset to keep everything centered
If panningOffset.IsEmpty Then
ZoomToNetwork()
End If
myMatrix.Translate(panningOffset.X, panningOffset.Y)
myMatrix.Scale(scaleFactor, -scaleFactor, MatrixOrder.Append)
'transform current graphics
g.Transform = myMatrix
Return myMatrix
End Function
缩放功能在 ZoomInWithMouseWheel 方法中设置:
Public Sub ZoomInWithMouseWheel(ByVal e As Point, ByVal delta As Single)
Dim orgZoomfactor = zoomfactor
Dim screenX As Double = e.X
Dim screenY As Double = e.Y
If delta > 0 Then
zoomfactor = zoomfactor * 1.1
Else
zoomfactor = zoomfactor / 1.1
End If
scaleFactor = zoomfactor * BORDERFACTOR * Math.Min(pb.Width / viewportModel.Width, pb.Height / viewportModel.Height)
Dim perc = zoomfactor / orgZoomfactor
panningOffset.Offset(-(perc * screenX - screenX) / scaleFactor, (perc * screenY - screenY) / scaleFactor)
End Sub
原来当矩阵的第一个元素变得大于1时,线宽随着这个数增加
对正在发生的事情以及如何防止线宽增加有什么想法吗?
好的,找到答案了。线宽应补偿矩阵元素(0),例如:
g.DrawLines(New Pen(Color.Blue, lineWidth / g.Transform.Elements(0)), pnts)
例如 lineWidth 为 1