Elipsóide em GraphicsComplex
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
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.