Точный субпиксельный алгоритм рисования линий (алгоритм растеризации)

Мне нужен алгоритм, который может быть (немного) медленнее, чемАлгоритм рисования линий Брезенхэма но должен быть намного точнее. Под «точным» я подразумеваю: каждый потроганный пиксель должен быть напечатан. Не больше, но и не меньше! Это означает, что использование более толстой линии или подобного не вариант, так как будет задействовано слишком много пикселей. Также мне не нужна графическая структура или подобное, как это былоспросил доМне нужен алгоритм! Приложение на самом деле не в «графике», а вгеография области где пиксели являются «плитками».

Основная проблема для меня заключается в том, что мне нужна субпиксельная точность, что означает, что строка может начинаться с 0,75 / 0,33, а не только с 0/0, как это имеет место для целочисленных значений. Я пытался создать рабочее решение за последние несколько часов, но не могу заставить его работать - слишком много крайних случаев.

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

Затем я попытался заставить Брезенхем работать, где я заменил второе «если» на «еще, если», как указаноВоти это ближе, но все еще не там. Затем я попытался перевести Bresenham с целочисленной точности на плавающую, что привело к бесконечному циклу (поскольку значения x, y перепрыгивали через условие завершенияif (y1 == y2 && x1 == x2)).

Я мог бы использоватьНаивная линия рисования решение, но котороеdelta я должен использовать? Например. если я использую 0.1, я все равно пропущу некоторые пиксели, а при использовании меньших значений это, вероятно, займет слишком много времени (и все еще будет пропускать пиксели).

Рабочее решение в C / Java / ... будет приветствоваться. По крайней мере, он должен работать для октанта 1, но полноценный раствор будет еще лучше.

ОбновитьЯ пришел к следующей идее: используя растеризацию наивной линии, вы можете рассчитать 4 пиксельных кандидата на каждую точку. Затем проверьте эти 4 пикселя, действительно ли линия пересекает их. Но я не уверен, что пересечение линии / коробки может быть достаточно быстрым.

Ответы на вопрос(2)

Ваш ответ на вопрос