С# графические линии рисования рисуют ломаные линии

Я рисую графики ЭКГ с помощью C # Graphics. Я рисую кривую, используя метод Drawlines. однако стыки линий выглядят сломанными. Перепробовал все доступные варианты режима сглаживания и капстайла, ничего не помогает. вот пример графика1 и пример графика2

код ниже:

private void DrawCurve(Graphics g, cPoint[] data)
{
    List<Point> ps = new List<Point>();

    for (int i = 0; i < data.Length - 1; i++)
    {
        int x = data[i].x;
        int y = data[i].y;

        if (x > 0 && x < (Width))
        {
            ps.Add(new Point(x, y));
        }
        else if (x > Width)
        {
            using (Pen p = new Pen(Color.Yellow))
            {
                if (ps.Count > 0)
                {
                    g.DrawLines(p, ps.ToArray());
                    ps.Clear();
                }
            }
        }
    }
}

person msuzer    schedule 08.06.2014    source источник
comment
Мне кажется совершенно нормальным. Нет ничего лучше шумного сигнала, чтобы продемонстрировать низкое разрешение стандартных мониторов. Чтобы исправить это, нужно потратить деньги на аппаратное обеспечение, обычное в медицинском бизнесе, обойдется вам в пару тысяч.   -  person Hans Passant    schedule 08.06.2014


Ответы (2)


Чтобы избежать ломаных линий, особенно когда линии нарисованы под острыми углами, вам нужно выбрать правильные значения для этих свойств:

p.MiterLimit = p.Width * 1.25f;
p.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;

MiterLimit имеет значение по умолчанию 10f, что слишком много для тонких линий! LineJoin также имеет значение по умолчанию (Mitre), которое не помогает.

Вам также следует поэкспериментировать со значением MiterLimit (оставаясь в диапазоне ширины пера) и, возможно, с самой шириной Pen; обратите внимание, что Pen.Width — это float, поэтому вы можете увеличить его до 1,25 или около того..

Если вы на самом деле говорите о нечетком виде в некоторых местах, то это из-за сглаживания; обычно это хорошо, но для более четких линий отключите его для вашего объекта Graphics:

e.Graphics.SmoothingMode =  System.Drawing.Drawing2D.SmoothingMode.None

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

person TaW    schedule 08.06.2014
comment
Спасибо @TaW за ваш быстрый ответ, я многому научился из вашего ответа, хотя ни один из советов не решает мою проблему, кроме отключения сглаживания. Я уже пытался отключить сглаживание, но я не доволен результатом. Я пробовал почти любую комбинацию значения MiterLimit и стиля LineJoin, но все равно не помогло. Это никоим образом не улучшает его, и я остался без понятия о том, что там происходит. - person msuzer; 08.06.2014
comment
Ганс сделал хорошее замечание. Возможно, ваша проблема действительно в том, что вы смотрите на разрешение растровой графики и поэтому видите его пределы. На самом деле дисплеи Retina становятся доступными, но сколько вам понадобится?! Вы также пытались немного поднять Pen.Width? Наконец: как вы думаете, вы могли бы улучшить свой пример изображения в программе рисования, чтобы мы могли увидеть, как вы хотите, чтобы оно выглядело? - person TaW; 08.06.2014
comment
Я добавил еще одно изображение (извините, это лучшее, что я могу сделать), на котором кривая состоит из множества коротких вертикальных линий. Вы можете видеть, что стык двух последовательных вертикальных линий как бы надломлен или треснут (ну, может быть, я не могу подобрать подходящее слово, чтобы описать это). Я хочу, чтобы соседние части линии выглядели связанными. Я не думаю, что это проблема с оборудованием дисплея. Я немного поиграл с Pen.Width, это не помогло, однако это так странно, что когда я увеличил Pen.Width до 2.0, кривая стала размытой, как будто дисплей не в фокусе. - person msuzer; 08.06.2014

Вы рисуете короткие линии. Вот почему вы получаете такой результат. Вместо DrawLines() попробуйте использовать РисоватьКривую().

g.DrawCurve(p, ps.ToArray());
person Vano Maisuradze    schedule 08.06.2014
comment
Хороший совет для нарисованных от руки красных линий, но для графиков ЭКГ я бы предпочел не рисовать придуманные кривые. - person TaW; 08.06.2014