Elipsóide em GraphicsComplex

Sep 23 2020

Estou tentando usar Ellipsoidem um GraphicsComplexe estou preso. Meu entendimento GraphicsComplexé que as atribuições de coordenadas de ponto explícitas são substituídas por valores inteiros apontando para uma lista de coordenadas.

Então, em vez de

 Graphics3D[Sphere[{0, 0, 0}, 1]]

Eu posso usar

 Graphics3D[GraphicsComplex[{{0, 0, 0}}, Sphere[1, 1]]]

em vez de. Observe que o primeiro argumento de Sphereé substituído pelo primeiro ponto da lista, ou seja, {0,0,0}, enquanto o segundo argumento é identificado corretamente como raio (não coordenada) e não substituído por {0,0,0}.

Se eu usar ao Ellipsoidinvés, então ao invés de

Graphics3D[Ellipsoid[{0, 0, 0}, {2, 3, 4}]]

eu uso

Graphics3D[GraphicsComplex[{{0, 0, 0}}, Ellipsoid[1, {2, 3, 4}]]]

Recebo um erro:

Affine transform 1 should be one of the forms {{{xx, yx, zx}, {xy, yy, zy}, {xz, yz, zz}}, {tx, ty, tz}}; {{xx, yx, zx}, {xy, yy, zy}, {xz, yz, zz}}; or {tx, ty, tz}.

e

Coordinate index 0 is out of range for the enclosing GraphicsComplex.

Duas perguntas: uso GraphicsComplexincorretamente? e há uma solução simples para alimentar Ellipsoids para um GraphicsComplex?

Respostas

2 CarlWoll Sep 22 2020 at 23:59

Observe que Ellipsoidé renderizado usando GeometricTransformationsob o capô:

ToBoxes @ Graphics3D[Ellipsoid[{1,1,1}, {2,3,4}]]

Graphics3DBox [InterpretationBox [GeometricTransformation3DBox [SphereBox [{0, 0, 0}], {{{2, 0, 0}, {0, 3, 0}, {0, 0, 4}}, {1, 1, 1 }}], Elipsóide [{1, 1, 1}, {2, 3, 4}]]]

Basicamente, uma esfera na origem é transladada e transformada pelo GeometricTransformation3DBoxpara que se pareça com o desejado Ellipsoid. Agora, observe que o centro do Ellipsoidé parte do argumento da transformação. Infelizmente, GraphicsComplexsó pode lidar com índices de coordenadas quando eles estão dentro de uma primitiva gráfica normal, neste caso, dentro de SphereBox. É por isso que GraphicsComplexde Ellipsoidnão funciona. Considere a GraphicsComplexversão correspondente :

ToBoxes @ Graphics3D[GraphicsComplex[{{1,1,1}}, Ellipsoid[1, {2, 3, 4}]]]

Graphics3DBox [GraphicsComplex3DBox [{{1, 1, 1}}, InterpretationBox [GeometricTransformation3DBox [SphereBox [{0, 0, 0}], {{{2, 0, 0}, {0, 3, 0}, {0, 0, 4}}, 1}], Elipsóide [1, {2, 3, 4}]]]]

Se GraphicsComplex3DBoxpudesse entender que 1dentro GeometricTransformation3DBoxdo ponto representado {1, 1, 1}, ele seria renderizado corretamente. No entanto, é complicado descobrir quais partes dessa lista correspondem a um ponto e, portanto, GraphicsComplex3DBoxdesiste.