toxiclibs 0.2-java → 0.5.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +16 -0
- data/CHANGELOG.md +4 -0
- data/LICENSE +675 -0
- data/README.md +12 -5
- data/Rakefile +25 -82
- data/examples/attract_repel/attract_repel.rb +30 -0
- data/examples/attract_repel/attractor.rb +23 -0
- data/examples/attract_repel/particle.rb +27 -0
- data/examples/data/ti_yong.png +0 -0
- data/examples/force_directed/cluster.rb +76 -0
- data/examples/force_directed/force_directed_graph.rb +92 -0
- data/examples/force_directed/node.rb +26 -0
- data/examples/gray_scott_image.rb +75 -0
- data/examples/gray_scott_tone_map.rb +77 -0
- data/examples/implicit.rb +139 -0
- data/examples/inflate_mesh.rb +89 -0
- data/examples/model_align.rb +44 -0
- data/examples/povmesh/ftest.rb +46 -0
- data/examples/povmesh/tentacle.rb +73 -0
- data/examples/simple_cluster/cluster.rb +47 -0
- data/examples/simple_cluster/node.rb +27 -0
- data/examples/simple_cluster/simple_cluster.rb +60 -0
- data/examples/soft_body/blanket.rb +45 -0
- data/examples/soft_body/connection.rb +16 -0
- data/examples/soft_body/particle.rb +22 -0
- data/examples/soft_body/soft_body_square_adapted.rb +55 -0
- data/lib/toxiclibs.jar +0 -0
- data/lib/toxiclibs.rb +91 -32
- data/lib/toxiclibs/version.rb +1 -1
- data/pom.xml +122 -0
- data/src/com/toxi/net/ClientListener.java +41 -0
- data/src/com/toxi/net/ServerListener.java +70 -0
- data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
- data/src/com/toxi/net/ServerState.java +18 -0
- data/src/com/toxi/net/UDPConnection.java +66 -0
- data/src/com/toxi/net/UDPSyncClient.java +81 -0
- data/src/com/toxi/net/UDPSyncServer.java +450 -0
- data/src/com/toxi/nio/UDPClient.java +121 -0
- data/src/com/toxi/nio/UDPClientState.java +32 -0
- data/src/com/toxi/nio/UDPServer.java +129 -0
- data/src/toxi/color/AccessCriteria.java +114 -0
- data/src/toxi/color/AlphaAccessor.java +67 -0
- data/src/toxi/color/CMYKAccessor.java +122 -0
- data/src/toxi/color/CMYKDistanceProxy.java +40 -0
- data/src/toxi/color/ColorGradient.java +260 -0
- data/src/toxi/color/ColorList.java +699 -0
- data/src/toxi/color/ColorRange.java +671 -0
- data/src/toxi/color/ColorTheme.java +163 -0
- data/src/toxi/color/DistanceProxy.java +44 -0
- data/src/toxi/color/HSVAccessor.java +113 -0
- data/src/toxi/color/HSVDistanceProxy.java +40 -0
- data/src/toxi/color/HistEntry.java +85 -0
- data/src/toxi/color/Histogram.java +185 -0
- data/src/toxi/color/Hue.java +249 -0
- data/src/toxi/color/LuminanceAccessor.java +78 -0
- data/src/toxi/color/NamedColor.java +935 -0
- data/src/toxi/color/ProximityComparator.java +70 -0
- data/src/toxi/color/RGBAccessor.java +113 -0
- data/src/toxi/color/RGBDistanceProxy.java +41 -0
- data/src/toxi/color/ReadonlyTColor.java +296 -0
- data/src/toxi/color/TColor.java +1677 -0
- data/src/toxi/color/TColorAdapter.java +68 -0
- data/src/toxi/color/ToneMap.java +218 -0
- data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
- data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
- data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
- data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
- data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
- data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
- data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
- data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
- data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
- data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
- data/src/toxi/data/csv/CSVAdapter.java +74 -0
- data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
- data/src/toxi/data/csv/CSVListener.java +61 -0
- data/src/toxi/data/csv/CSVParser.java +202 -0
- data/src/toxi/data/feeds/AtomAuthor.java +49 -0
- data/src/toxi/data/feeds/AtomContent.java +50 -0
- data/src/toxi/data/feeds/AtomEntry.java +111 -0
- data/src/toxi/data/feeds/AtomFeed.java +129 -0
- data/src/toxi/data/feeds/AtomLink.java +62 -0
- data/src/toxi/data/feeds/RSSChannel.java +88 -0
- data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
- data/src/toxi/data/feeds/RSSFeed.java +99 -0
- data/src/toxi/data/feeds/RSSItem.java +104 -0
- data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
- data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
- data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
- data/src/toxi/geom/AABB.java +658 -0
- data/src/toxi/geom/Axis3D.java +116 -0
- data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
- data/src/toxi/geom/BernsteinPolynomial.java +94 -0
- data/src/toxi/geom/BezierCurve2D.java +159 -0
- data/src/toxi/geom/BezierCurve3D.java +148 -0
- data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
- data/src/toxi/geom/BoxIntersector.java +52 -0
- data/src/toxi/geom/Circle.java +230 -0
- data/src/toxi/geom/CircleIntersector.java +85 -0
- data/src/toxi/geom/Cone.java +150 -0
- data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
- data/src/toxi/geom/CoordinateExtractor.java +16 -0
- data/src/toxi/geom/Ellipse.java +250 -0
- data/src/toxi/geom/GMatrix.java +2599 -0
- data/src/toxi/geom/GVector.java +833 -0
- data/src/toxi/geom/GlobalGridTesselator.java +54 -0
- data/src/toxi/geom/GridTesselator.java +108 -0
- data/src/toxi/geom/Intersector2D.java +49 -0
- data/src/toxi/geom/Intersector3D.java +51 -0
- data/src/toxi/geom/IsectData2D.java +103 -0
- data/src/toxi/geom/IsectData3D.java +103 -0
- data/src/toxi/geom/Line2D.java +534 -0
- data/src/toxi/geom/Line3D.java +471 -0
- data/src/toxi/geom/LineStrip2D.java +430 -0
- data/src/toxi/geom/LineStrip3D.java +230 -0
- data/src/toxi/geom/LocalGridTesselator.java +57 -0
- data/src/toxi/geom/Matrix3d.java +3048 -0
- data/src/toxi/geom/Matrix4f.java +3446 -0
- data/src/toxi/geom/Matrix4x4.java +1076 -0
- data/src/toxi/geom/MatrixSizeException.java +58 -0
- data/src/toxi/geom/OctreeVisitor.java +44 -0
- data/src/toxi/geom/Origin3D.java +148 -0
- data/src/toxi/geom/Plane.java +293 -0
- data/src/toxi/geom/PlaneIntersector.java +57 -0
- data/src/toxi/geom/PointCloud3D.java +253 -0
- data/src/toxi/geom/PointOctree.java +502 -0
- data/src/toxi/geom/PointQuadtree.java +375 -0
- data/src/toxi/geom/Polygon2D.java +1038 -0
- data/src/toxi/geom/PolygonClipper2D.java +45 -0
- data/src/toxi/geom/PolygonTesselator.java +20 -0
- data/src/toxi/geom/QuadtreeVisitor.java +44 -0
- data/src/toxi/geom/Quaternion.java +641 -0
- data/src/toxi/geom/Ray2D.java +146 -0
- data/src/toxi/geom/Ray3D.java +150 -0
- data/src/toxi/geom/Ray3DIntersector.java +75 -0
- data/src/toxi/geom/ReadonlyVec2D.java +575 -0
- data/src/toxi/geom/ReadonlyVec3D.java +628 -0
- data/src/toxi/geom/ReadonlyVec4D.java +431 -0
- data/src/toxi/geom/Rect.java +720 -0
- data/src/toxi/geom/Reflector3D.java +58 -0
- data/src/toxi/geom/Shape2D.java +94 -0
- data/src/toxi/geom/Shape3D.java +42 -0
- data/src/toxi/geom/SingularMatrixException.java +57 -0
- data/src/toxi/geom/SpatialBins.java +182 -0
- data/src/toxi/geom/SpatialIndex.java +61 -0
- data/src/toxi/geom/Sphere.java +224 -0
- data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
- data/src/toxi/geom/Spline2D.java +349 -0
- data/src/toxi/geom/Spline3D.java +351 -0
- data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
- data/src/toxi/geom/Triangle2D.java +422 -0
- data/src/toxi/geom/Triangle3D.java +456 -0
- data/src/toxi/geom/TriangleIntersector.java +105 -0
- data/src/toxi/geom/Vec2D.java +1328 -0
- data/src/toxi/geom/Vec3D.java +1832 -0
- data/src/toxi/geom/Vec4D.java +985 -0
- data/src/toxi/geom/VecMathUtil.java +100 -0
- data/src/toxi/geom/XAxisCylinder.java +64 -0
- data/src/toxi/geom/YAxisCylinder.java +65 -0
- data/src/toxi/geom/ZAxisCylinder.java +64 -0
- data/src/toxi/geom/mesh/BezierPatch.java +200 -0
- data/src/toxi/geom/mesh/BoxSelector.java +62 -0
- data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
- data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
- data/src/toxi/geom/mesh/Face.java +176 -0
- data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
- data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
- data/src/toxi/geom/mesh/Mesh3D.java +224 -0
- data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
- data/src/toxi/geom/mesh/OBJWriter.java +194 -0
- data/src/toxi/geom/mesh/PLYWriter.java +167 -0
- data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
- data/src/toxi/geom/mesh/STLColorModel.java +54 -0
- data/src/toxi/geom/mesh/STLReader.java +185 -0
- data/src/toxi/geom/mesh/STLWriter.java +323 -0
- data/src/toxi/geom/mesh/SphereFunction.java +156 -0
- data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
- data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
- data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
- data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
- data/src/toxi/geom/mesh/Terrain.java +451 -0
- data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
- data/src/toxi/geom/mesh/Vertex.java +78 -0
- data/src/toxi/geom/mesh/VertexSelector.java +193 -0
- data/src/toxi/geom/mesh/WEFace.java +100 -0
- data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
- data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
- data/src/toxi/geom/mesh/WEVertex.java +134 -0
- data/src/toxi/geom/mesh/WingedEdge.java +115 -0
- data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
- data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
- data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
- data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
- data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
- data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
- data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
- data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
- data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
- data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
- data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
- data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
- data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
- data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
- data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
- data/src/toxi/geom/nurbs/ControlNet.java +148 -0
- data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
- data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
- data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
- data/src/toxi/geom/nurbs/KnotVector.java +333 -0
- data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
- data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
- data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
- data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
- data/src/toxi/image/util/Filter8bit.java +331 -0
- data/src/toxi/image/util/TiledFrameExporter.java +162 -0
- data/src/toxi/math/BezierInterpolation.java +102 -0
- data/src/toxi/math/CircularInterpolation.java +88 -0
- data/src/toxi/math/CosineInterpolation.java +51 -0
- data/src/toxi/math/DecimatedInterpolation.java +77 -0
- data/src/toxi/math/ExponentialInterpolation.java +68 -0
- data/src/toxi/math/InterpolateStrategy.java +60 -0
- data/src/toxi/math/Interpolation2D.java +93 -0
- data/src/toxi/math/LinearInterpolation.java +46 -0
- data/src/toxi/math/MathUtils.java +990 -0
- data/src/toxi/math/NonLinearScaleMap.java +101 -0
- data/src/toxi/math/ScaleMap.java +183 -0
- data/src/toxi/math/SigmoidInterpolation.java +78 -0
- data/src/toxi/math/SinCosLUT.java +141 -0
- data/src/toxi/math/ThresholdInterpolation.java +58 -0
- data/src/toxi/math/ZoomLensInterpolation.java +126 -0
- data/src/toxi/math/conversion/UnitTranslator.java +161 -0
- data/src/toxi/math/noise/PerlinNoise.java +281 -0
- data/src/toxi/math/noise/SimplexNoise.java +542 -0
- data/src/toxi/math/waves/AMFMSineWave.java +143 -0
- data/src/toxi/math/waves/AbstractWave.java +248 -0
- data/src/toxi/math/waves/ConstantWave.java +48 -0
- data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
- data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
- data/src/toxi/math/waves/FMSineWave.java +142 -0
- data/src/toxi/math/waves/FMSquareWave.java +143 -0
- data/src/toxi/math/waves/FMTriangleWave.java +126 -0
- data/src/toxi/math/waves/SineWave.java +81 -0
- data/src/toxi/math/waves/Wave2D.java +68 -0
- data/src/toxi/math/waves/WaveState.java +69 -0
- data/src/toxi/music/scale/AbstractScale.java +117 -0
- data/src/toxi/music/scale/GenericScale.java +66 -0
- data/src/toxi/music/scale/MajorScale.java +41 -0
- data/src/toxi/newmesh/AttributedEdge.java +106 -0
- data/src/toxi/newmesh/AttributedFace.java +63 -0
- data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
- data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
- data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
- data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
- data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
- data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
- data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
- data/src/toxi/newmesh/SpatialIndex.java +78 -0
- data/src/toxi/physics2d/ParticlePath2D.java +100 -0
- data/src/toxi/physics2d/ParticleString2D.java +184 -0
- data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
- data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
- data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
- data/src/toxi/physics2d/VerletParticle2D.java +457 -0
- data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
- data/src/toxi/physics2d/VerletSpring2D.java +181 -0
- data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
- data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
- data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
- data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
- data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
- data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
- data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
- data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
- data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
- data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
- data/src/toxi/physics3d/ParticlePath3D.java +100 -0
- data/src/toxi/physics3d/ParticleString3D.java +184 -0
- data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
- data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
- data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
- data/src/toxi/physics3d/VerletParticle3D.java +385 -0
- data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
- data/src/toxi/physics3d/VerletSpring3D.java +180 -0
- data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
- data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
- data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
- data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
- data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
- data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
- data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
- data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
- data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
- data/src/toxi/processing/ArrowModifier.java +116 -0
- data/src/toxi/processing/DashedLineModifier.java +48 -0
- data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
- data/src/toxi/processing/Line2DRenderModifier.java +18 -0
- data/src/toxi/processing/MeshToVBO.java +94 -0
- data/src/toxi/processing/NormalMapper.java +18 -0
- data/src/toxi/processing/POVInterface.java +121 -0
- data/src/toxi/processing/POVMesh.java +219 -0
- data/src/toxi/processing/POVWriter.java +460 -0
- data/src/toxi/processing/RCOpaque.java +77 -0
- data/src/toxi/processing/RCTransp.java +78 -0
- data/src/toxi/processing/TextureBuilder.java +232 -0
- data/src/toxi/processing/Textures.java +110 -0
- data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
- data/src/toxi/processing/Tracing.java +25 -0
- data/src/toxi/processing/XYZNormalMapper.java +30 -0
- data/src/toxi/sim/automata/CAMatrix.java +297 -0
- data/src/toxi/sim/automata/CARule.java +76 -0
- data/src/toxi/sim/automata/CARule2D.java +354 -0
- data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
- data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
- data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
- data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
- data/src/toxi/sim/dla/DLA.java +497 -0
- data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
- data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
- data/src/toxi/sim/dla/DLAEventListener.java +57 -0
- data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
- data/src/toxi/sim/dla/DLAParticle.java +102 -0
- data/src/toxi/sim/dla/DLASegment.java +88 -0
- data/src/toxi/sim/dla/PipelineOrder.java +50 -0
- data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
- data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
- data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
- data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
- data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
- data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
- data/src/toxi/sim/grayscott/GrayScott.java +469 -0
- data/src/toxi/util/DateUtils.java +141 -0
- data/src/toxi/util/FileSequenceDescriptor.java +181 -0
- data/src/toxi/util/FileUtils.java +467 -0
- data/src/toxi/util/datatypes/ArraySet.java +128 -0
- data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
- data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
- data/src/toxi/util/datatypes/DoubleRange.java +251 -0
- data/src/toxi/util/datatypes/FloatRange.java +251 -0
- data/src/toxi/util/datatypes/GenericSet.java +215 -0
- data/src/toxi/util/datatypes/IntegerRange.java +247 -0
- data/src/toxi/util/datatypes/IntegerSet.java +149 -0
- data/src/toxi/util/datatypes/ItemIndex.java +72 -0
- data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
- data/src/toxi/util/datatypes/TypedProperties.java +291 -0
- data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
- data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
- data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
- data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
- data/src/toxi/util/events/EventDispatcher.java +86 -0
- data/src/toxi/volume/AdditiveBrush.java +19 -0
- data/src/toxi/volume/ArrayIsoSurface.java +297 -0
- data/src/toxi/volume/BoxBrush.java +100 -0
- data/src/toxi/volume/BrushMode.java +16 -0
- data/src/toxi/volume/HashIsoSurface.java +354 -0
- data/src/toxi/volume/IsoSurface.java +59 -0
- data/src/toxi/volume/MarchingCubesIndex.java +312 -0
- data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
- data/src/toxi/volume/MeshVoxelizer.java +216 -0
- data/src/toxi/volume/MultiplyBrush.java +20 -0
- data/src/toxi/volume/PeakBrush.java +21 -0
- data/src/toxi/volume/ReplaceBrush.java +19 -0
- data/src/toxi/volume/RoundBrush.java +113 -0
- data/src/toxi/volume/VolumetricBrush.java +160 -0
- data/src/toxi/volume/VolumetricHashMap.java +179 -0
- data/src/toxi/volume/VolumetricSpace.java +195 -0
- data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
- data/toxiclibs.gemspec +34 -0
- metadata +424 -27
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* __ .__ .__ ._____.
|
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
|
7
|
+
* \/ \/ \/ \/
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
10
|
+
*
|
|
11
|
+
* This library is free software; you can redistribute it and/or
|
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
* License as published by the Free Software Foundation; either
|
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
*
|
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
17
|
+
*
|
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21
|
+
* Lesser General Public License for more details.
|
|
22
|
+
*
|
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
24
|
+
* License along with this library; if not, write to the Free Software
|
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
package toxi.geom;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Defines an interface for clipping 2D polygons. Currently the only
|
|
32
|
+
* implementation for this available is {@link SutherlandHodgemanClipper}.
|
|
33
|
+
*/
|
|
34
|
+
public interface PolygonClipper2D {
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Creates a clipped version of the polygon to the boundary shape set.
|
|
38
|
+
*
|
|
39
|
+
* @param poly
|
|
40
|
+
* polygon to be clipped
|
|
41
|
+
* @return clipped poly
|
|
42
|
+
*/
|
|
43
|
+
public Polygon2D clipPolygon(Polygon2D poly);
|
|
44
|
+
|
|
45
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package toxi.geom;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @author tux
|
|
8
|
+
*/
|
|
9
|
+
public interface PolygonTesselator {
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Tesselates the given polygon into a set of triangles.
|
|
13
|
+
*
|
|
14
|
+
* @param poly
|
|
15
|
+
* polygon
|
|
16
|
+
* @return list of triangles
|
|
17
|
+
*/
|
|
18
|
+
public List<Triangle2D> tesselatePolygon(Polygon2D poly);
|
|
19
|
+
|
|
20
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* __ .__ .__ ._____.
|
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
|
7
|
+
* \/ \/ \/ \/
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
10
|
+
*
|
|
11
|
+
* This library is free software; you can redistribute it and/or
|
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
* License as published by the Free Software Foundation; either
|
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
*
|
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
17
|
+
*
|
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21
|
+
* Lesser General Public License for more details.
|
|
22
|
+
*
|
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
24
|
+
* License along with this library; if not, write to the Free Software
|
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
package toxi.geom;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* This interface is the core part of the visitor pattern application for
|
|
32
|
+
* {@link PointQuadtree}s. It can be used to apply a procedure to all tree nodes
|
|
33
|
+
* when passed to {@link PointQuadtree#applyVisitor(QuadtreeVisitor)}.
|
|
34
|
+
*/
|
|
35
|
+
public interface QuadtreeVisitor {
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Applies the procedure defined by an implementation of this interface to
|
|
39
|
+
* the given tree node.
|
|
40
|
+
*
|
|
41
|
+
* @param node
|
|
42
|
+
*/
|
|
43
|
+
void visitNode(PointQuadtree node);
|
|
44
|
+
}
|
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* __ .__ .__ ._____.
|
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
|
7
|
+
* \/ \/ \/ \/
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
10
|
+
*
|
|
11
|
+
* This library is free software; you can redistribute it and/or
|
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
* License as published by the Free Software Foundation; either
|
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
*
|
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
17
|
+
*
|
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21
|
+
* Lesser General Public License for more details.
|
|
22
|
+
*
|
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
24
|
+
* License along with this library; if not, write to the Free Software
|
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
package toxi.geom;
|
|
29
|
+
|
|
30
|
+
import javax.xml.bind.annotation.XmlAccessType;
|
|
31
|
+
import javax.xml.bind.annotation.XmlAccessorType;
|
|
32
|
+
import javax.xml.bind.annotation.XmlAttribute;
|
|
33
|
+
|
|
34
|
+
import toxi.math.InterpolateStrategy;
|
|
35
|
+
import toxi.math.MathUtils;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Quaternion implementation with SLERP based on http://is.gd/2n9s
|
|
39
|
+
*/
|
|
40
|
+
@XmlAccessorType(XmlAccessType.FIELD)
|
|
41
|
+
public class Quaternion {
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
public static final float DOT_THRESHOLD = 0.9995f;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Creates a Quaternion from a axis and a angle.
|
|
50
|
+
*
|
|
51
|
+
* @param axis
|
|
52
|
+
* axis vector (will be normalized)
|
|
53
|
+
* @param angle
|
|
54
|
+
* angle in radians.
|
|
55
|
+
*
|
|
56
|
+
* @return new quaternion
|
|
57
|
+
*/
|
|
58
|
+
public static Quaternion createFromAxisAngle(ReadonlyVec3D axis, float angle) {
|
|
59
|
+
angle *= 0.5;
|
|
60
|
+
float sin = MathUtils.sin(angle);
|
|
61
|
+
float cos = MathUtils.cos(angle);
|
|
62
|
+
Quaternion q = new Quaternion(cos, axis.getNormalizedTo(sin));
|
|
63
|
+
return q;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Creates a Quaternion from Euler angles.
|
|
68
|
+
*
|
|
69
|
+
* @param pitch
|
|
70
|
+
* X-angle in radians.
|
|
71
|
+
* @param yaw
|
|
72
|
+
* Y-angle in radians.
|
|
73
|
+
* @param roll
|
|
74
|
+
* Z-angle in radians.
|
|
75
|
+
*
|
|
76
|
+
* @return new quaternion
|
|
77
|
+
*/
|
|
78
|
+
public static Quaternion createFromEuler(float pitch, float yaw, float roll) {
|
|
79
|
+
pitch *= 0.5;
|
|
80
|
+
yaw *= 0.5;
|
|
81
|
+
roll *= 0.5;
|
|
82
|
+
float sinPitch = MathUtils.sin(pitch);
|
|
83
|
+
float cosPitch = MathUtils.cos(pitch);
|
|
84
|
+
float sinYaw = MathUtils.sin(yaw);
|
|
85
|
+
float cosYaw = MathUtils.cos(yaw);
|
|
86
|
+
float sinRoll = MathUtils.sin(roll);
|
|
87
|
+
float cosRoll = MathUtils.cos(roll);
|
|
88
|
+
float cosPitchCosYaw = cosPitch * cosYaw;
|
|
89
|
+
float sinPitchSinYaw = sinPitch * sinYaw;
|
|
90
|
+
|
|
91
|
+
Quaternion q = new Quaternion();
|
|
92
|
+
|
|
93
|
+
q.x = sinRoll * cosPitchCosYaw - cosRoll * sinPitchSinYaw;
|
|
94
|
+
q.y = cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw;
|
|
95
|
+
q.z = cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw;
|
|
96
|
+
q.w = cosRoll * cosPitchCosYaw + sinRoll * sinPitchSinYaw;
|
|
97
|
+
|
|
98
|
+
// alternative solution from:
|
|
99
|
+
// http://is.gd/6HdEB
|
|
100
|
+
//
|
|
101
|
+
// double c1 = Math.cos(yaw/2);
|
|
102
|
+
// double s1 = Math.sin(yaw/2);
|
|
103
|
+
// double c2 = Math.cos(pitch/2);
|
|
104
|
+
// double s2 = Math.sin(pitch/2);
|
|
105
|
+
// double c3 = Math.cos(roll/2);
|
|
106
|
+
// double s3 = Math.sin(roll/2);
|
|
107
|
+
// double c1c2 = c1*c2;
|
|
108
|
+
// double s1s2 = s1*s2;
|
|
109
|
+
// w =c1c2*c3 - s1s2*s3;
|
|
110
|
+
// x =c1c2*s3 + s1s2*c3;
|
|
111
|
+
// y =s1*c2*c3 + c1*s2*s3;
|
|
112
|
+
// z =c1*s2*c3 - s1*c2*s3;
|
|
113
|
+
|
|
114
|
+
return q;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Creates a quaternion from a rotation matrix. The algorithm used is from
|
|
119
|
+
* Allan and Mark Watt's "Advanced Animation and Rendering Techniques" (ACM
|
|
120
|
+
* Press 1992).
|
|
121
|
+
*
|
|
122
|
+
* @param m
|
|
123
|
+
* rotation matrix
|
|
124
|
+
* @return quaternion
|
|
125
|
+
*/
|
|
126
|
+
public static Quaternion createFromMatrix(Matrix4x4 m) {
|
|
127
|
+
|
|
128
|
+
double s = 0.0f;
|
|
129
|
+
double[] q = new double[4];
|
|
130
|
+
double trace = m.matrix[0][0] + m.matrix[1][1] + m.matrix[2][2];
|
|
131
|
+
if (trace > 0.0f) {
|
|
132
|
+
s = 0.5 / Math.sqrt(trace + 1.0);
|
|
133
|
+
q[0] = (m.matrix[2][1] - m.matrix[1][2]) * s;
|
|
134
|
+
q[1] = (m.matrix[0][2] - m.matrix[2][0]) * s;
|
|
135
|
+
q[2] = (m.matrix[1][0] - m.matrix[0][1]) * s;
|
|
136
|
+
q[3] = 0.25 / s;
|
|
137
|
+
} else {
|
|
138
|
+
int[] nxt = new int[] {
|
|
139
|
+
1, 2, 0
|
|
140
|
+
};
|
|
141
|
+
int i = 0, j = 0, k = 0;
|
|
142
|
+
|
|
143
|
+
if (m.matrix[1][1] > m.matrix[0][0]) {
|
|
144
|
+
i = 1;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (m.matrix[2][2] > m.matrix[i][i]) {
|
|
148
|
+
i = 2;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
j = nxt[i];
|
|
152
|
+
k = nxt[j];
|
|
153
|
+
s = 2.0f * Math
|
|
154
|
+
.sqrt((m.matrix[i][i] - m.matrix[j][j] - m.matrix[k][k]) + 1.0f);
|
|
155
|
+
|
|
156
|
+
double ss = 1.0 / s;
|
|
157
|
+
q[i] = s * 0.25f;
|
|
158
|
+
q[j] = (m.matrix[j][i] + m.matrix[i][j]) * ss;
|
|
159
|
+
q[k] = (m.matrix[k][i] + m.matrix[i][k]) * ss;
|
|
160
|
+
q[3] = (m.matrix[k][j] - m.matrix[j][k]) * ss;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return new Quaternion((float) q[3], (float) q[0], (float) q[1],
|
|
164
|
+
(float) q[2]);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Constructs a quaternion that rotates the vector given by the "forward"
|
|
169
|
+
* param into the direction given by the "dir" param.
|
|
170
|
+
*
|
|
171
|
+
* @param dir
|
|
172
|
+
* @param forward
|
|
173
|
+
* @return quaternion
|
|
174
|
+
*/
|
|
175
|
+
public static Quaternion getAlignmentQuat(ReadonlyVec3D dir,
|
|
176
|
+
ReadonlyVec3D forward) {
|
|
177
|
+
Vec3D target = dir.getNormalized();
|
|
178
|
+
ReadonlyVec3D axis = forward.cross(target);
|
|
179
|
+
float length = axis.magnitude() + 0.0001f;
|
|
180
|
+
float angle = (float) Math.atan2(length, forward.dot(target));
|
|
181
|
+
return createFromAxisAngle(axis, angle);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
@XmlAttribute(required = true)
|
|
185
|
+
public float x,
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
*
|
|
189
|
+
*/
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
*
|
|
193
|
+
*/
|
|
194
|
+
y,
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
*
|
|
198
|
+
*/
|
|
199
|
+
z,
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
*
|
|
203
|
+
*/
|
|
204
|
+
w;
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
*
|
|
208
|
+
*/
|
|
209
|
+
public Quaternion() {
|
|
210
|
+
identity();
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
*
|
|
215
|
+
* @param w
|
|
216
|
+
* @param x
|
|
217
|
+
* @param y
|
|
218
|
+
* @param z
|
|
219
|
+
*/
|
|
220
|
+
public Quaternion(float w, float x, float y, float z) {
|
|
221
|
+
this.w = w;
|
|
222
|
+
this.x = x;
|
|
223
|
+
this.y = y;
|
|
224
|
+
this.z = z;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
*
|
|
229
|
+
* @param w
|
|
230
|
+
* @param v
|
|
231
|
+
*/
|
|
232
|
+
public Quaternion(float w, ReadonlyVec3D v) {
|
|
233
|
+
this.x = v.x();
|
|
234
|
+
this.y = v.y();
|
|
235
|
+
this.z = v.z();
|
|
236
|
+
this.w = w;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
*
|
|
241
|
+
* @param q
|
|
242
|
+
*/
|
|
243
|
+
public Quaternion(Quaternion q) {
|
|
244
|
+
this.w = q.w;
|
|
245
|
+
this.x = q.x;
|
|
246
|
+
this.y = q.y;
|
|
247
|
+
this.z = q.z;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
*
|
|
252
|
+
* @param q
|
|
253
|
+
* @return
|
|
254
|
+
*/
|
|
255
|
+
public Quaternion add(Quaternion q) {
|
|
256
|
+
return new Quaternion(x + q.x, y + q.y, z + q.z, w + q.w);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
*
|
|
261
|
+
* @param q
|
|
262
|
+
* @return
|
|
263
|
+
*/
|
|
264
|
+
public Quaternion addSelf(Quaternion q) {
|
|
265
|
+
x += q.x;
|
|
266
|
+
y += q.y;
|
|
267
|
+
z += q.z;
|
|
268
|
+
w += q.w;
|
|
269
|
+
return this;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
*
|
|
274
|
+
* @param v
|
|
275
|
+
* @return
|
|
276
|
+
*/
|
|
277
|
+
public Vec3D applyTo(Vec3D v) {
|
|
278
|
+
float ix = w * v.x + y * v.z - z * v.y;
|
|
279
|
+
float iy = w * v.y + z * v.x - x * v.z;
|
|
280
|
+
float iz = w * v.z + x * v.y - y * v.x;
|
|
281
|
+
float iw = -x * v.x - y * v.y - z * v.z;
|
|
282
|
+
float xx = ix * w - iw * x - iy * z + iz * y;
|
|
283
|
+
float yy = iy * w - iw * y - iz * x + ix * z;
|
|
284
|
+
float zz = iz * w - iw * z - ix * y + iy * x;
|
|
285
|
+
v.set(xx, yy, zz);
|
|
286
|
+
return v;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
*
|
|
291
|
+
* @return
|
|
292
|
+
*/
|
|
293
|
+
public Quaternion copy() {
|
|
294
|
+
return new Quaternion(w, x, y, z);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Computes the dot product with the given quaternion.
|
|
299
|
+
*
|
|
300
|
+
* @param q
|
|
301
|
+
* @return dot product
|
|
302
|
+
*/
|
|
303
|
+
public float dot(Quaternion q) {
|
|
304
|
+
return (x * q.x) + (y * q.y) + (z * q.z) + (w * q.w);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Computes this quaternion's conjugate, defined as the same w around the
|
|
309
|
+
* inverted axis.
|
|
310
|
+
*
|
|
311
|
+
* @return new conjugate quaternion
|
|
312
|
+
*/
|
|
313
|
+
public Quaternion getConjugate() {
|
|
314
|
+
Quaternion q = new Quaternion();
|
|
315
|
+
q.x = -x;
|
|
316
|
+
q.y = -y;
|
|
317
|
+
q.z = -z;
|
|
318
|
+
q.w = w;
|
|
319
|
+
return q;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* @deprecated use {@link #toMatrix4x4()} instead
|
|
324
|
+
* @return result matrix
|
|
325
|
+
*/
|
|
326
|
+
@Deprecated
|
|
327
|
+
public Matrix4x4 getMatrix() {
|
|
328
|
+
return toMatrix4x4();
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Computes normalized version of this quaternion.
|
|
333
|
+
*
|
|
334
|
+
* @return new normalized quaternion
|
|
335
|
+
*/
|
|
336
|
+
public Quaternion getNormalized() {
|
|
337
|
+
return new Quaternion(this).normalize();
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
*
|
|
342
|
+
* @return
|
|
343
|
+
*/
|
|
344
|
+
public Quaternion identity() {
|
|
345
|
+
w = 1.0f;
|
|
346
|
+
x = 0.0f;
|
|
347
|
+
y = 0.0f;
|
|
348
|
+
z = 0.0f;
|
|
349
|
+
return this;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Spherical interpolation to target quaternion (code ported from <a href=
|
|
354
|
+
* "http://www.gamasutra.com/view/feature/3278/rotating_objects_using_quaternions.php"
|
|
355
|
+
* >GamaSutra</a>)
|
|
356
|
+
*
|
|
357
|
+
* @param target
|
|
358
|
+
* quaternion
|
|
359
|
+
* @param t
|
|
360
|
+
* interpolation factor (0..1)
|
|
361
|
+
* @return new interpolated quat
|
|
362
|
+
*/
|
|
363
|
+
public Quaternion interpolateTo(Quaternion target, float t) {
|
|
364
|
+
return copy().interpolateToSelf(target, t);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* @param target
|
|
369
|
+
* @param t
|
|
370
|
+
* @param is
|
|
371
|
+
* @return interpolated quaternion as new instance
|
|
372
|
+
*/
|
|
373
|
+
public Quaternion interpolateTo(Quaternion target, float t,
|
|
374
|
+
InterpolateStrategy is) {
|
|
375
|
+
return copy().interpolateToSelf(target, is.interpolate(0, 1, t));
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Spherical interpolation to target quaternion (code ported from <a href=
|
|
380
|
+
* "http://www.gamasutra.com/view/feature/3278/rotating_objects_using_quaternions.php"
|
|
381
|
+
* >GamaSutra</a>)
|
|
382
|
+
*
|
|
383
|
+
* @param target
|
|
384
|
+
* quaternion
|
|
385
|
+
* @param t
|
|
386
|
+
* interpolation factor (0..1)
|
|
387
|
+
* @return new interpolated quat
|
|
388
|
+
*/
|
|
389
|
+
public Quaternion interpolateToSelf(Quaternion target, double t) {
|
|
390
|
+
double scale;
|
|
391
|
+
double invscale;
|
|
392
|
+
float dot = dot(target);
|
|
393
|
+
double theta = Math.acos(dot);
|
|
394
|
+
double sintheta = Math.sin(theta);
|
|
395
|
+
if (sintheta > 0.001f) {
|
|
396
|
+
scale = Math.sin(theta * (1.0 - t)) / sintheta;
|
|
397
|
+
invscale = Math.sin(theta * t) / sintheta;
|
|
398
|
+
} else {
|
|
399
|
+
scale = 1 - t;
|
|
400
|
+
invscale = t;
|
|
401
|
+
}
|
|
402
|
+
if (dot < 0) {
|
|
403
|
+
w = (float) (scale * w - invscale * target.w);
|
|
404
|
+
x = (float) (scale * x - invscale * target.x);
|
|
405
|
+
y = (float) (scale * y - invscale * target.y);
|
|
406
|
+
z = (float) (scale * z - invscale * target.z);
|
|
407
|
+
} else {
|
|
408
|
+
w = (float) (scale * w + invscale * target.w);
|
|
409
|
+
x = (float) (scale * x + invscale * target.x);
|
|
410
|
+
y = (float) (scale * y + invscale * target.y);
|
|
411
|
+
z = (float) (scale * z + invscale * target.z);
|
|
412
|
+
}
|
|
413
|
+
return normalize();
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Uses spherical interpolation to approach the target quaternion. The
|
|
418
|
+
* interpolation factor is manipulated by the chosen
|
|
419
|
+
* {@link InterpolateStrategy} first.
|
|
420
|
+
*
|
|
421
|
+
* @param target
|
|
422
|
+
* @param t
|
|
423
|
+
* @param is
|
|
424
|
+
* @return itself
|
|
425
|
+
*/
|
|
426
|
+
public Quaternion interpolateToSelf(Quaternion target, float t,
|
|
427
|
+
InterpolateStrategy is) {
|
|
428
|
+
return interpolateToSelf(target, is.interpolate(0, 1, t));
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
*
|
|
433
|
+
* @return
|
|
434
|
+
*/
|
|
435
|
+
public float magnitude() {
|
|
436
|
+
return (float) Math.sqrt(x * x + y * y + z * z + w * w);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
*
|
|
441
|
+
* @param q2
|
|
442
|
+
* @return
|
|
443
|
+
*/
|
|
444
|
+
public Quaternion multiply(Quaternion q2) {
|
|
445
|
+
Quaternion res = new Quaternion();
|
|
446
|
+
res.w = w * q2.w - x * q2.x - y * q2.y - z * q2.z;
|
|
447
|
+
res.x = w * q2.x + x * q2.w + y * q2.z - z * q2.y;
|
|
448
|
+
res.y = w * q2.y + y * q2.w + z * q2.x - x * q2.z;
|
|
449
|
+
res.z = w * q2.z + z * q2.w + x * q2.y - y * q2.x;
|
|
450
|
+
|
|
451
|
+
return res;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
*
|
|
456
|
+
* @return
|
|
457
|
+
*/
|
|
458
|
+
public Quaternion normalize() {
|
|
459
|
+
double mag = Math.sqrt(x * x + y * y + z * z + w * w);
|
|
460
|
+
if (mag > MathUtils.EPS) {
|
|
461
|
+
mag = 1.0 / mag;
|
|
462
|
+
x *= mag;
|
|
463
|
+
y *= mag;
|
|
464
|
+
z *= mag;
|
|
465
|
+
w *= mag;
|
|
466
|
+
}
|
|
467
|
+
return this;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
*
|
|
472
|
+
* @param t
|
|
473
|
+
* @return
|
|
474
|
+
*/
|
|
475
|
+
public Quaternion scale(float t) {
|
|
476
|
+
return new Quaternion(x * t, y * t, z * t, w * t);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
*
|
|
481
|
+
* @param t
|
|
482
|
+
* @return
|
|
483
|
+
*/
|
|
484
|
+
public Quaternion scaleSelf(float t) {
|
|
485
|
+
x *= t;
|
|
486
|
+
y *= t;
|
|
487
|
+
z *= t;
|
|
488
|
+
w *= t;
|
|
489
|
+
return this;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
*
|
|
494
|
+
* @param w
|
|
495
|
+
* @param x
|
|
496
|
+
* @param y
|
|
497
|
+
* @param z
|
|
498
|
+
* @return
|
|
499
|
+
*/
|
|
500
|
+
public Quaternion set(float w, float x, float y, float z) {
|
|
501
|
+
this.w = w;
|
|
502
|
+
this.x = x;
|
|
503
|
+
this.y = y;
|
|
504
|
+
this.z = z;
|
|
505
|
+
return this;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
*
|
|
510
|
+
* @param w
|
|
511
|
+
* @param v
|
|
512
|
+
* @return
|
|
513
|
+
*/
|
|
514
|
+
public Quaternion set(float w, Vec3D v) {
|
|
515
|
+
this.w = w;
|
|
516
|
+
x = v.x;
|
|
517
|
+
y = v.y;
|
|
518
|
+
z = v.z;
|
|
519
|
+
return this;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
*
|
|
524
|
+
* @param q
|
|
525
|
+
* @return
|
|
526
|
+
*/
|
|
527
|
+
public Quaternion set(Quaternion q) {
|
|
528
|
+
w = q.w;
|
|
529
|
+
x = q.x;
|
|
530
|
+
y = q.y;
|
|
531
|
+
z = q.z;
|
|
532
|
+
return this;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
*
|
|
537
|
+
* @param q
|
|
538
|
+
* @return
|
|
539
|
+
*/
|
|
540
|
+
public Quaternion sub(Quaternion q) {
|
|
541
|
+
return new Quaternion(x - q.x, y - q.y, z - q.z, w - q.w);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
*
|
|
546
|
+
* @param q
|
|
547
|
+
* @return
|
|
548
|
+
*/
|
|
549
|
+
public Quaternion subSelf(Quaternion q) {
|
|
550
|
+
x -= q.x;
|
|
551
|
+
y -= q.y;
|
|
552
|
+
z -= q.z;
|
|
553
|
+
w -= q.w;
|
|
554
|
+
return this;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
*
|
|
559
|
+
* @return
|
|
560
|
+
*/
|
|
561
|
+
public float[] toArray() {
|
|
562
|
+
return new float[] {
|
|
563
|
+
w, x, y, z
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Converts the quaternion into a float array consisting of: rotation angle
|
|
569
|
+
* in radians, rotation axis x,y,z
|
|
570
|
+
*
|
|
571
|
+
* @return 4-element float array
|
|
572
|
+
*/
|
|
573
|
+
public float[] toAxisAngle() {
|
|
574
|
+
float[] res = new float[4];
|
|
575
|
+
float sa = (float) Math.sqrt(1.0f - w * w);
|
|
576
|
+
if (sa < MathUtils.EPS) {
|
|
577
|
+
sa = 1.0f;
|
|
578
|
+
} else {
|
|
579
|
+
sa = 1.0f / sa;
|
|
580
|
+
}
|
|
581
|
+
res[0] = (float) Math.acos(w) * 2.0f;
|
|
582
|
+
res[1] = x * sa;
|
|
583
|
+
res[2] = y * sa;
|
|
584
|
+
res[3] = z * sa;
|
|
585
|
+
return res;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* Converts the quat to a 4x4 rotation matrix (in row-major format). Assumes
|
|
590
|
+
* the quat is currently normalized (if not, you'll need to call
|
|
591
|
+
* {@link #normalize()} first).
|
|
592
|
+
*
|
|
593
|
+
* @return result matrix
|
|
594
|
+
*/
|
|
595
|
+
public Matrix4x4 toMatrix4x4() {
|
|
596
|
+
return toMatrix4x4(new Matrix4x4());
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
*
|
|
601
|
+
* @param result
|
|
602
|
+
* @return
|
|
603
|
+
*/
|
|
604
|
+
public Matrix4x4 toMatrix4x4(Matrix4x4 result) {
|
|
605
|
+
// Converts this quaternion to a rotation matrix.
|
|
606
|
+
//
|
|
607
|
+
// | 1 - 2(y^2 + z^2) 2(xy + wz) 2(xz - wy) 0 |
|
|
608
|
+
// | 2(xy - wz) 1 - 2(x^2 + z^2) 2(yz + wx) 0 |
|
|
609
|
+
// | 2(xz + wy) 2(yz - wx) 1 - 2(x^2 + y^2) 0 |
|
|
610
|
+
// | 0 0 0 1 |
|
|
611
|
+
|
|
612
|
+
float x2 = x + x;
|
|
613
|
+
float y2 = y + y;
|
|
614
|
+
float z2 = z + z;
|
|
615
|
+
float xx = x * x2;
|
|
616
|
+
float xy = x * y2;
|
|
617
|
+
float xz = x * z2;
|
|
618
|
+
float yy = y * y2;
|
|
619
|
+
float yz = y * z2;
|
|
620
|
+
float zz = z * z2;
|
|
621
|
+
float wx = w * x2;
|
|
622
|
+
float wy = w * y2;
|
|
623
|
+
float wz = w * z2;
|
|
624
|
+
|
|
625
|
+
return result.set(1 - (yy + zz), xy - wz, xz + wy, 0, xy + wz,
|
|
626
|
+
1 - (xx + zz), yz - wx, 0, xz - wy, yz + wx, 1 - (xx + yy), 0,
|
|
627
|
+
0, 0, 0, 1);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
*
|
|
632
|
+
* @return
|
|
633
|
+
*/
|
|
634
|
+
@Override
|
|
635
|
+
public String toString() {
|
|
636
|
+
StringBuilder sb = new StringBuilder(48);
|
|
637
|
+
sb.append("{axis: [").append(x).append(",").append(y).append(",")
|
|
638
|
+
.append(z).append("], w: ").append(w).append("}");
|
|
639
|
+
return sb.toString();
|
|
640
|
+
}
|
|
641
|
+
}
|