/ / Поведение на .NET's System.Drawing.Pen с дробна ширина - .net, system.drawing

Поведение на System.Drawing.Pen .NET с фракционна ширина - .net, system.drawing

Виждам някакво странно поведение с дробови ширини на писалката и се чудя дали някой може да обясни какво се случва. Рисуване на правоъгълник върху формуляр в отговор на събитие в Paint:

private void Form1_Paint(object sender, PaintEventArgs e)
{
const float width = 1.996093F;
Rectangle rectangle = new Rectangle(10, 10, 20, 20);

using (Pen pen = new Pen(Color.Black, width))
{
e.Graphics.DrawRectangle(pen, rectangle);
}
}

С ширина между 0 и 1.996093, получавам правоъгълник с ширина 1 пиксел. С ширина между 1.996094 и 2.003906 получавам правоъгълник с ширина 2 пиксела; от 2.003907 до 3.996093 получавам 3 пиксела и т.н. Още по-странно, с ширина 1.9960937, получавам правоъгълник, който е два пиксела широк на горния си ръб, и един пиксел широк на другите му ръбове.

Някой може ли да обясни какво се случва тук? Някак се надявах точките на прекъсване да са 1,5, 2,5, 3,5 и т.н.

Отговори:

0 за отговор № 1

Трябва да видите, че проблемът отшумява, когато активирате анти-псевдоним за обекта Graphics, който рисувате, мисля.

Проблемът е вечен: Когато имате частично нарисувани пиксели, те ще са черни или бели? Резултатът зависи от алгоритъма и предположенията.

Въпреки че се чудя защо използвате дробниширина на пикселите изобщо, когато действително искате ясни и ясни широки линии с един или два пиксела. Можете лесно да закръгляте ширината си до цели числа и вече не виждате подобни проблеми.