Аномалия интерполяции во время рисования

У меня проблема с режимом сглаживания и рисования AntiAliasing. Допустим, у меня есть сигнал с минимальными и максимальными значениями в одних и тех же точках. Поэтому я хочу отобразить его, чтобы увидеть, где он «толще».

Поэтому я использую метод рисования вертикальных линий и использования сглаживания. Вот в чем проблема, нарастающий фронт вроде сглажен, а спадающий нет. Если бы я добавил немного шума ко второму сигналу, можно было бы наблюдать то же самое.

Без шума

С шумом

![With noise][2]

Может ли кто-нибудь указать, что мне не хватает? Или эта проблема откуда-то еще?

Код (перенесен из комментариев):

Bitmap drawBitmap = new Bitmap(pictureBox1.Height, _
                               pictureBox1.Width, _
                               System.Drawing.Imaging.PixelFormat.Format32bppArgb);

Graphics drawGraph;

Point[] pts = new Point[] { new Point(0, 60), new Point(0, 59), new Point(1, 35), _
                            new Point(1, 47), new Point(2, 25), new Point(2, 35), _
                            new Point(3, 17), new Point(3, 25), new Point(4, 12), _
                            new Point(4, 27), new Point(5, 10), new Point(5, 22), _
                            new Point(6, 10), new Point(6, 11), new Point(7, 11), _
                            new Point(7, 16), new Point(8, 16), new Point(8, 24), _
                            new Point(9, 24), new Point(9, 34), new Point(10, 34), _
                            new Point(10, 46), new Point(11, 46), new Point(11, 59), _
                            new Point(12, 59), new Point(12, 72)};

using (drawGraph = Graphics.FromImage(drawBitmap)) {

    drawGraph.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic;
    drawGraph.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias; 

for (int i = 1; i < pts.Length - 1; i += 2) {
    drawGraph.DrawLine(new Pen(Color.Black, 1), pts[i], pts[i - 1]); 
    drawGraph.DrawLine(new Pen(Color.Black, 1), pts[i], pts[i + 1]);
    }
} 

pictureBox1.Image = drawBitmap;

person mrkurtan    schedule 18.12.2012    source источник
comment
Вам не нужно ставить подпись в своем посте - ваша карточка пользователя добавляется автоматически. Прочтите часто задаваемые вопросы для получения дополнительной информации.   -  person Artemix    schedule 18.12.2012
comment
Можете ли вы показать нам код, который вы используете, чтобы нарисовать это?   -  person Rawling    schedule 18.12.2012
comment
И извините, если это глупый вопрос, но на эта страница, которая является первым результатом Google, который я нашел, пример имеет сглаживание при движении вниз, но преднамеренно отключает его при движении вверх. Вы не делаете что-то подобное, не так ли?   -  person Rawling    schedule 18.12.2012
comment
Сглаживание включалось один раз в начале кода. Вот почему я не понимаю, почему кажется, что интерполяция не используется. На самом деле, если я рисую непрямую линию, она будет хорошо интерполирована, но если я рисую только вертикальные линии, задний край и его окружение не сглаживаются.   -  person mrkurtan    schedule 18.12.2012
comment
Можете ли вы показать нам свой код, чтобы мы могли попытаться воспроизвести это?   -  person Rawling    schedule 18.12.2012
comment
Я приведу результат операций с заданными значениями в массиве точек. Просто создайте форму и поместите на нее pictureBox и поместите этот код в конструктор формы.   -  person mrkurtan    schedule 18.12.2012
comment
Растровое изображение drawBitmap = новое растровое изображение (pictureBox1.Height, pictureBox1.Width, System.Drawing.Imaging.PixelFormat.Format32bppArgb); Графика DrawGraph; Точка[] pts = новая Точка[] { новая Точка(0, 60), новая Точка(0, 59), новая Точка(1, 35), новая Точка(1, 47), новая Точка(2, 25), новая точка (2, 35), новая точка (3, 17), новая точка (3, 25), новая точка (4, 12), новая точка (4, 27), новая точка (5, 10), новая точка (5, 22), новая точка (6, 10), новая точка (6, 11),   -  person mrkurtan    schedule 18.12.2012
comment
новая точка(7, 11), новая точка(7, 16), новая точка(8, 16), новая точка(8, 24), новая точка(9, 24), новая точка(9, 34), новая точка (10, 34), новая точка (10, 46), новая точка (11, 46), новая точка (11, 59), новая точка (12, 59), новая точка (12, 72)};   -  person mrkurtan    schedule 18.12.2012
comment
используя (drawGraph = Graphics.FromImage(drawBitmap)) { drawGraph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; DrawGraph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; for (int i = 1; i ‹ pts.Length - 1; i += 2) { drawGraph.DrawLine(new Pen(Color.Black, 1), pts[i], pts[i - 1]); drawGraph.DrawLine(новый Pen(Color.Black, 1), pts[i], pts[i + 1]); } } pictureBox1.Image = drawBitmap;   -  person mrkurtan    schedule 18.12.2012
comment
Извините, что так пишу, но я не могу ответить на свой вопрос через 8 часов... Надеюсь, это поможет воспроизвести ситуацию!   -  person mrkurtan    schedule 18.12.2012
comment
Переместил код в пост   -  person    schedule 18.12.2012


Ответы (1)


Также примените режим смещения пикселей:

drawGraph.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality;

InterpolationMode можно удалить, так как он ничего не делает с линиями (только с изображениями при изменении размера).

person Community    schedule 18.12.2012
comment
Без проблем. Просто совет: вы можете использовать метод DrawLines() вместо DrawLine(). Это может взять ваш массив точек и нарисовать все сразу. - person ; 18.12.2012