Геометрия черепахи в 3D

Я занимаюсь небольшим проектом, в рамках которого пытаюсь воссоздать образовательный язык программирования Logo .

Для тех, кто этого не знает, Logo состоит из «черепахи», которая стартует с (x, y)места (0, 0), а затем может двигаться вперед и назад, чтобы рисовать линии. Кроме того, черепаха может бесконечно поворачиваться вправо или влево (например, угол «заворачивается» на 360 градусов обратно к нулю при повороте по часовой стрелке и имеет то же свойство в направлении против часовой стрелки).

Затем учащиеся могут использовать такие команды, как FDпереместить черепаху вперед или RTповернуться вправо. Так, например, программа FD 10 RT 90 FD 10 RT 90 FD 10 RT 90 FD 10 RT 90нарисует квадрат со стороной 10 единиц длины.

У моей черепахи есть свойства и x, и когда я указываю расстояние, которое нужно пройти, я могу легко вычислить новые значения и со следующим:yangledxy

old_x = x

old_y = y

r = angle * (pi / 180)# преобразовать угол (в градусах) в радианы

new_x = old_x + (d * cos(r))

new_y = old_y + (d * sin(r))

Затем я рисую линию от (old_x, old_y)до (new_x, new_y). Все идет нормально. Я могу идеально двигать черепаху в двух измерениях.

Но то, что я хотел бы сделать сейчас, это добавить UTи DTкоманды в мою программу, чтобы можно было двигать нос черепахи вверх и вниз, чтобы теперь мы могли рисовать трехмерные фигуры. Например, программа FD 10 UT 90 FD 10 UT 90 FD 10 UT 90 FD 10 UT 90все равно нарисовала бы квадрат, только теперь он стоял бы вертикально.

Я знаю, что моя графическая библиотека (OpenGL) поддерживает рисование линий в 3D, на самом деле это то, что я уже делаю, только я zвсе время сохраняю нулевой размер, и, очевидно, мне нужно будет отслеживать вторую переменную угла для вверх и вниз, но я совершенно не представляю, как вычислить новые xи значения с учетом двух углов.yz

Кто-нибудь может помочь? Многие ТИА.

Ответы (3)

Углы быстро становятся сложными в более высоких измерениях, но есть довольно хороший способ обойти это.

Начнем с примера в 2D. Вот формула движения, которую вы дали:

Икс "=" Икс + г потому что р у "=" у + г грех р
где ( Икс , у ) точка, в которой сейчас находится черепаха, и ( Икс , у ) точка, куда собирается черепаха. (Простые числа — это просто часть имени — производных нет.) Мы можем записать это в векторной записи:
[ Икс у ] "=" [ Икс у ] + г [ потому что р грех р ] .
Вектор ( потому что р , грех р ) является единичным вектором, и на самом деле каждый единичный вектор может быть записан в этой форме (во многих языках программирования функция для этого известна как atan2). Таким образом, мы можем полностью забыть об угле и просто предположить, что у нас есть вектор направления ты это единичный вектор, и формула обновления становится
Икс "=" Икс + г ты .
Для реализации RT и LT оказывается, что вместо того, чтобы конвертировать ты обратно к углу и добавив к нему угол, мы можем повернуть сам вектор. То есть, предположим, мы хотим повернуть LT на θ радианы, формула обновления для заголовка
ты "=" [ потому что θ грех θ грех θ потому что θ ] ты .
Мы могли бы рассмотреть и другую часть данных, но ее можно получить непосредственно из ты , и это единичный вектор в девяносто градусов против часовой стрелки от ты . Векторы ты и в образуют систему координат с точки зрения черепахи.

система координат черепахи

и вы можете вывести формулу обновления курса, выяснив, каким будет новый заголовок внутри этой системы координат черепахи, и преобразовав его обратно в стандартные координаты.

Переходя к 3D, мы можем напрямую использовать эти идеи. Вместо этого ты , в система координат черепахи, у нас есть ты , в , ж система координат черепахи из трех единичных векторов, где ты это голова черепахи, в находится прямо слева от черепахи (так что, если бы черепаха была самолетом, она указывала бы в направлении вниз по левому крылу), и ж указывает прямо вверх с точки зрения черепахи.

3d координатная рамка черепахи

The ж является перекрестным произведением двух других, поэтому хранить его не обязательно, но и не повредит.

Учитывая любое трехмерное вращение, записанное как 3 × 3 матрица р , формула обновления для системы координат:

[ ты в ш ] "=" р [ ты в ш ]
где мы представляем системы координат как 3 × 3 сами матрицы. Формула обновления позиции по-прежнему Икс "=" Икс + г ты .

Вот вам две матрицы. Первый для LT от θ радианы (также известные как рыскание):

[ ты в ш ] "=" [ потому что θ грех θ 0 грех θ потому что θ 0 0 0 1 ] [ ты в ш ]
А второй для УТ по θ радианы (иначе шаг):
[ ты в ш ] "=" [ потому что θ 0 грех θ 0 1 0 грех θ 0 потому что θ ] [ ты в ш ]
Вы также можете подумать о том, чтобы иметь команды, заставляющие черепаху вращаться вокруг своей головы.

Подводя итог, можно сказать, что «правильное» понятие угла в 3D — это 3 × 3 матрица, столбцы которой представляют собой ортогональные единичные векторы, а определитель которой равен 1 (другая возможность 1 , но если это будет 1 это то, что заставляет векторы образовывать систему координат, удовлетворяющую правилу правой руки). Это также известно как элемент специальной ортогональной группы С О ( 3 ) , если вы хотите посмотреть его.

Другие могут предложить использовать кватернионы, но оба подхода эквивалентны. Кватернионы в основном просто позволяют вам написать это 3 × 3 матрица, использующая только четыре числа, а не девять.


В другом ответе Potato предлагает использовать углы Эйлера, но если вы хотите, чтобы все команды выполняли повороты с точки зрения черепахи, это неверно. Его RT и LT всегда будут относительно горизонтальной плоскости.

В моей книге

Эдгар, Джеральд А. , Мера, топология и фрактальная геометрия, Тексты для бакалавров по математике. Нью-Йорк и др.: Springer-Verlag. ix, 230 стр. 58 немецких марок за час (1990 г.). ЗБЛ0727.28003 .

в главе 7 «Дополнительные темы» я предлагаю трехмерную геометрию черепахи. (Это только в первом издании книги. Во втором издании я включил различные дополнительные темы.) В дополнение к обычным поворотам (рыскание) и предлагаемым вами поворотам (тангаж) есть еще и кувырок. Вот с. 196:
страница 196

Внизу код трехмерного дракона...

Вы должны следить за ориентацией носа черепахи в 3 Д используя два угла ф (горизонтальный) и θ (угол возвышения от горизонтали)

Единичное направление движения черепахи вперед равно

Н "=" [ потому что θ потому что ф потому что θ грех ф грех θ ]

Предположим, вы начинаете с черепахи в Икс у самолет с носом, направленным в плюс Икс направление оси, затем начальная ф "=" 0 и начало θ "=" 0

С использованием р Т ф 1 декременты ф к ф 1 и л Т ф 1 приращения ф к ф 1 . Сходным образом, U Т θ 1 приращения θ к θ 1 и Д Т θ 1 декременты θ к θ 1 .

Затем мы движемся вперед, новая позиция

п 2 "=" п 1 + г Н