Рисование плавной линии

323
19 декабря 2016, 19:58

Отрисовываемая линия выходит угловатой если рисовать слишком быстро. Как осуществить сглаживание на лету, чтобы линия была более естественной?

красная отрисована с использование ccDrawLine, черная ccQuadBezier

Answer 1

Для рисования линии сглаженной, есть специальный алгоритм - Алгоритм Ву. Там есть описание, как его реализовать.

Но похоже Вы делаете другое - простой графический редактор. И пользователь, проведя мышкой, должен получить <strike>ровную</strike>красивую кривую. Для этого, в процессе того, как пользователь рисует, нужно запоминать точки. Саму кривую рисовать в виде "ломанной кривой". Но когда пользователь отпускает мышку, берутся все сохраненные точки, с помощью кривых безье просчитываются красивые переходы и кривая отрисовывается. Если отрисовка достаточно быстрая, то просчитывать новую кривую можно на каждое движение мышки.

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

Я рекомендую начать с простого запоминания точек от нажатия до отпускания, а по факту отпускания рисуйте красивую кривую.

Answer 2

Предлагаю альтернативу, вместо того, чтобы читать событие onMouseMove попробуйте определять положение мышки (в состоянии "рисую плавную линию" после нажатия левой кнопки вниз) в Таймере с очень маленьким "шагом", минимально в 1 мс. Исхожу из того, что событие onMouseMove не успевает "прочитать" каждое из положений мыши при быстром движении в силу особенностей сообщений.

READ ALSO
Игра &ldquo;Четное - нечетное&rdquo;

Игра “Четное - нечетное”

Подскажите, пожалуйста, код игры "Четное - нечетное"

379
Перегрузка математических операторов

Перегрузка математических операторов

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

325
Пример открытия сокета

Пример открытия сокета

Добрый день, можете мне привести в качестве примера листинг кода c++, чтобы открывался сокет к сайту "examplecom" по порту 716, допустим

314
Как на Си передать информацию от микроконтроллера на COM- порт?

Как на Си передать информацию от микроконтроллера на COM- порт?

Добрый вечерЗанимаюсь изучением программирования микроконтроллеров АВР, и столкнулся с вопросом передачи данных от микроконтроллера на ПК через...

376