2012-05-07 4 views
0

Я вижу странное поведение при рисовании линии с масштабным преобразованием (Graphics.ScaleTransform() - см. MSDN) в моем методе OnPaint().Неправильное масштабирование Pen при использовании Graphics.ScaleTransform

При использовании большого коэффициента y-масштаба для метода ScaleTransform, если масштаб x установлен выше 1x, линия внезапно становится намного больше.

Установка ширины пера, с которой линия нарисована на -1, кажется, оборачивает проблему, но я не хочу рисовать очень тонкую линию (строка должна быть напечатана позже, 1px - слишком тонкая).

Вот некоторые примеры кода для демонстрации проблемы:

public class GraphicsTestForm : Form 
{ 
    private readonly float _lineLength = 300; 
    private readonly Pen _whitePen; 

    private Label _debugLabel; 

    public GraphicsTestForm() 
    { 
     ClientSize = new Size(300, 300); 

     Text = @"GraphicsTest"; 
     SetStyle(ControlStyles.ResizeRedraw, true); 

     _debugLabel = new Label 
     { 
      ForeColor = Color.Yellow, 
      BackColor = Color.Transparent 
     }; 
     Controls.Add(_debugLabel); 

     _lineLength = ClientSize.Width; 
     _whitePen = new Pen(Color.White, 1f); // can change pen width to -1 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     float scaleX = ClientSize.Width/_lineLength; 
     const int ScaleY = 100; 

     e.Graphics.Clear(Color.Black); 

     _debugLabel.Text = @"x-scale: " + scaleX; 

     // scale the X-axis so the line exactly fits the graphics area 
     // scale the Y-axis by scale factor 
     e.Graphics.ScaleTransform(scaleX, ScaleY); 

     float y = ClientSize.Height/(ScaleY * 2f); 
     e.Graphics.DrawLine(_whitePen, 0, y, _lineLength, y); 

     e.Graphics.ResetTransform(); 
    } 
} 

Я хотел бы линию/перо масштабировать изящно, без прыжков в размерах так резко.

(Кроме того, я заметил, что, когда линия очень велика, она не тянет постоянно на несколько мониторов Возможно, это связано.?)

+1

Просить GDI + делать необычные вещи никогда не является проблемой. Необычно здесь смысл рисовать с толщиной, которая изменяется в зависимости от угла. Держите коэффициенты X и Y-масштабирования одинаковыми, чтобы получить лучший результат. –

+0

@ HansPassant Спасибо за подсказку! Мне действительно нужно нарисовать кривую синуса с 100 точками на оси X, но ось Y только между -1 и 1. Следовательно, разница в масштабных коэффициентах X и Y. Должен ли я просто масштабировать точки отдельно, прежде чем рисовать и забывать о графических преобразованиях? –

ответ

2

Попробуйте изменить ширину пера по шкале:

_whitePen = new Pen(Color.White, 1f/ScaleY); 
e.Graphics.DrawLine(_whitePen, 0, y, _lineLength, y); 
+0

Есть ли проблема с постоянным созданием объекта Pen? –

+0

Этот вид работ: однако линия все еще не масштабируется вверх и вниз плавно - например, если я хочу использовать более толстую строку (10f/ScaleY), но это возвращает проблему. –

+0

Что касается непрерывного создания, удобно их утилизировать. Посмотрите на [этот предыдущий вопрос] (http://stackoverflow.com/questions/1819096/is-it-important-to-dispose-solidbrush-and-pen). Но чтобы избежать ненужного снижения производительности, вы можете проверьте, совпадает ли предыдущее перо с тем, которое вам нужно (сохранить последнее значение шкалы). –

1

Я просто компенсировали общее масштабирование в геометрии ручки линии; -

m_Pen->SetWidth(1.0f); 
m_Pen->ScaleTransform(1.0f/ZoomX, 1.0f/ZoomY); 

 Смежные вопросы

  • Нет связанных вопросов^_^