Есть точки A, B и C, по которым построена квадратичная кривая.
__B__
/ \
/ \
| |
A C
Я хочу в растре заполнить промежуток между отрезком AC и кривой. Методы затравки не подходят - создавать новую текстуру а потом ее удалять слишком долго. Есть какие-нибудь алгоритмы? Или хотя-бы куда копать?
Проходи битмап по y-координате. Если сканирующая линия и твоя кривая пересеклись, вычисляй координаты пересечения слева и справа. Заливай этот отрезок. PROFIT
Я так полагаю, что при сканлайне если решать уравнение кривой относительно Х на данной У, то будет проблема
1) Решать уравнение третьей степени для каждой строки попахивает оверхедом
2) Корней может быть несколько, например в таком случае: https://dl.dropboxusercontent.com/u/31471800/p2p/Screenshot - 01.09.2014 - 15... , т.е. простыня кода со всеми описанными случаями будет до Китая.
да, тогда сложнее. но имхо можно свести всё к паре случаев. алгоритм примерно такой:
1) из точек A, B, C выбираем самую левую. не ограничивая общности, считаем, что это не B (иначе, s/левую/правую). ну и далее, не ограничивая общности считаем, что это A (A <-> C)
2) от точки A идем вправо по одному пикселю. т.е. двигаем вертикальную прямую слева направо. строим точки отрезка и кривой на этой прямой (или, если отрезок кончился (а рано или поздно он кончится), то начинаем строить кривую со второго конца). проводим через эти точки вертикальный отрезок (заливка)
3) когда отрезок уже кончился и две точки на кривой сошлись, заканчиваем
Как негде? А что такое SmlImageDrawLine? Она ж рисует кривую! Или это из левой библиотеки? Ну так свою функцию напиши, там же вообще как 2 пальца об асфальт!!!
Как негде? А что такое SmlImageDrawLine? Она ж рисует кривую!
Прямую. Моя. Вы мне предлагаете смержить код этой функции в код рисования заполненной кривой и там, получая X и Y получать X прямой на данном Y а дальше использовать заполнение как по scanline?
если решать уравнение кривой относительно Х на данной У, то будет проблема
1) Решать уравнение третьей степени для каждой строки попахивает оверхедом
Да это лет 15 назад на обычных PC того времени уже не было проблемой. А на видеокартах с ускорением того же времени эти кривые безье можно было заливать пачками, с градиентами.
Может тебе посмотреть в сторону OpenGL? Или если хочется руками, найди книжку по компьютерной графике годов 90-х, там все должно быть
Тебе же уже написали, ты ведь рисуешь и кривую и отрезок. Тебе нужно для каждого y, где есть точки кривой или отрезка, посчитать минимальный и максимальный x. Дальше просто зарисовываешь горизонтальный отрезок между двумя иксами.