Я вижу странное поведение при рисовании линии с масштабным преобразованием (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();
}
}
Я хотел бы линию/перо масштабировать изящно, без прыжков в размерах так резко.
(Кроме того, я заметил, что, когда линия очень велика, она не тянет постоянно на несколько мониторов Возможно, это связано.?)
Просить GDI + делать необычные вещи никогда не является проблемой. Необычно здесь смысл рисовать с толщиной, которая изменяется в зависимости от угла. Держите коэффициенты X и Y-масштабирования одинаковыми, чтобы получить лучший результат. –
@ HansPassant Спасибо за подсказку! Мне действительно нужно нарисовать кривую синуса с 100 точками на оси X, но ось Y только между -1 и 1. Следовательно, разница в масштабных коэффициентах X и Y. Должен ли я просто масштабировать точки отдельно, прежде чем рисовать и забывать о графических преобразованиях? –