做一些GIS编程我偶然发现了以下奇怪的问题: 当我将具有相当大的变换值的变换矩阵应用于Graphics对象,然后从A点到B点绘制一条线时,只要我将DashStyle应用于使用过的Pen对象,就会将其绘制为弯曲。
以下是一些示例代码:
protected override void OnPaint( PaintEventArgs e ) {
base.OnPaint( e );
Graphics g = e.Graphics;
g.Clear( Color.White );
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
Matrix m = new System.Drawing.Drawing2D.Matrix();
m.Reset();
m.Translate( -1520106.88f, -6597594.5f, MatrixOrder.Append );
m.Scale( 0.393068463f, -0.393068463f, MatrixOrder.Append );
g.Transform = m;
g.TranslateTransform( 0, 400 );
Pen p1 = new Pen( Color.Green, 8.0f );
Pen p2 = new Pen( Color.Magenta, 7.0f );
PointF[] roadLine = new PointF[2];
roadLine[0] = new PointF( 1520170.13f, 6596633.0f );
roadLine[1] = new PointF( 1521997.38f, 6596959.0f );
// Normal (solid line)
g.DrawLines( p1, roadLine );
g.DrawLines( p2, roadLine );
g.TranslateTransform( 0, -200 );
//Dashed
g.DrawLines( p1, roadLine );
p2.DashStyle = DashStyle.Dash;
g.DrawLines( p2, roadLine );
g.TranslateTransform( 0, -200 );
//Dashed
g.DrawLines( p1, roadLine );
p2.DashStyle = DashStyle.DashDot;
g.DrawLines( p2, roadLine );
g.TranslateTransform( 0, -200 );
//Dash-Dot-Dot
g.DrawLines( p1, roadLine );
p2.DashStyle = DashStyle.DashDotDot;
g.DrawLines( p2, roadLine );
}
如果您将其放入新的Windows窗体应用程序并运行它,您将看到一些实线和一些虚线(具有不同的破折号样式)。我希望虚线完全覆盖相应的实线,但它们不会。
请注意,绿色,实线和虚线都使用A点和B点的坐标。
这是预期的行为,还是应该将其报告为.NET错误?
我使用Visual Studio 2008和.NET 2.0以及.NET 3.5进行了测试。
答案 0 :(得分:2)
是的,这是一个错误。你应该举报吗?我不认为微软会对此采取任何措施。
您可以尝试更改图形例程,尝试不按比例工作,或者只是避免使用DashStyle
属性。设置自己的DashPattern
也无法解决问题。
我认为 WPF会更好地处理这种情况,因为它是基于矢量的,而不是基于像素的。