![]() |
|
|
![]()
|
|
| Proger10 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Цель такая - построить спираль. Но не просто построить, а равномерным шагом и равным расстоянием между витками.
Обычно спираль ведь строится по радианам, т.о. получается на ближних витках спирали расстояние от точки до точки меньше, чем далее от центра. А вот как сделать так, чтобы спираль строилась равномерными отрезками? Алгоритм такой: 1. Знаем длину дуги (наш равномерный отрезок), получаем угол: alpha = ( L * 180 ) / ( PI * R ); // угол в градусах, L - длина дуги Терь мы знаем на каждой точке нужный угол в градусах. 2. Переводим в радианы 3. Строим в полярных координатах. 4. Смотрим результат - спираль получается не с равными расстояниями между витками, но зато она строится ровным шагом. Это уже пол победы. Но как сделать так, чтобы и расстояние между витками было всегда равное? Смотрите, что сейчас получается: http://s50.radikal.ru/i129/0906/51/08c18a30c2a3.png при вот таких параметрах: R += 0.0001; // картинка слева R += 0.001; // картинка справа (на скриншоте) Есть идеи? Вот код на OpenGL:
Это сообщение отредактировал(а) Proger10 - 19.6.2009, 23:25 |
|||
|
||||
| DRUID3 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 20.6.2005 Где: Kyyiv Репутация: 2 Всего: 9 |
Спираль можно представавить как материальную точку прямолинейно(и с постоянной скоростью, для Вашего случая) движущуюся на плоскости которая вращается. Это сообщение отредактировал(а) DRUID3 - 20.6.2009, 04:45 -------------------- Every time if you use Linux, you are joined to the communism... практика - критерий истины ... отделенной от нас пропастью субъективного восприятия... |
|||
|
||||
| Proger10 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Не понял.. что значит с постоянной скоростью? С постоянным радиусом? Тогда получится окружность..
Проблема в том, что я не знаю в какой именно момент нужно увеличивать радиус-расстояние R.. |
|||
|
||||
| DRUID3 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 20.6.2005 Где: Kyyiv Репутация: 2 Всего: 9 |
Вы еще школьник? -------------------- Every time if you use Linux, you are joined to the communism... практика - критерий истины ... отделенной от нас пропастью субъективного восприятия... |
|||
|
||||
| Proger10 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
К сожалению, нет
Ну так подсказать можете? |
|||
|
||||
| DRUID3 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 20.6.2005 Где: Kyyiv Репутация: 2 Всего: 9 |
Вообще-то подсказал. И радиус там не постоянен(неужели скорость, по-вашему, равна абсолютной длинне радиус-вектора?
-------------------- Every time if you use Linux, you are joined to the communism... практика - критерий истины ... отделенной от нас пропастью субъективного восприятия... |
|||
|
||||
| AVA12 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 1 Всего: 4 |
Proger10, попробуй вместо 0.001 прибавлять 1/1024 и посмотри, что получится.
|
|||
|
||||
| Proger10 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
В этом у меня проблема - в том, что он постоянно растёт. А мне этого не нужно, т.к. я хочу получить равные расстояния между двумя витками.. т.е. чтобы в спирали все витки были бы параллельными друг другу. AVA12, а что должно-то произойти? Какая разница какую именно константу приращивать? Вообще с: R += 1 / 1024; у меня получилась окружность Это свойство как-то можно заюзать для решения такой задачи? А принудительно заменив на: R += 0.0009765625; я получил тоже, что и на картинках у меня в первом посте.. |
|||
|
||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 5 Всего: 54 |
Результат деления целых — целое, с округлением к нулю. R += 1.0 / 1024; Как нарисовать сходящуюся спираль в OpenGL Архимедова спираль |
|||
|
||||
| Proger10 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Вы про вот эту формулу? http://upload.wikimedia.org/math/1/3/3/133...d92329d92fc.png А что здесь phi? Угол ведь..? Как он вычисляется? А если не вычисляется, а задаётся - тогда совершенно не ясно, что означает шаг спирали Покуда, если мы задаём фиксированно угол - тогда шаг (длина очередной прирощенной дуги) будет постоянно увеличиваться с ростом угла phi.. Добавлено через 9 минут и 20 секунд Вот здесь какая-то ошибка:
Первая строчка рисует расходящуюся спираль, но одинаковым шагом. Вторая сточка рисует сходящуюся (с одинаковыми расстояниями между спиралями), но с разным шагом.. Как же учесть оба условия? |
||||
|
|||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 5 Всего: 54 |
||||
|
||||
| Proger10 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Похоже внутри цикла радиус нужно инкрементировать не на постоянную величину, а на какую-то переменную.. вот только на какую..
Добавлено через 8 минут и 8 секунд
Глянул мельком.. а разве это то? Мне нужно не просто ровную спираль, но и чтобы она одинаковым шагом шла. Т.е. угол нужно постоянно перевычислять... Да и не только угол, но и радиус.. Добавлено через 9 минут и 44 секунды Обычные спирали, с равными расстояниями между витками - рисуются просто. Но у них по ходу построения точки изначально скачут медленно, а потом так ускоряются, что мало не кажется |
|||
|
||||
| Proger10 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Пробовал вот так:
R += ( L / ( 2 * M_PI ) ) * i2; Но витки расходятся ещё быстрее.. |
|||
|
||||
| Proger10 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
В общем, у меня получилось.
Формула такая: R = ( L / ( 2 * M_PI ) ) * i * 5 + ( i2 * ( L / 4.4 ) ); 4.4 - не понял как у меня получилось. Подобрал перебирая числа и сравнивая результат. 5 - ширина между витками. Теперь соблюдены два условия: - одинаковый шаг дуги: L - одинаковая ширина между витками Кто-нибудь прокомментирует? |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Вы прочитали в Википедии статью "Спираль"? Спиралей существует несколько видов и у каждой существует своя формула в полярных координатах.
Ваша спираль называется "архимедова", её формула такая r = k * fi где k -- сдвиг на 1 радиан. Если хотите указывать сдвиг на один оборот, то формула такая r = a * fi / (2 * pi) Разница несущественна. Везде fi -- это полярный угол. В радианах. Про градусы вообще забудьте. Полярные координаты -- это нормальные координаты, в них нет ничего страшного. Там тоже существуют графики функций, которые строятся так же: пробегается независимая переменная и для каждого её значения вычисляется зависимая. Единственная проблема в том, что функции рисования обычно работают в декартовых координатах. Поэтому после вычисления и перед рисованием надо просто осуществить перевод.
Это сообщение отредактировал(а) Dims - 24.7.2009, 14:51 |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |