1 | |
В-сплайновые кривые10.05.2016, 12:59. Просмотров 4038. Ответов 17
Метки нет Все метки)
(
дана формула
где Напишите мне на с++ функцию, которая считает Я над кривой Безье очень долго думал, а тут вообще темный лес. Нужно только эту функцию, я просто не могу понять нижнюю формулу, что есть что
0
|
|
10.05.2016, 12:59 | |
Кривые на С++ Кривые Серпинского
Кривые расчеты |
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
|
10.05.2016, 19:51 | 2 |
Это вся имеющаяся информация?
Откуда формулы взяты? Замечания: В предпоследней формуле второе условие выполняется всегда. Зачем тогда первое условие? И верно ли оно (как выглядит в общем случае)? На сколько частей разбит интервал изменения параметра t? Как N зависит от k в предпоследней формуле? Что такое
0
|
10.05.2016, 19:58 [ТС] | 3 |
gunslinger, формулы взял из лекций мгту https://www.google.ru/url?sa=t... 1273,d.bGg
P_k я так понимаю, что опорные точки ломаной
0
|
gunslinger
|
10.05.2016, 20:06
#4
|
Не по теме: Гляну на досуге. Но обещать результат пока не буду.
0
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
||||||
12.05.2016, 02:00 | 5 | |||||
![]() Решение
Выкладываю, что получилось, а получилось не очень.
Насколько понимаю, нужно еще выбирать значения узлов t (тут внимательней надо теорию просматривать). В любом случае, может часть кода тебе пригодится, а я на данный момент пас.
2
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
||||||
14.05.2016, 14:11 | 6 | |||||
Подправил немного (но до "истины" еще далеко):
если же уменьшать st, то Я почти что уверен, что проблема по крайней мере в выборе точек Возможно, они должны быть не равномерно распределены в диапазоне от
1
|
14.05.2016, 14:13 [ТС] | 7 | |||||
gunslinger,
В первоначальном виде все работает нормално, но стоило мне просто добавить свой ввод, как програма стала вылетать с ошибкой деления на ноль. Из-за чего это может быть?
0
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
|
14.05.2016, 14:21 | 8 |
В документе (стр. 4, внизу) написано по этому поводу - если знаменатель равняется 0, то нужно считать выражение (дробь), содержащее этот знаменатель, равным нулю.
Смотри функцию N(). P.S.: в твоем коде строке №53 не обязательна, я использовал ее для теста. Можно убрать либо заменить 10 на 0. Лучше первый вариант.
0
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
|
14.05.2016, 14:34 | 10 |
И step у меня изначально считался неправильно.
P.S.: значит, ты что-то поменял, что влияет. Нужно смотреть. Добавлено через 6 минут Я сейчас глянуть не могу, только если позже.
0
|
14.05.2016, 19:05 [ТС] | 11 | ||||||||||
gunslinger, нет проблем. Если сам разберусь, то отпишусь
Добавлено через 3 часа 30 минут Понятия не имею что я изменил, но программа перестала ругаться на деление на ноль и стала рисовать, однако программа стала капризничать и не выполнять некоторые команды. Например не хочет менять цвет и толщину линии, несмотря на то, что я эти команды поместил в тело основной функции. Во время отрисовки сплайна все настройки сбрасывается и рисуется черная линия толщиной 1. И рисовать начинает из левого верхнего угла (1,1).
Добавлено через 47 минут Вот на шарпе готовая программа, но тут много лишнего
Добавлено через 6 минут
0
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
||||||
15.05.2016, 03:41 | 12 | |||||
![]() Решение
Нашел хорошее описание алгоритма (коротко и ясно): http://mathworld.wolfram.com/B-Spline.html
Код на его основе:
Замечание: при некоторых значениях параметра p (обычно когда он > 2), сплайн проходит через левый верхний угол. Причину пока выяснить не удалось. Формулу (p = m - n - 1) менять не стоит, можешь изменять count и/или m, а также точки t. Но учти, что они (точки) должны быть неубывающей последовательностью.
2
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
||||||
16.05.2016, 05:50 | 13 | |||||
![]() Решение
Выяснил причину. Нужно было соответствующим образом выбирать узловые точки
Теперь можно строить сплайны вплоть до степени p = 4. Хотя третьей степени вроде достаточно. Можешь поэкспериментировать. ехе для случая p = 3 во вложении.
1
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
|||||||||||||||||||||
16.05.2016, 18:01 | 15 | ||||||||||||||||||||
m никак не зависит от count.
m+1 - количество узловых точек. count - количество контрольных точек. n = count - 1, p = m - count. Функция init() дублирует точки для правильного построения сплайна. Можно условие
Тогда строка
0
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
|
16.05.2016, 18:18 | 16 |
Что касается твоего утверждения, то ты не до конца понял - просто должно выполняться условие
m <= count*2-1 (или m < count*2). Плюс m > count (или m >= count+1). Либо двойное условие для p постом выше (p < 5 && p > 0). Повторю еще раз, зависимости между m и count в любом случае никакой нет.
0
|
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
|
16.05.2016, 21:57 | 17 |
Сделал на основе вышеприведенного кода программу-заставку.
Для больных эпилепсией просьба использовать на свой страх и риск, так как смена фона может быть достаточно резкой, хоть и происходит не с большой частотой.
0
|
Тематические курсы и обучение профессиям онлайн Профессия Разработчик на C++ (Skillbox) Архитектор ПО (Skillbox) Профессия Тестировщик (Skillbox) |
случайный прохожий
1502 / 999 / 372
Регистрация: 20.07.2013
Сообщений: 2,894
|
|
16.05.2016, 22:20 | 18 |
Немного подправил смену цвета.
0
|
16.05.2016, 22:20 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Кривые Безье Эллиптические кривые Эллиптические кривые полиномиальные кривые Кривые Безье кривые зеркала Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |