![]() |
|
![]() ![]() ![]() |
|
Семен |
|
|||
Unregistered |
Люди, поможите пожалуйста.
Нужен такой алгоритм: Когда мышой рисуешь, линии кривые, угловатые, ну и т.п. Нужно чтобы программа на лету (можно с небольшим запаздыванием) сглаживала мелкие неровности рисуемой линии. Нужен максимально простой и быстрый алгоритм. Буду очень благодарен за помошь. |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Опиши по подробнее что сделать нужно... Чтобы углы округлялись?
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Alex101 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: 1 Всего: 10 |
А что понимать под "мелкими неровностями"? -------------------- С уважением, А. Фролов. |
|||
|
||||
Семен |
|
|||
Unregistered |
Ну вот, например, откройте Paint и попробуйте в нем нарисовать мышкой волну. Линия получается шорохованая, не гладкая, появляются мелкие пиксельные выступы. Вот от этого и надо избавиться. И именно не антиалайзингом (его быть не должно), а сглаживанием пиксельно линии.
Тоесть надо сглаживать не углы, а причесывать саму линию. Есть идеи? ![]() |
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 18 |
Делай обычный сплайн. Приближай многочленами свою кривую и перерисовывай
![]() -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Chingachguk, а что такое сплайн? Я бы предложил проводить параболы...
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Alex101 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: 1 Всего: 10 |
Так тогда надо просто линию рисовать Но это только для прямых... -------------------- С уважением, А. Фролов. |
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 18 |
Сплайн - то же приближение кривой известной функцией(функциями) - слово ко мне из excel-я приклеилось
![]() -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Тогда, то что я написал (про параболу) - это тоже самое? Просто это один из самых простых способов по реализации. Сначала соединить первые три точки, затем: третью, четвертую и пятую, далее: пятую, шестую, седьмую... Только вот как расстояния между точками выбирать? По какому принцыпу?
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 18 |
А чтобы функция была однозначной на интервале, видимо
![]() Те если ты выберешь такие точки, что график между ними - никак не однозначная функция, как ни крути кооординаты, персекается, к примеру, то фиг приблизишь ее параболой или более сложным многочленом ... -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Alex101 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: 1 Всего: 10 |
А теперь представьте, что в линии точки через одну-две будут иметь разные знаки... В результате получится тоже, что и было нарисовано.... -------------------- С уважением, А. Фролов. |
|||
|
||||
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Я бы не занимался приближением к каким-то параболам. Надо принять что на достаточно малом отрезке кривая приближается к прямой и работать с отрезком. Далее допустим у нас есть точки A, B, C, D - это точки лежащие достаточно близко на кривой, причем по оси абсцисс координаты этих точек возрастают от A ->D(пока примем это для простоты, в дальнейшем можно добавить решение для других вариантов тоже). Теперь берем точки A и C, по их координатам интерполируем точку B' (линейная интерполяция - так как точки очень близки друг к другу будем считать AB, BC, CD отрезками). Сравниваем интерполируемую точку B' с реальной B:
Совпадают? - идем дальше. Не Совпадают - смещаем точку B на (например) средину расстояния B'B. (или смещаем с каким нибудь коэффициентом - например кладем на 1/5 от ожидаемого положения). Повторяем это по всей прямой. При достаточно аккуратном подборе коэффициентов смещения и длинны отрезков получаем сглаженность нужной степени. Можно сделать примерно то же самое только сравнивать не координаты точек а производную на каждом таком элементарном отрезке... Это будет только чуть-чуть сложнее, но я не могу себе пока представить даст ли это какой-либо выигрышь по сравнению с первым вариантом. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
Alex101 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: 1 Всего: 10 |
А ежели брать три точки и строить дугу окружности? Причем точки выбирать такие, чтобы было максимальное отклонение от прямой на каком-то отрезке... Ведь по трем точкам легко найти центр окружности, описанной вокруг треугольника... А затем уже "сглаживать" соединения дуг -------------------- С уважением, А. Фролов. |
|||
|
||||
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Можно и круги, и многочлен ...надцатого порядка, а зачем? Все равно есть физический предел - разрешение монитора, вот и уменьши расстояние между точками чтобы можно было считать их отрезком. Впрочем если хочется сделать сложнее и запутаннее - я не против, я высказал свое мнение. По мне легче вместо трех точек взять 10 и считать их отрезками, чем приближать к кругу, кстати а почему круг? Чем порабола не угодила или гипербола или может овал надо брать?
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Кстати, ты привел задачу к другой задаче, это не совсем решение -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |