анимационный 3D-сюжет с некоторыми дополнительными требованиями в математике - PullRequest
3 голосов
/ 04 марта 2011

Я писал в это сообщение раньше, но все еще не мог полностью решить следующую проблему.В качестве примера:

{pA, pB, pC, pD} = {{0, 0, Sqrt[61/3]}, {Sqrt[7], 4*Sqrt[2/3], 0}, {0, -5*Sqrt[2/3], 0}, {-Sqrt[71], 4*Sqrt[2/3], 0}};
axis={1,0,0};pt={0,1,0};
plotPolygon[{a_, b_, c_}] := {Opacity[.4], Polygon[{a, b, c}]};
graph=Graphics3D[{plotPolygon[{pA, pB, pC}], plotPolygon[{pA, pB, pD}], 
            plotPolygon[{pB, pC, pD}], plotPolygon[{pA, pC, pD}]}, 
            Axes -> True, AxesOrigin->pt];
Animate[graph/.gg : Graphics3D[___] :> Rotate[gg, theta, axis], {theta, 0., 2.*Pi}]

enter image description here

Я хочу вращаться вдоль оси axis={1,0,0}, которая проходит точку pt={0,1,0}.Но я не знаю, как указать информацию о точке.Также анимация вращения кажется очень хаотичной в том смысле, что я ожидаю, что хотя бы одна точка (в данном случае, начало координат?) Не вращается.

1 Ответ

4 голосов
/ 05 марта 2011

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

(RotationMatrix[theta,axis].(#-pt) + pt)& /@ {pA, pB, pC, pD}

. Или вы можете объединить преобразования, используя Композиция

Composition[
 AffineTransform[{RotationMatrix[theta,axis],pt}],TranslationTransform[-pt]
] /@ {pA, pB, pC, pD}

. Или вы можете взять предыдущую композицию и применить ее.непосредственно к вашему Graphics объекту

GeometricTransformation[ <graphics>, Composition[ ... ]]

Эта документация дает полный список того, что можно сделать.

Редактировать : Вотрабочий анимационный скрипт

Animate[
  graph /. Graphics3D[prims__, opts : OptionsPattern[]] :> 
    Graphics3D[
      GeometricTransformation[prims,
        Composition[
          AffineTransform[{RotationMatrix[theta, axis], pt}],
          TranslationTransform[-pt]
        ]
      ],
      opts
    ], 
  {theta, 0., 2.*Pi}
]

Здесь есть пара вещей, на которые стоит обратить внимание.Во-первых, GeometricTransformation, похоже, работает только на самих примитивах, поэтому мне пришлось отделить примитивы от опций в Graphics3D с помощью правила Graphics3D[prims__, opts : OptionsPattern[]].Кроме того, само преобразование должно быть в пределах Animate, чтобы использовать локальную версию theta.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...