Мне нужен алгоритм, который может быть (немного) медленнее, чем алгоритм рисования линий Брезенхема, но имеет если быть более точным. Под «точным» я имею в виду: каждый пиксель, которого коснулись, должен быть напечатан. Не больше, но и не меньше! Это означает, что использование более толстой линии или чего-то подобного невозможно, так как будет задействовано слишком много пикселей. Также мне не нужна графическая структура или что-то подобное, как это было спросил раньше, мне нужен алгоритм! Приложение действительно не в «графике», а в географическая область, где пиксели являются" плитками ".
Основная проблема для меня заключается в том, что мне нужна субпиксельная точность, что означает, что линия может начинаться с 0,75 / 0,33, а не только с 0/0, как в случае с целочисленными значениями. Я пытался создать рабочее решение последние несколько часов, но не могу заставить его работать - слишком много крайних случаев.
Сначала я подумал, что версия с антиалиасингом, такая как алгоритм из Wu, должна работать, но она печатает слишком много пикселей (особенно для начальной и конечной точек) и в некоторых случаях все еще пропускает некоторые пиксели, например для очень коротких строк.
Затем я попытался заставить работать Брезенхэма, заменив второе «если» на «иначе, если», как указано здесь, и он ближе, но все же не там. Затем я попытался переместить Bresenham с целочисленной точности на точность с плавающей запятой, что привело к бесконечному циклу (поскольку значения x, y перепрыгивали через условие завершения if (y1 == y2 && x1 == x2)
).
Я мог бы использовать решение наивного рисования линий, но какое delta
мне следует использовать? Например. если я использую 0.1, я все равно пропущу некоторые пиксели, а использование меньших значений, вероятно, займет слишком много времени (и все равно пропустить пиксели).
Было бы признательно за рабочее решение на C / Java / .... По крайней мере, он должен работать для октанта 1, но полноценное решение было бы еще лучше.
Обновление. Мне пришла в голову следующая идея: используя простую растеризацию линии, вы можете рассчитать 4 пикселя-кандидата для каждой точки. Затем проверьте эти 4 пикселя, действительно ли линия их пересекает. Но я не уверен, может ли пересечение линии / прямоугольника быть достаточно быстрым.