在进行一些 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 进行了测试。
最佳答案
是的,这是一个错误。你应该报告吗?我认为 Microsoft 不会对此采取任何措施。
您可以尝试更改图形例程以尝试不在这样的比例上工作,或者只是避免使用 DashStyle
属性。设置您自己的 DashPattern
也不能解决问题。
我认为 WPF 会更好地处理这种情况,因为它是基于矢量的,而不是基于像素的。
关于c# - 错误地绘制了应用了 DashStyle 的线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8385604/