Elipsoida w GraphicsComplex
Próbuję użyć Ellipsoidw a GraphicsComplexi utknąłem. Rozumiem, GraphicsComplexże jawne przypisania współrzędnych punktów są zastępowane wartościami całkowitymi wskazującymi zamiast tego listę współrzędnych.
Więc zamiast
Graphics3D[Sphere[{0, 0, 0}, 1]]
mogę użyć
Graphics3D[GraphicsComplex[{{0, 0, 0}}, Sphere[1, 1]]]
zamiast. Zauważ, że pierwszy argument Spherejest zastępowany pierwszym punktem z listy, tj. {0,0,0}, podczas gdy drugi argument jest poprawnie zidentyfikowany jako promień (nie współrzędna) i nie jest zastępowany przez {0,0,0}.
Jeśli Ellipsoidzamiast tego użyję, to zamiast
Graphics3D[Ellipsoid[{0, 0, 0}, {2, 3, 4}]]
używam
Graphics3D[GraphicsComplex[{{0, 0, 0}}, Ellipsoid[1, {2, 3, 4}]]]
Pojawia się błąd:
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}.
i
Coordinate index 0 is out of range for the enclosing GraphicsComplex.
Dwa pytania: czy używam GraphicsComplexniewłaściwie? i czy istnieje proste obejście, aby przesłać Ellipsoids do pliku GraphicsComplex?
Odpowiedzi
Zwróć uwagę, że Ellipsoidjest renderowany przez użycie GeometricTransformationpod maską:
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 }}], Elipsoida [{1, 1, 1}, {2, 3, 4}]]]
Zasadniczo kula na początku jest tłumaczona i przekształcana przez GeometricTransformation3DBoxtak, że wygląda jak pożądana Ellipsoid. Teraz zauważ, że środek Ellipsoidargumentu transformacji jest częścią argumentu transformacji. Niestety, GraphicsComplexindeksy współrzędnych mogą obsługiwać tylko wtedy, gdy znajdują się one wewnątrz normalnego prymitywu graficznego, w tym przypadku wewnątrz SphereBox. To dlatego GraphicsComplexz Ellipsoidnie działa. Rozważ odpowiednią GraphicsComplexwersję:
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}], Elipsoida [1, {2, 3, 4}]]]]
Gdyby GraphicsComplex3DBoxmógł zrozumieć, że 1wnętrze GeometricTransformation3DBoxreprezentuje punkt, {1, 1, 1}wtedy renderowałoby się prawidłowo. Jednak trudno jest ustalić, które części takiej listy odpowiadają punktowi, więc GraphicsComplex3DBoxpoddaje się.