Линии с примененным DashStyle нарисованы неправильно - PullRequest
3 голосов
/ 05 декабря 2011

Занимаясь программированием ГИС, я наткнулся на следующую странную проблему: Когда я применяю матрицу преобразования с довольно большими значениями преобразования к объекту 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.

1 Ответ

2 голосов
/ 05 декабря 2011

Да, это ошибка. Вы должны сообщить об этом? Я не думаю, что Microsoft собирается с этим что-то делать.

Вы можете попробовать изменить графическую процедуру, чтобы попытаться не работать в таком масштабе или просто избегать использования свойства DashStyle. Установка собственного DashPattern также не решает проблему.

Я думаю, WPF справится с этой ситуацией лучше, поскольку он основан на векторах, а не на пикселях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...