Занимаясь программированием ГИС, я наткнулся на следующую странную проблему:
Когда я применяю матрицу преобразования с довольно большими значениями преобразования к объекту 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 Forms и запустите его, вы увидите несколько сплошных линий и несколько пунктирных линий (с разными стилями штрихов). Я ожидаю, что пунктирные линии будут полностью перекрывать соответствующую сплошную линию, но это не так.
Обратите внимание, что как зеленые, сплошные линии и пунктирные линии используют координаты для точки A и точки B.
Это ожидаемое поведение или я должен сообщить об этом как ошибка .NET?
Я тестировал с Visual Studio 2008 и .NET 2.0 и .NET 3.5.