|
|
||||||||||||||||
Кривая Безье07.05.2016, 17:10. Показов 21437. Ответов 20
Метки нет (Все метки)
Вооружился статейкой на википедии https://ru.wikipedia.org/wiki/... 1%8C%D0%B5 и использовал формулу, описаную там, в своей программе, и нифига не работает.
Вот функция факториала
0
|
||||||||||||||||
| 07.05.2016, 17:10 | |
|
Ответы с готовыми решениями:
20
Кривая Безье Кривая Безье по 4 точкам
|
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 07.05.2016, 17:34 | |
|
Так не подскажешь; здесь не все ясновидящие. Попробуйте значения x и y сохранять ещё и в StringList и по окончании цикла сохраните его в файл. Станет понятно, какие там величины фигурируют.
0
|
|
|
place status here
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
|
|
| 07.05.2016, 17:47 | |
|
1
|
|
|
|
||||||
| 08.05.2016, 12:14 [ТС] | ||||||
|
nick42, да величины должны быть нормальные, так как я пробовал в лоб по полиному для 4-х точек и там все нормально рисуется. А вот с этой универсальной формулой с факториалами ничего не получается. К тому же все значения можно в отладчике посмотреть. Тут главный вопрос в том, что правильно ли я понял алгоритм
Добавлено через 3 минуты gunslinger, как ни странно, я не находил этих тем, несмотря на то, что даже в гугле вбивал запрос Добавлено через 17 часов 15 минут Не хотите вы думать. Попрыгал с бубном около часа и наконец выстроил такую последовательность команд, которая нужна. Ошибки были в главной функции, вот рабочая:
0
|
||||||
|
place status here
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
|
||||||
| 08.05.2016, 23:09 | ||||||
|
Можно так сделать (немного переделал):
2
|
||||||
|
place status here
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
|
||||||
| 09.05.2016, 21:54 | ||||||
Сообщение было отмечено BRcr как решение
Решение
Дополнительная "визуализация":
2
|
||||||
|
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
|
|
| 16.05.2017, 17:12 | |
|
Повторил ваш код. Всё прекрасно получилось. Спасибо.
Однако кривая Безье, если внимательно присмотреться, получается не ровной, создаётся эффект "смазанности", хотя в Автокаде, например, такое не наблюдается. У вас, если присмотреться, то же самое. Как можно это исправить?
0
|
|
|
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
|
|
| 16.05.2017, 18:39 | |
|
Решение проблемы найдено.
Пришлось немного изменить функцию TPoint bezier(UINT n, double t). Выполнял на Лазарусе, поэтому, если кому интересно, можете посмотреть код здесь: Как при построении кривой Безье уменьшить разброс точек?
1
|
|
|
place status here
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
|
|
| 16.05.2017, 19:05 | |
|
Насколько помню, проблему решить не особо удалось.
Пробовал уменьшать шаг step, рисовать не линиями, а точками. Хотя, если увеличить рисунок, вроде немного плавнее получается. Вот пример общего случая (для которого кривые Безье являются частным случаем): В-сплайновые кривые Может нужен другой подход при рисовании (для лучшего сглаживания), хотя математически в самом построении кривых вроде все верно.
0
|
|
|
place status here
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
|
|
| 16.05.2017, 19:46 | |
|
Долго я сообщение писал... Спасибо за решение.
Добавлено через 26 минут В принципе можно обойтись без итогового округления.
0
|
|
|
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
|
|
| 16.05.2017, 19:57 | |
|
А есть ли какой-нибудь математический аппарат, позволяющий разбить кривую Безье (или элипс) на кокие-то элементарные фигуры (линии, дуги и пр.)? Суть такая: надо взять Автокадовский DXF-файл и при помощи его управлять положением режущего инструмента станка, при этом как можно ближе к истине отображать на экране положение инструмента. Если отправить сразу координаты узловых точек той же линии Безье, то теряется возможность отслеживать положение инструмента, если отправлять из цикла for(double t = step; t <= 1; t += step)... и одновременно отрисовывать на экране, то слабым местом будет пропускная способность линии связи.
С окружностью и прямыми всё просто: разбивается фигура на отдельные дуги или линии (от 5 до 20 мм), приращения которых передеются в исполнительное устройство. А вот с кривой Безье не всё так просто...
0
|
|
|
place status here
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
|
|
| 16.05.2017, 22:16 | |
|
Если я правильно понимаю, что требуется, то при (для) предварительной примерной оценки положения инструмента можно увеличить шаг step, и, если все устраивает, вернуть исходное значение шага и отрисовывать в "обычном" режиме.
0
|
|
|
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
|
|
| 16.05.2017, 22:58 | |
|
По идее всё почти так, но не совсем. Шаговые двигатели работают на скорости 20 000 микрошагов в секунду. Интерфейс связи со скоростью 19200 бит/сек. Поэтому, чтобы не останавливались двигатели (это создаст вибрацию) приходится использовать буфер упреждения, глубиной в несколько перемещений. Т.е. из буфера считываются координаты очередного перемещения, двигатели его отрабатывают, компьютер получает уведомление, отрисовывает на экране и отправляет очередные координаты в буфер. Каждая новая точка должна отличаться от предыдущей хотя бы на расстояние, на которое способны переместить двигатели режущий инструмент за время сеанса связи. Вот отсюда, собственно, и вопрос.
Нашёл учебник: Роджерс "Математические основы машинной графики" 2001 г, раздел 5-12 "Разбиение В-сплайнов", но, вероятно, поспешил, т.к. в DXF-файле очень интересная кодировка сплайнов (SPLINE). Нарисовал в AutoCAD-е, Вложение 833391 а у себя получил Вложение 833392 (имею ввиду не симметрию по Y, это из-за разных точек начала отсчёта, а несоответствие формы).
0
|
|
|
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
|
|
| 16.05.2017, 23:01 | |
|
0
|
|
|
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
|
|
| 16.05.2017, 23:51 | |
|
Нашёл интересную статью на тему кривых Безье: Кривые Безье для ваших игр.rar
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 16.05.2017, 23:52 | ||
|
1
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 16.05.2017, 23:55 | |
|
в этом случае вместо дуг передавать линии линии
0
|
|
|
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
|
||
| 17.05.2017, 00:52 | ||
|
Спасибо. Очень понравилась ваша идея.
В последней задаче у меня были прямые и окружности. Их я разбивал на отрезки, координаты очередной точки, куда должен "приехать" рабочий инструмент (а в случае дуги - центр и угол сектора) передавал в станок. В станке использовал ARM-контроллер, который преобразовывал координаты в шаги методом Брезенхема (в случае наклонных и дуг), ну и по мере ответов станка отрисовывал их на экране. Не по теме. Лет 10 назад увидил рекламу "буржуйского станка": кладут на станину приклад от охотничьего ружъя. Он его просканировал. Затем кладут заготовку, из которой он повторил копию. Вот, в принципе, в чём вся идея. Просканировать, правда, пока ещё не могу, поэтому первоначально использовал CorelDraw и PLT-формат, теперь хочу освоить DXF, а затем, если получится, то и сканирование. Сложности, правда, не в программировании и электронике, а в "доставании железяк" для станка. Добавлено через 18 минут
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 17.05.2017, 01:53 | ||
|
Кое-что в тему - http://dxdy.ru/topic8371.html По аппроксимации (для случая когда "для кучи точек выбираем максимально близко через них проходящую окружность") - http://prografix.narod.ru/rus_cirap.html, можно например для контроля точности разбиения применить. И то, что разбиение с автоматически подбирающимся шагом до нас уже делали - http://www.caduser.ru/forum/in... &TID=29238 Добавлено через 9 минут Да, и в точке "носа" будет меняться направления обхода окружности (с "по часовой" на "против часовой"). Уже и подзабыл, как это в G-кодах...
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 17.05.2017, 03:25 | |
|
Подумал-подумал, и нашёл ошибку. В общем случае через такие 2 пары точек можно построить только дугу + прямую. Зато считать, наверно, проще - радиус берётся как расстояние от пересечения касательных до ближайшей точки, помноженное на котангенс половины угла между касательными.
0
|
|
| 17.05.2017, 03:25 | |
|
Помогаю со студенческими работами здесь
20
кривой Безье Кривая в C++ Builder Кривая Эрмита Кривая сортировка пузырьком StringGrid
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|