![]() |
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]() ![]() ![]() |
|
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Как создать дугу определенной длины, ширины и радиуса в виде фрагмента тора. Только тор задается внешним и внутренним радиусом, а мне необходимо задавать Н - высоту, L- длину, R - радиус. Вся загвоздка что нужен именно кусочек тора.
Подскажите кто может ![]() |
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
Уточни, ты хочешь получить поверхность в виде апроксимированной с некоторым шагом сетки или в виде кривых?
|
|||
|
||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
В виде кривых
|
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
Сорри, но по памяти NURBS не помню.
![]() |
|||
|
||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Ну, а вторым способом?
|
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
А во втором способе все достаточно просто. Рассматриваешь тор как вращающийся отрезок, который одним концом крепится к радиусу самого тора. Малуый радиус вращается в плоскости, перпендикулярной плоскости большой окружности. Пишешь функцию, которая по запрошенным двум углам возвращает координаты точки в пространстве.
С некоторым шагом перебираешь все значения углов от 0 до 360 градусов. Чем меньше шаг, тем выше детализация, но больше вершин. Тор в виде прямоугольников смотрится вполне достойно. ![]() |
|||
|
||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Чей-то я не понял ничего... Ну а если упростить задачу и свести к 2х мерному изображению? Изобразить фрагмент кольца с заданой шириной H = R-r, длиной L, и радиусом изгиба R? Знаешь как сделать?
|
|||
|
||||
DENNN |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
decembrist, если свести к двумерному, то это просто два круга получатся
![]() Смотри, можно для простоты считать, что у тебя тор ориентирован параллельно некоторой плоскости. Допустим радиус тора = R1 В плоскости тора радиус вращается на все 360 градусов. Пусть геометрический центр тора лежит в начале координат OXYZ, причем плоскость XY делит его пополам "вдоль" (извини, но без бумажки много лишних слов получается). Пусть ось X совпадает с направлением радиуса, при котором его угол равен 0. Иными словами, будем отсчитывать угол от оси X в плоскости XY. Ось Z при этом направлена от нас. Тогда, для любого угла A, координаты такого радиус-вектора будут равны X=R1*cos(A) Y=R1*sin(A) Z=0 Давай во избежании путаницы обозначать их здесь R1x, R1y, R1z соответсвенно. Твой бублик получается, если на конце твоего движущегося радиуса R1 поместить окружность с радиусом R2 в плоскости, перпендикулярной плоскости XY и ориентированной в каждый момент времени таким образом, что R1 всегда лежит в этой плоскости. Тогда, если нулевой угол R2 отсчитывать от R1 по направлению к центру, то координаты точки поверхности тора для угла B отклонения R2 будут равны: сначала найдем длину проекции R2 на R1 Rp=R2*cos(B) теперь можно найти координаты вектора с длиной (R1-Rp) X=(R1-Rp)*cos(A) Y=(R1-Rp)*sin(A) Если обратить внимание, что при B=0 вектор R2 совпадает с плоскостью XY (т.е. его Z-координата равна 0), то Z=R2*sin(B) Для упрощения программы, составим подпрограмму для расчета координат любой точки поверхности тора:
Теперь ты можешь постоить поверхность тора в виде сетки апроксимируя его с некторым шагом, к примеру 5 градусов.
Вот, примерно так. Написано все с клавиатуры, код не проверял, могут быть мелкие ошибки - если найдешь, то сообщи, я подправлю. Здесь для простоты поверхность передается в виде точек. Если хочешь в виде квадратов, то тогда надо искать не одну, а 4 точки, отнимая или добавляя к соответствующим углам значение (STEP/2). Удачи. Добавлено @ 16:13 P.S. Блин, модераторы. Исправте вы этот дебильны серый цвет на константах - на таком фоне читать код тяжело. Это сообщение отредактировал(а) DENNN - 25.11.2004, 16:11 |
||||
|
|||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Гениально и просто! Спасибо огромное!
![]() Просто у меня возникла проблема такая: есть стандартный способ нарисовать фрагмент тора используя функцию gluNewQuadric(), а затем
например так. Но я работаю на платформе VS .NET 2003, а в ней не поддерживается почему-то эта фунция. Вот я и парился, как мне изобразить В любом случае, я очень благодарен за помощь |
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
Ты скажи. Ты код проверил? Если там какие-то глюки, то я подправлю для других
![]() Добавлено @ 16:16
Мой тебе личный совет: не увлекайся построениями через глют - это путь в никуда. Сложные модели тебе придется в программу подгружать, нестандартные поверхности генерить самому. gluQuadric..... в любом из жизненных решений обычно оказывается не нужен. |
|||
|
||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Глюков не обнаружил.
![]() |
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
decembrist
Тогды картинку запость - другим посмотреть что получилось ![]() |
|||
|
||||
decembrist |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Не знаю как это делается ![]() Добавлено @ 11:36
Не знаю как это делается ![]() |
||||
|
|||||
![]() ![]() ![]() |
Вы можете найти полезным что... | |
|
|
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |