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,985 @@
|
|
|
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.XmlAttribute;
|
|
31
|
+
|
|
32
|
+
import toxi.math.InterpolateStrategy;
|
|
33
|
+
import toxi.math.MathUtils;
|
|
34
|
+
import toxi.math.ScaleMap;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
*
|
|
38
|
+
* @author tux
|
|
39
|
+
*/
|
|
40
|
+
public class Vec4D implements ReadonlyVec4D, Cloneable {
|
|
41
|
+
|
|
42
|
+
/** X coordinate */
|
|
43
|
+
@XmlAttribute(required = true)
|
|
44
|
+
public float x;
|
|
45
|
+
|
|
46
|
+
/** Y coordinate */
|
|
47
|
+
@XmlAttribute(required = true)
|
|
48
|
+
public float y;
|
|
49
|
+
|
|
50
|
+
/** Z coordinate */
|
|
51
|
+
@XmlAttribute(required = true)
|
|
52
|
+
public float z;
|
|
53
|
+
|
|
54
|
+
/** W coordinate (weight) */
|
|
55
|
+
@XmlAttribute(required = true)
|
|
56
|
+
public float w;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
*/
|
|
61
|
+
public Vec4D() {
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
*
|
|
66
|
+
* @param x
|
|
67
|
+
* @param y
|
|
68
|
+
* @param z
|
|
69
|
+
* @param w
|
|
70
|
+
*/
|
|
71
|
+
public Vec4D(float x, float y, float z, float w) {
|
|
72
|
+
this.x = x;
|
|
73
|
+
this.y = y;
|
|
74
|
+
this.z = z;
|
|
75
|
+
this.w = w;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
*
|
|
80
|
+
* @param v
|
|
81
|
+
* @param w
|
|
82
|
+
*/
|
|
83
|
+
public Vec4D(ReadonlyVec3D v, float w) {
|
|
84
|
+
this.x = v.x();
|
|
85
|
+
this.y = v.y();
|
|
86
|
+
this.z = v.z();
|
|
87
|
+
this.w = w;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
*
|
|
92
|
+
* @param v
|
|
93
|
+
*/
|
|
94
|
+
public Vec4D(ReadonlyVec4D v) {
|
|
95
|
+
set(v);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
*
|
|
100
|
+
* @return
|
|
101
|
+
*/
|
|
102
|
+
public Vec4D abs() {
|
|
103
|
+
x = MathUtils.abs(x);
|
|
104
|
+
y = MathUtils.abs(y);
|
|
105
|
+
z = MathUtils.abs(z);
|
|
106
|
+
w = MathUtils.abs(w);
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@Override
|
|
111
|
+
public final Vec4D add(ReadonlyVec4D v) {
|
|
112
|
+
return new Vec4D(x + v.x(), y + v.y(), z + v.z(), w + v.w());
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
*
|
|
117
|
+
* @param t
|
|
118
|
+
* @param s
|
|
119
|
+
* @return
|
|
120
|
+
*/
|
|
121
|
+
@Override
|
|
122
|
+
public final Vec4D addScaled(ReadonlyVec4D t, float s) {
|
|
123
|
+
return new Vec4D(s * t.x(), s * t.y(), s * t.z(), s * t.w());
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
*
|
|
128
|
+
* @param t
|
|
129
|
+
* @param s
|
|
130
|
+
* @return
|
|
131
|
+
*/
|
|
132
|
+
public final Vec4D addScaledSelf(ReadonlyVec4D t, float s) {
|
|
133
|
+
x += s * t.x();
|
|
134
|
+
y += s * t.y();
|
|
135
|
+
z += s * t.z();
|
|
136
|
+
w += s * t.w();
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
*
|
|
142
|
+
* @param v
|
|
143
|
+
* @return
|
|
144
|
+
*/
|
|
145
|
+
public final Vec4D addSelf(ReadonlyVec4D v) {
|
|
146
|
+
this.x += v.x();
|
|
147
|
+
this.y += v.y();
|
|
148
|
+
this.z += v.z();
|
|
149
|
+
this.w += v.w();
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@Override
|
|
154
|
+
public final Vec4D addXYZ(float xx, float yy, float zz) {
|
|
155
|
+
return new Vec4D(x + xx, y + yy, z + zz, w);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
*
|
|
160
|
+
* @param v
|
|
161
|
+
* @return
|
|
162
|
+
*/
|
|
163
|
+
public final Vec4D addXYZ(ReadonlyVec3D v) {
|
|
164
|
+
return new Vec4D(x + v.x(), y + v.y(), z + v.z(), w);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
*
|
|
169
|
+
* @param xx
|
|
170
|
+
* @param yy
|
|
171
|
+
* @param zz
|
|
172
|
+
* @return
|
|
173
|
+
*/
|
|
174
|
+
public final Vec4D addXYZSelf(float xx, float yy, float zz) {
|
|
175
|
+
x += xx;
|
|
176
|
+
y += yy;
|
|
177
|
+
z += zz;
|
|
178
|
+
return this;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
*
|
|
183
|
+
* @param v
|
|
184
|
+
* @return
|
|
185
|
+
*/
|
|
186
|
+
public final Vec4D addXYZSelf(ReadonlyVec3D v) {
|
|
187
|
+
this.x += v.x();
|
|
188
|
+
this.y += v.y();
|
|
189
|
+
this.z += v.z();
|
|
190
|
+
return this;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Returns the (4-space) angle in radians between this vector and the vector
|
|
195
|
+
* parameter; the return value is constrained to the range [0,PI].
|
|
196
|
+
*
|
|
197
|
+
* @param v
|
|
198
|
+
* the other vector
|
|
199
|
+
* @return the angle in radians in the range [0,PI]
|
|
200
|
+
*/
|
|
201
|
+
@Override
|
|
202
|
+
public final float angleBetween(ReadonlyVec4D v) {
|
|
203
|
+
double vDot = dot(v) / (magnitude() * v.magnitude());
|
|
204
|
+
if (vDot < -1.0) {
|
|
205
|
+
vDot = -1.0;
|
|
206
|
+
}
|
|
207
|
+
if (vDot > 1.0) {
|
|
208
|
+
vDot = 1.0;
|
|
209
|
+
}
|
|
210
|
+
return (float) (Math.acos(vDot));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
@Override
|
|
214
|
+
public int compareTo(ReadonlyVec4D o) {
|
|
215
|
+
if (this.equals(o)) {
|
|
216
|
+
return 0;
|
|
217
|
+
}
|
|
218
|
+
int result = (this.magSquared() < o.magSquared()) ? -1 : 1;
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
@Override
|
|
223
|
+
public final Vec4D copy() {
|
|
224
|
+
return new Vec4D(this);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
@Override
|
|
228
|
+
public final float distanceTo(ReadonlyVec4D v) {
|
|
229
|
+
if (v != null) {
|
|
230
|
+
final float dx = x - v.x();
|
|
231
|
+
final float dy = y - v.y();
|
|
232
|
+
final float dz = z - v.z();
|
|
233
|
+
final float dw = w - v.z();
|
|
234
|
+
return (float) Math.sqrt(dx * dx + dy * dy + dz * dz + dw * dw);
|
|
235
|
+
} else {
|
|
236
|
+
return Float.NaN;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
@Override
|
|
241
|
+
public final float distanceToSquared(ReadonlyVec4D v) {
|
|
242
|
+
if (v != null) {
|
|
243
|
+
final float dx = x - v.x();
|
|
244
|
+
final float dy = y - v.y();
|
|
245
|
+
final float dz = z - v.z();
|
|
246
|
+
final float dw = w - v.z();
|
|
247
|
+
return dx * dx + dy * dy + dz * dz + dw * dw;
|
|
248
|
+
} else {
|
|
249
|
+
return Float.NaN;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
@Override
|
|
254
|
+
public final float dot(ReadonlyVec4D v) {
|
|
255
|
+
return (x * v.x() + y * v.y() + z * v.z() + w * v.w());
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Returns true if the Object v is of type ReadonlyVec4D and all of the data
|
|
260
|
+
* members of v are equal to the corresponding data members in this vector.
|
|
261
|
+
*
|
|
262
|
+
* @param v
|
|
263
|
+
* the Object with which the comparison is made
|
|
264
|
+
* @return true or false
|
|
265
|
+
*/
|
|
266
|
+
@Override
|
|
267
|
+
public boolean equals(Object v) {
|
|
268
|
+
if (v instanceof ReadonlyVec4D) {
|
|
269
|
+
ReadonlyVec4D vv = (ReadonlyVec4D) v;
|
|
270
|
+
if (!((Float) x).equals(vv.x())) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
if (!((Float) y).equals(vv.y())) {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
if (!((Float) z).equals(vv.z())) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
return ((Float) w).equals(vv.w());
|
|
280
|
+
}
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Returns a hash code value based on the data values in this object. Two
|
|
286
|
+
* different Vec4D objects with identical data values (i.e., Vec4D.equals
|
|
287
|
+
* returns true) will return the same hash code value. Two objects with
|
|
288
|
+
* different data members may return the same hash value, although this is
|
|
289
|
+
* not likely.
|
|
290
|
+
*
|
|
291
|
+
* @return the integer hash code value
|
|
292
|
+
*/
|
|
293
|
+
|
|
294
|
+
@Override
|
|
295
|
+
public int hashCode() {
|
|
296
|
+
int hash = 7;
|
|
297
|
+
hash = 29 * hash + Float.floatToIntBits(this.x);
|
|
298
|
+
hash = 29 * hash + Float.floatToIntBits(this.y);
|
|
299
|
+
hash = 29 * hash + Float.floatToIntBits(this.z);
|
|
300
|
+
hash = 29 * hash + Float.floatToIntBits(this.w);
|
|
301
|
+
return hash;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Returns true if the Object v is of type Vec4D and all of the data members
|
|
306
|
+
* of v are equal to the corresponding data members in this vector.
|
|
307
|
+
*
|
|
308
|
+
* @param v
|
|
309
|
+
* the vector with which the comparison is made
|
|
310
|
+
* @return true or false
|
|
311
|
+
*/
|
|
312
|
+
public boolean equals(ReadonlyVec4D v) {
|
|
313
|
+
if (!((Float) x).equals(v.x())) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
if (!((Float) y).equals(v.y())) {
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
if (!((Float) z).equals(v.z())) {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
return ((Float) w).equals(v.w());
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
@Override
|
|
326
|
+
public boolean equalsWithTolerance(ReadonlyVec4D v, float tolerance) {
|
|
327
|
+
if (v instanceof ReadonlyVec4D) {
|
|
328
|
+
float diff = x - v.x();
|
|
329
|
+
if (Float.isNaN(diff)) {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
if ((diff < 0 ? -diff : diff) > tolerance) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
diff = y - v.y();
|
|
336
|
+
if (Float.isNaN(diff)) {
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
if ((diff < 0 ? -diff : diff) > tolerance) {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
diff = z - v.z();
|
|
343
|
+
if (Float.isNaN(diff)) {
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
if ((diff < 0 ? -diff : diff) > tolerance) {
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
diff = w - v.w();
|
|
350
|
+
if (Float.isNaN(diff)) {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
return ((diff > 0 ? -diff : diff) < tolerance);
|
|
354
|
+
}
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
@Override
|
|
359
|
+
public Vec4D getAbs() {
|
|
360
|
+
return copy().abs();
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
@Override
|
|
364
|
+
public final Vec4D getInvertedXYZ() {
|
|
365
|
+
return copy().invertXYZ();
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
@Override
|
|
369
|
+
public Vec4D getMapped(ScaleMap map) {
|
|
370
|
+
return new Vec4D((float) map.getClippedValueFor(x),
|
|
371
|
+
(float) map.getClippedValueFor(y),
|
|
372
|
+
(float) map.getClippedValueFor(z),
|
|
373
|
+
(float) map.getClippedValueFor(w));
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
@Override
|
|
377
|
+
public Vec4D getMappedXYZ(ScaleMap map) {
|
|
378
|
+
return new Vec4D((float) map.getClippedValueFor(x),
|
|
379
|
+
(float) map.getClippedValueFor(y),
|
|
380
|
+
(float) map.getClippedValueFor(z), w);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
@Override
|
|
384
|
+
public Vec4D getNormalized() {
|
|
385
|
+
return copy().normalize();
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
@Override
|
|
389
|
+
public Vec4D getNormalizedTo(float len) {
|
|
390
|
+
return copy().normalizeTo(len);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
@Override
|
|
394
|
+
public Vec4D getRotatedAroundAxis(ReadonlyVec3D axis, float theta) {
|
|
395
|
+
return copy().rotateAroundAxis(axis, theta);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
@Override
|
|
399
|
+
public Vec4D getRotatedX(float theta) {
|
|
400
|
+
return copy().rotateX(theta);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
@Override
|
|
404
|
+
public Vec4D getRotatedY(float theta) {
|
|
405
|
+
return copy().rotateY(theta);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
@Override
|
|
409
|
+
public Vec4D getRotatedZ(float theta) {
|
|
410
|
+
return copy().rotateZ(theta);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
@Override
|
|
414
|
+
public Vec4D getRoundedXYZTo(float prec) {
|
|
415
|
+
return copy().roundXYZTo(prec);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
*
|
|
420
|
+
* @return
|
|
421
|
+
*/
|
|
422
|
+
@Override
|
|
423
|
+
public Vec4D getUnweighted() {
|
|
424
|
+
return copy().unweight();
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
*
|
|
429
|
+
* @return
|
|
430
|
+
*/
|
|
431
|
+
@Override
|
|
432
|
+
public Vec4D getWeighted() {
|
|
433
|
+
return copy().weight();
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
@Override
|
|
437
|
+
public final Vec4D interpolateTo(ReadonlyVec4D v, float t) {
|
|
438
|
+
return copy().interpolateToSelf(v, t);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
@Override
|
|
442
|
+
public final Vec4D interpolateTo(ReadonlyVec4D v, float f,
|
|
443
|
+
InterpolateStrategy s) {
|
|
444
|
+
return new Vec4D(s.interpolate(x, v.x(), f),
|
|
445
|
+
s.interpolate(y, v.y(), f), s.interpolate(z, v.z(), f),
|
|
446
|
+
s.interpolate(w, v.w(), f));
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
*
|
|
451
|
+
* @param v
|
|
452
|
+
* @param t
|
|
453
|
+
* @return
|
|
454
|
+
*/
|
|
455
|
+
public final Vec4D interpolateToSelf(ReadonlyVec4D v, float t) {
|
|
456
|
+
this.x += (v.x() - x) * t;
|
|
457
|
+
this.y += (v.y() - y) * t;
|
|
458
|
+
this.z += (v.z() - z) * t;
|
|
459
|
+
this.w += (v.w() - w) * t;
|
|
460
|
+
return this;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
*
|
|
465
|
+
* @param v
|
|
466
|
+
* @param f
|
|
467
|
+
* @param s
|
|
468
|
+
* @return
|
|
469
|
+
*/
|
|
470
|
+
public final Vec4D interpolateToSelf(ReadonlyVec4D v, float f,
|
|
471
|
+
InterpolateStrategy s) {
|
|
472
|
+
x = s.interpolate(x, v.x(), f);
|
|
473
|
+
y = s.interpolate(y, v.y(), f);
|
|
474
|
+
z = s.interpolate(z, v.z(), f);
|
|
475
|
+
w = s.interpolate(w, v.w(), f);
|
|
476
|
+
return this;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
*
|
|
481
|
+
* @return
|
|
482
|
+
*/
|
|
483
|
+
public final Vec4D invertXYZ() {
|
|
484
|
+
this.x *= -1;
|
|
485
|
+
this.y *= -1;
|
|
486
|
+
this.z *= -1;
|
|
487
|
+
return this;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
@Override
|
|
491
|
+
public final boolean isZeroVector() {
|
|
492
|
+
return MathUtils.abs(x) < MathUtils.EPS
|
|
493
|
+
&& MathUtils.abs(y) < MathUtils.EPS
|
|
494
|
+
&& MathUtils.abs(z) < MathUtils.EPS
|
|
495
|
+
&& MathUtils.abs(w) < MathUtils.EPS;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
@Override
|
|
499
|
+
public final float magnitude() {
|
|
500
|
+
return (float) Math.sqrt(x * x + y * y + z * z + w * w);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
@Override
|
|
504
|
+
public final float magSquared() {
|
|
505
|
+
return x * x + y * y + z * z + w * w;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Normalizes the vector so that its magnitude = 1.
|
|
510
|
+
*
|
|
511
|
+
* @return itself
|
|
512
|
+
*/
|
|
513
|
+
public final Vec4D normalize() {
|
|
514
|
+
float mag = (float) Math.sqrt(x * x + y * y + z * z);
|
|
515
|
+
if (mag > 0) {
|
|
516
|
+
mag = 1f / mag;
|
|
517
|
+
x *= mag;
|
|
518
|
+
y *= mag;
|
|
519
|
+
z *= mag;
|
|
520
|
+
w *= mag;
|
|
521
|
+
}
|
|
522
|
+
return this;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* Normalizes the vector to the given length.
|
|
527
|
+
*
|
|
528
|
+
* @param len
|
|
529
|
+
* desired length
|
|
530
|
+
* @return itself
|
|
531
|
+
*/
|
|
532
|
+
public final Vec4D normalizeTo(float len) {
|
|
533
|
+
float mag = (float) Math.sqrt(x * x + y * y + z * z);
|
|
534
|
+
if (mag > 0) {
|
|
535
|
+
mag = len / mag;
|
|
536
|
+
x *= mag;
|
|
537
|
+
y *= mag;
|
|
538
|
+
z *= mag;
|
|
539
|
+
w *= mag;
|
|
540
|
+
}
|
|
541
|
+
return this;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Rotates the vector around the giving axis.
|
|
546
|
+
*
|
|
547
|
+
* @param axis
|
|
548
|
+
* rotation axis vector
|
|
549
|
+
* @param theta
|
|
550
|
+
* rotation angle (in radians)
|
|
551
|
+
*
|
|
552
|
+
* @return itself
|
|
553
|
+
*/
|
|
554
|
+
public final Vec4D rotateAroundAxis(ReadonlyVec3D axis, float theta) {
|
|
555
|
+
final float ax = axis.x();
|
|
556
|
+
final float ay = axis.y();
|
|
557
|
+
final float az = axis.z();
|
|
558
|
+
final float ux = ax * x;
|
|
559
|
+
final float uy = ax * y;
|
|
560
|
+
final float uz = ax * z;
|
|
561
|
+
final float vx = ay * x;
|
|
562
|
+
final float vy = ay * y;
|
|
563
|
+
final float vz = ay * z;
|
|
564
|
+
final float wx = az * x;
|
|
565
|
+
final float wy = az * y;
|
|
566
|
+
final float wz = az * z;
|
|
567
|
+
final double si = Math.sin(theta);
|
|
568
|
+
final double co = Math.cos(theta);
|
|
569
|
+
float xx = (float) (ax * (ux + vy + wz)
|
|
570
|
+
+ (x * (ay * ay + az * az) - ax * (vy + wz)) * co + (-wy + vz)
|
|
571
|
+
* si);
|
|
572
|
+
float yy = (float) (ay * (ux + vy + wz)
|
|
573
|
+
+ (y * (ax * ax + az * az) - ay * (ux + wz)) * co + (wx - uz)
|
|
574
|
+
* si);
|
|
575
|
+
float zz = (float) (az * (ux + vy + wz)
|
|
576
|
+
+ (z * (ax * ax + ay * ay) - az * (ux + vy)) * co + (-vx + uy)
|
|
577
|
+
* si);
|
|
578
|
+
x = xx;
|
|
579
|
+
y = yy;
|
|
580
|
+
z = zz;
|
|
581
|
+
return this;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* Rotates the vector by the given angle around the X axis.
|
|
586
|
+
*
|
|
587
|
+
* @param theta
|
|
588
|
+
* the theta
|
|
589
|
+
*
|
|
590
|
+
* @return itself
|
|
591
|
+
*/
|
|
592
|
+
public final Vec4D rotateX(float theta) {
|
|
593
|
+
final float co = (float) Math.cos(theta);
|
|
594
|
+
final float si = (float) Math.sin(theta);
|
|
595
|
+
final float zz = co * z - si * y;
|
|
596
|
+
y = si * z + co * y;
|
|
597
|
+
z = zz;
|
|
598
|
+
return this;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Rotates the vector by the given angle around the Y axis.
|
|
603
|
+
*
|
|
604
|
+
* @param theta
|
|
605
|
+
* the theta
|
|
606
|
+
*
|
|
607
|
+
* @return itself
|
|
608
|
+
*/
|
|
609
|
+
public final Vec4D rotateY(float theta) {
|
|
610
|
+
final float co = (float) Math.cos(theta);
|
|
611
|
+
final float si = (float) Math.sin(theta);
|
|
612
|
+
final float xx = co * x - si * z;
|
|
613
|
+
z = si * x + co * z;
|
|
614
|
+
x = xx;
|
|
615
|
+
return this;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* Rotates the vector by the given angle around the Z axis.
|
|
620
|
+
*
|
|
621
|
+
* @param theta
|
|
622
|
+
* the theta
|
|
623
|
+
*
|
|
624
|
+
* @return itself
|
|
625
|
+
*/
|
|
626
|
+
public final Vec4D rotateZ(float theta) {
|
|
627
|
+
final float co = (float) Math.cos(theta);
|
|
628
|
+
final float si = (float) Math.sin(theta);
|
|
629
|
+
final float xx = co * x - si * y;
|
|
630
|
+
y = si * x + co * y;
|
|
631
|
+
x = xx;
|
|
632
|
+
return this;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
*
|
|
637
|
+
* @param prec
|
|
638
|
+
* @return
|
|
639
|
+
*/
|
|
640
|
+
public Vec4D roundXYZTo(float prec) {
|
|
641
|
+
x = MathUtils.roundTo(x, prec);
|
|
642
|
+
y = MathUtils.roundTo(y, prec);
|
|
643
|
+
z = MathUtils.roundTo(z, prec);
|
|
644
|
+
return this;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
@Override
|
|
648
|
+
public final Vec4D scale(float s) {
|
|
649
|
+
return new Vec4D(x * s, y * s, z * s, w * s);
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
@Override
|
|
653
|
+
public final Vec4D scale(float xx, float yy, float zz, float ww) {
|
|
654
|
+
return new Vec4D(x * xx, y * yy, z * zz, w * ww);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
@Override
|
|
658
|
+
public Vec4D scale(ReadonlyVec4D s) {
|
|
659
|
+
return copy().scaleSelf(s);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
*
|
|
664
|
+
* @param s
|
|
665
|
+
* @return
|
|
666
|
+
*/
|
|
667
|
+
public final Vec4D scaleSelf(float s) {
|
|
668
|
+
this.x *= s;
|
|
669
|
+
this.y *= s;
|
|
670
|
+
this.z *= s;
|
|
671
|
+
this.w *= s;
|
|
672
|
+
return this;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
/**
|
|
676
|
+
*
|
|
677
|
+
* @param s
|
|
678
|
+
* @return
|
|
679
|
+
*/
|
|
680
|
+
public Vec4D scaleSelf(ReadonlyVec4D s) {
|
|
681
|
+
this.x *= s.x();
|
|
682
|
+
this.y *= s.y();
|
|
683
|
+
this.z *= s.z();
|
|
684
|
+
this.w *= s.w();
|
|
685
|
+
return this;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/**
|
|
689
|
+
*
|
|
690
|
+
* @param s
|
|
691
|
+
* @return
|
|
692
|
+
*/
|
|
693
|
+
public final Vec4D scaleXYZSelf(float s) {
|
|
694
|
+
this.x *= s;
|
|
695
|
+
this.y *= s;
|
|
696
|
+
this.z *= s;
|
|
697
|
+
return this;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
/**
|
|
701
|
+
*
|
|
702
|
+
* @param xscale
|
|
703
|
+
* @param yscale
|
|
704
|
+
* @param zscale
|
|
705
|
+
* @return
|
|
706
|
+
*/
|
|
707
|
+
public final Vec4D scaleXYZSelf(float xscale, float yscale, float zscale) {
|
|
708
|
+
this.x *= xscale;
|
|
709
|
+
this.y *= yscale;
|
|
710
|
+
this.z *= zscale;
|
|
711
|
+
return this;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
/**
|
|
715
|
+
* Overrides coordinates with the given values.
|
|
716
|
+
*
|
|
717
|
+
* @param x
|
|
718
|
+
* the x
|
|
719
|
+
* @param y
|
|
720
|
+
* the y
|
|
721
|
+
* @param z
|
|
722
|
+
* the z
|
|
723
|
+
* @param w
|
|
724
|
+
* the w
|
|
725
|
+
*
|
|
726
|
+
* @return itself
|
|
727
|
+
*/
|
|
728
|
+
public Vec4D set(float x, float y, float z, float w) {
|
|
729
|
+
this.x = x;
|
|
730
|
+
this.y = y;
|
|
731
|
+
this.z = z;
|
|
732
|
+
this.w = w;
|
|
733
|
+
return this;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
*
|
|
738
|
+
* @param v
|
|
739
|
+
* @return
|
|
740
|
+
*/
|
|
741
|
+
public final Vec4D set(ReadonlyVec4D v) {
|
|
742
|
+
this.x = v.x();
|
|
743
|
+
this.y = v.y();
|
|
744
|
+
this.z = v.z();
|
|
745
|
+
this.w = v.w();
|
|
746
|
+
return this;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
*
|
|
751
|
+
* @param w
|
|
752
|
+
* @return
|
|
753
|
+
*/
|
|
754
|
+
public Vec4D setW(float w) {
|
|
755
|
+
this.w = w;
|
|
756
|
+
return this;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/**
|
|
760
|
+
*
|
|
761
|
+
* @param x
|
|
762
|
+
* @return
|
|
763
|
+
*/
|
|
764
|
+
public Vec4D setX(float x) {
|
|
765
|
+
this.x = x;
|
|
766
|
+
return this;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
/**
|
|
770
|
+
*
|
|
771
|
+
* @param v
|
|
772
|
+
* @return
|
|
773
|
+
*/
|
|
774
|
+
public final Vec4D setXYZ(ReadonlyVec3D v) {
|
|
775
|
+
this.x = v.x();
|
|
776
|
+
this.y = v.y();
|
|
777
|
+
this.z = v.z();
|
|
778
|
+
return this;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
/**
|
|
782
|
+
*
|
|
783
|
+
* @param y
|
|
784
|
+
* @return
|
|
785
|
+
*/
|
|
786
|
+
public Vec4D setY(float y) {
|
|
787
|
+
this.y = y;
|
|
788
|
+
return this;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
*
|
|
793
|
+
* @param z
|
|
794
|
+
* @return
|
|
795
|
+
*/
|
|
796
|
+
public Vec4D setZ(float z) {
|
|
797
|
+
this.z = z;
|
|
798
|
+
return this;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
@Override
|
|
802
|
+
public final Vec4D sub(ReadonlyVec4D v) {
|
|
803
|
+
return new Vec4D(x - v.x(), y - v.y(), z - v.z(), w - v.w());
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
/**
|
|
807
|
+
*
|
|
808
|
+
* @param v
|
|
809
|
+
* @return
|
|
810
|
+
*/
|
|
811
|
+
public final Vec4D subSelf(ReadonlyVec4D v) {
|
|
812
|
+
this.x -= v.x();
|
|
813
|
+
this.y -= v.y();
|
|
814
|
+
this.z -= v.z();
|
|
815
|
+
this.w -= v.w();
|
|
816
|
+
return this;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
@Override
|
|
820
|
+
public final Vec4D subXYZ(float xx, float yy, float zz) {
|
|
821
|
+
return new Vec4D(x - xx, y - yy, z - zz, w);
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
/**
|
|
825
|
+
*
|
|
826
|
+
* @param v
|
|
827
|
+
* @return
|
|
828
|
+
*/
|
|
829
|
+
public final Vec4D subXYZ(ReadonlyVec3D v) {
|
|
830
|
+
return new Vec4D(x - v.x(), y - v.y(), z - v.z(), w);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
/**
|
|
834
|
+
*
|
|
835
|
+
* @param xx
|
|
836
|
+
* @param yy
|
|
837
|
+
* @param zz
|
|
838
|
+
* @return
|
|
839
|
+
*/
|
|
840
|
+
public final Vec4D subXYZSelf(float xx, float yy, float zz) {
|
|
841
|
+
this.x -= xx;
|
|
842
|
+
this.y -= yy;
|
|
843
|
+
this.z -= zz;
|
|
844
|
+
return this;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
/**
|
|
848
|
+
*
|
|
849
|
+
* @param v
|
|
850
|
+
* @return
|
|
851
|
+
*/
|
|
852
|
+
public final Vec4D subXYZSelf(ReadonlyVec3D v) {
|
|
853
|
+
this.x -= v.x();
|
|
854
|
+
this.y -= v.y();
|
|
855
|
+
this.z -= v.z();
|
|
856
|
+
return this;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
/**
|
|
860
|
+
*
|
|
861
|
+
* @return
|
|
862
|
+
*/
|
|
863
|
+
public final Vec3D to3D() {
|
|
864
|
+
return new Vec3D(x, y, z);
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
/**
|
|
868
|
+
*
|
|
869
|
+
* @return
|
|
870
|
+
*/
|
|
871
|
+
@Override
|
|
872
|
+
public float[] toArray() {
|
|
873
|
+
return new float[] {
|
|
874
|
+
x, y, z, w
|
|
875
|
+
};
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
/**
|
|
879
|
+
*
|
|
880
|
+
* @return
|
|
881
|
+
*/
|
|
882
|
+
@Override
|
|
883
|
+
public String toString() {
|
|
884
|
+
return "[x=" + x + ", y=" + y + ", z=" + z + ", w=" + w + "]";
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
/**
|
|
888
|
+
*
|
|
889
|
+
* @param xx
|
|
890
|
+
* @param yy
|
|
891
|
+
* @param zz
|
|
892
|
+
* @return
|
|
893
|
+
*/
|
|
894
|
+
public final Vec4D translate(float xx, float yy, float zz) {
|
|
895
|
+
this.x += w * xx;
|
|
896
|
+
this.y += w * yy;
|
|
897
|
+
this.z += w * zz;
|
|
898
|
+
return this;
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
/**
|
|
902
|
+
* Divides each coordinate bythe weight with and sets the coordinate to the
|
|
903
|
+
* newly calculatd ones.
|
|
904
|
+
* @return
|
|
905
|
+
*/
|
|
906
|
+
public final Vec4D unweight() {
|
|
907
|
+
float iw = MathUtils.abs(w) > MathUtils.EPS ? 1f / w : 0;
|
|
908
|
+
x *= iw;
|
|
909
|
+
y *= iw;
|
|
910
|
+
z *= iw;
|
|
911
|
+
return this;
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
/**
|
|
915
|
+
*
|
|
916
|
+
* @param out
|
|
917
|
+
* @return
|
|
918
|
+
*/
|
|
919
|
+
@Override
|
|
920
|
+
public final Vec3D unweightInto(Vec3D out) {
|
|
921
|
+
float iw = MathUtils.abs(w) > MathUtils.EPS ? 1f / w : 0;
|
|
922
|
+
out.x = x * iw;
|
|
923
|
+
out.y = y * iw;
|
|
924
|
+
out.z = z * iw;
|
|
925
|
+
return out;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
/**
|
|
929
|
+
* @return the w
|
|
930
|
+
*/
|
|
931
|
+
@Override
|
|
932
|
+
public final float w() {
|
|
933
|
+
return w;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
/**
|
|
937
|
+
* Multiplies the weight with each coordinate and sets the coordinate to the
|
|
938
|
+
* newly calculatd ones.
|
|
939
|
+
*
|
|
940
|
+
* @return itself
|
|
941
|
+
*/
|
|
942
|
+
public final Vec4D weight() {
|
|
943
|
+
x *= w;
|
|
944
|
+
y *= w;
|
|
945
|
+
z *= w;
|
|
946
|
+
return this;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
/**
|
|
950
|
+
*
|
|
951
|
+
* @param out
|
|
952
|
+
* @return
|
|
953
|
+
*/
|
|
954
|
+
@Override
|
|
955
|
+
public final Vec3D weightInto(Vec3D out) {
|
|
956
|
+
out.x = x * w;
|
|
957
|
+
out.y = y * w;
|
|
958
|
+
out.z = z * w;
|
|
959
|
+
return out;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/**
|
|
963
|
+
* @return the x
|
|
964
|
+
*/
|
|
965
|
+
@Override
|
|
966
|
+
public final float x() {
|
|
967
|
+
return x;
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
/**
|
|
971
|
+
* @return the y
|
|
972
|
+
*/
|
|
973
|
+
@Override
|
|
974
|
+
public final float y() {
|
|
975
|
+
return y;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
/**
|
|
979
|
+
* @return the z
|
|
980
|
+
*/
|
|
981
|
+
@Override
|
|
982
|
+
public final float z() {
|
|
983
|
+
return z;
|
|
984
|
+
}
|
|
985
|
+
}
|