соединяя несколько сглаженных линий вместе - PullRequest
4 голосов
/ 20 апреля 2011

Я реализовал / скопировал алгоритм линии wu из псевдокода в wiki-pedia и других местах.

При рисовании синусоидальной волны она разрушается в точке, где линия изменяется от доминанты у к доминанте х (или наоборот). (Я не копировал код конечной точки, потому что он выглядит ужасно, и он мне не нужен для моих целей.)

image

Does anyone know a solution for this issue? If not I will modify the algorithm myself to get it to work. I am just curious if someone else has run into this and knows exactly how to fix it. Is it possible to implement without the lines being globally aware of each other? Or is this why drawing API's implement moveto and lineto functions?

Псевдокод

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Я просто хотел проверить это и закрыть его. Я думал, что удалил код конечной точки из опубликованного алгоритма на сайте. Однако я допустил ошибку и не удалил все это, поэтому линии ломались. Вот окончательный результат:

image

Если вы присмотритесь достаточно внимательно, вы увидите, что интенсивность немного скачет, когда линии изменятся с y-доминантного на x доминантного и наоборот. Это также потому, что длина строки составляет менее одного пикселя. Я полагаю, что рисование линии с более высоким разрешением, а затем с пониженной дискретизацией даст более качественный результат, как предложил Гай Сиртон. Но этого достаточно для моих целей.

1 голос
/ 23 апреля 2011

Если производительность не является большой проблемой, вы можете использовать более наивный подход к рисованию сглаженных линий, например:

  • Рисование линий в сетке с более высоким разрешением (например, некоторое целое число, кратное вашейцелевое разрешение) - вам необходимо отрегулировать их толщину.
  • Уменьшить до целевого разрешения путем преобразования каждого блока пикселей nxm в один пиксель, например, путем усреднения значений RGB.

В зависимости от того, на каком языке или операционной системе вы разрабатываете, для упрощения этой функции могут быть встроены функции.

В качестве альтернативы вы можете рассчитать, какая часть каждого пикселя покрыта вашей линией (пересекая квадрат пикселялиния), чтобы вычислить значение пикселей, сделать интенсивность пикселей относительно части области пикселей, покрытой линией.

...