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,57 @@
|
|
|
1
|
+
package toxi.geom;
|
|
2
|
+
|
|
3
|
+
import toxi.math.MathUtils;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @author tux
|
|
8
|
+
*/
|
|
9
|
+
public class PlaneIntersector implements Intersector3D {
|
|
10
|
+
|
|
11
|
+
private Plane plane;
|
|
12
|
+
private final IsectData3D isec;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @param p
|
|
17
|
+
*/
|
|
18
|
+
public PlaneIntersector(Plane p) {
|
|
19
|
+
this.plane = p;
|
|
20
|
+
this.isec = new IsectData3D();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
public IsectData3D getIntersectionData() {
|
|
25
|
+
return isec;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @return the box
|
|
30
|
+
*/
|
|
31
|
+
public Plane getPlane() {
|
|
32
|
+
return plane;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@Override
|
|
36
|
+
public boolean intersectsRay(Ray3D ray) {
|
|
37
|
+
float d = -plane.normal.dot(plane);
|
|
38
|
+
float numer = plane.normal.dot(ray) + d;
|
|
39
|
+
float denom = plane.normal.dot(ray.dir);
|
|
40
|
+
|
|
41
|
+
// normal is orthogonal to vector, can't intersect
|
|
42
|
+
if (isec.isIntersection = (MathUtils.abs(denom) >= MathUtils.EPS)) {
|
|
43
|
+
isec.dist = -(numer / denom);
|
|
44
|
+
isec.pos = ray.getPointAtDistance(isec.dist);
|
|
45
|
+
isec.normal = plane.normal;
|
|
46
|
+
}
|
|
47
|
+
return isec.isIntersection;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param p
|
|
52
|
+
* the plane to set
|
|
53
|
+
*/
|
|
54
|
+
public void setPlane(Plane p) {
|
|
55
|
+
this.plane = p;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
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 java.util.ArrayList;
|
|
31
|
+
import java.util.Iterator;
|
|
32
|
+
import java.util.List;
|
|
33
|
+
|
|
34
|
+
import toxi.math.MathUtils;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
*
|
|
38
|
+
* @author tux
|
|
39
|
+
*/
|
|
40
|
+
public class PointCloud3D implements Iterable<Vec3D> {
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
*/
|
|
45
|
+
protected List<Vec3D> points;
|
|
46
|
+
|
|
47
|
+
protected Vec3D min,
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
*
|
|
55
|
+
*/
|
|
56
|
+
max;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
*/
|
|
61
|
+
protected Vec3D centroid;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
*
|
|
65
|
+
*/
|
|
66
|
+
protected float radiusSquared;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
*
|
|
70
|
+
*/
|
|
71
|
+
public PointCloud3D() {
|
|
72
|
+
this(100);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
*
|
|
77
|
+
* @param numPoints
|
|
78
|
+
*/
|
|
79
|
+
public PointCloud3D(int numPoints) {
|
|
80
|
+
points = new ArrayList<>(numPoints);
|
|
81
|
+
clear();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
*
|
|
86
|
+
* @param plist
|
|
87
|
+
* @return
|
|
88
|
+
*/
|
|
89
|
+
public PointCloud3D addAll(List<? extends Vec3D> plist) {
|
|
90
|
+
for (Vec3D p : plist) {
|
|
91
|
+
addPoint(p);
|
|
92
|
+
}
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
*
|
|
98
|
+
* @param p
|
|
99
|
+
* @return
|
|
100
|
+
*/
|
|
101
|
+
public PointCloud3D addPoint(Vec3D p) {
|
|
102
|
+
points.add(p);
|
|
103
|
+
min.minSelf(p);
|
|
104
|
+
max.maxSelf(p);
|
|
105
|
+
centroid.set(min.add(max).scaleSelf(0.5f));
|
|
106
|
+
radiusSquared = MathUtils.max(radiusSquared,
|
|
107
|
+
p.distanceToSquared(centroid));
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Applies the given transformation matrix to all points in the cloud.
|
|
113
|
+
*
|
|
114
|
+
* @param m
|
|
115
|
+
* transformation matrix
|
|
116
|
+
* @return itself
|
|
117
|
+
*/
|
|
118
|
+
public PointCloud3D applyMatrix(Matrix4x4 m) {
|
|
119
|
+
for (Vec3D p : points) {
|
|
120
|
+
p.set(m.applyTo(p));
|
|
121
|
+
}
|
|
122
|
+
updateBounds();
|
|
123
|
+
return this;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Updates all points in the cloud so that their new centroid is at the
|
|
128
|
+
* origin.
|
|
129
|
+
*
|
|
130
|
+
* @return itself
|
|
131
|
+
*/
|
|
132
|
+
public PointCloud3D center() {
|
|
133
|
+
return center(null);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Updates all points in the cloud so that their new centroid is at the
|
|
138
|
+
* given point.
|
|
139
|
+
*
|
|
140
|
+
* @param origin
|
|
141
|
+
* new centroid
|
|
142
|
+
* @return itself
|
|
143
|
+
*/
|
|
144
|
+
public PointCloud3D center(ReadonlyVec3D origin) {
|
|
145
|
+
getCentroid();
|
|
146
|
+
Vec3D delta = origin != null ? origin.sub(centroid) : centroid
|
|
147
|
+
.getInverted();
|
|
148
|
+
for (Vec3D p : points) {
|
|
149
|
+
p.addSelf(delta);
|
|
150
|
+
}
|
|
151
|
+
min.addSelf(delta);
|
|
152
|
+
max.addSelf(delta);
|
|
153
|
+
centroid.addSelf(delta);
|
|
154
|
+
return this;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Removes all points from the cloud and resets the bounds and centroid.
|
|
159
|
+
*
|
|
160
|
+
* @return itself
|
|
161
|
+
*/
|
|
162
|
+
public final PointCloud3D clear() {
|
|
163
|
+
points.clear();
|
|
164
|
+
min = Vec3D.MAX_VALUE.copy();
|
|
165
|
+
max = Vec3D.NEG_MAX_VALUE.copy();
|
|
166
|
+
centroid = new Vec3D();
|
|
167
|
+
return this;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Creates a deep copy of the cloud
|
|
172
|
+
*
|
|
173
|
+
* @return copied instance
|
|
174
|
+
*/
|
|
175
|
+
public PointCloud3D copy() {
|
|
176
|
+
PointCloud3D c = new PointCloud3D(points.size());
|
|
177
|
+
for (ReadonlyVec3D p : points) {
|
|
178
|
+
c.addPoint(p.copy());
|
|
179
|
+
}
|
|
180
|
+
return c;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
*
|
|
185
|
+
* @return
|
|
186
|
+
*/
|
|
187
|
+
public AABB getBoundingBox() {
|
|
188
|
+
return AABB.fromMinMax(min, max);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
*
|
|
193
|
+
* @return
|
|
194
|
+
*/
|
|
195
|
+
public Sphere getBoundingSphere() {
|
|
196
|
+
return new Sphere(getCentroid(), (float) Math.sqrt(radiusSquared));
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* @return the cloud centroid
|
|
201
|
+
*/
|
|
202
|
+
public Vec3D getCentroid() {
|
|
203
|
+
return centroid;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* @return an iterator for the backing point collection.
|
|
208
|
+
*
|
|
209
|
+
* @see java.lang.Iterable#iterator()
|
|
210
|
+
*/
|
|
211
|
+
public Iterator<Vec3D> iterator() {
|
|
212
|
+
return points.iterator();
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Removes the point from the cloud, but doesn't update the bounds
|
|
217
|
+
* automatically.
|
|
218
|
+
*
|
|
219
|
+
* @param p
|
|
220
|
+
* @return true, if point has been removed.
|
|
221
|
+
*/
|
|
222
|
+
public boolean removePoint(ReadonlyVec3D p) {
|
|
223
|
+
return points.remove(p);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* @return the current number of points in the cloud
|
|
228
|
+
*/
|
|
229
|
+
public int size() {
|
|
230
|
+
return points.size();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Recalculates the bounding box, bounding sphere and centroid of the cloud.
|
|
235
|
+
*
|
|
236
|
+
* @return itself
|
|
237
|
+
*/
|
|
238
|
+
public PointCloud3D updateBounds() {
|
|
239
|
+
min = Vec3D.MAX_VALUE.copy();
|
|
240
|
+
max = Vec3D.NEG_MAX_VALUE.copy();
|
|
241
|
+
for (Vec3D p : points) {
|
|
242
|
+
min.minSelf(p);
|
|
243
|
+
max.maxSelf(p);
|
|
244
|
+
}
|
|
245
|
+
centroid.set(min.add(max).scaleSelf(0.5f));
|
|
246
|
+
radiusSquared = 0;
|
|
247
|
+
for (ReadonlyVec3D p : points) {
|
|
248
|
+
radiusSquared = MathUtils.max(radiusSquared,
|
|
249
|
+
p.distanceToSquared(centroid));
|
|
250
|
+
}
|
|
251
|
+
return this;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
@@ -0,0 +1,502 @@
|
|
|
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 java.util.ArrayList;
|
|
31
|
+
import java.util.Collection;
|
|
32
|
+
import java.util.List;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Implements a spatial subdivision tree to work efficiently with large numbers
|
|
36
|
+
* of 3D particles. This octree can only be used for particle type objects and
|
|
37
|
+
* does NOT support 3D mesh geometry as other forms of Octrees do.
|
|
38
|
+
*
|
|
39
|
+
* For further reference also see the OctreeDemo in the /examples folder.
|
|
40
|
+
*
|
|
41
|
+
*/
|
|
42
|
+
public class PointOctree extends AABB implements Shape3D {
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* alternative tree recursion limit, number of world units when cells are
|
|
46
|
+
* not subdivided any further
|
|
47
|
+
*/
|
|
48
|
+
protected float minNodeSize = 4;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
*/
|
|
53
|
+
protected PointOctree parent;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
*/
|
|
58
|
+
protected PointOctree[] children;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
*/
|
|
63
|
+
protected byte numChildren;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
*/
|
|
68
|
+
protected ArrayList<Vec3D> points;
|
|
69
|
+
|
|
70
|
+
protected float size,
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
*
|
|
74
|
+
*/
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
*
|
|
78
|
+
*/
|
|
79
|
+
halfSize;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
*/
|
|
84
|
+
protected Vec3D offset;
|
|
85
|
+
|
|
86
|
+
private int depth = 0;
|
|
87
|
+
|
|
88
|
+
private boolean isAutoReducing = false;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Constructs a new PointOctree node within the AABB cube volume: {o.x, o.y,
|
|
92
|
+
* o.z} ... {o.x+size, o.y+size, o.z+size}
|
|
93
|
+
*
|
|
94
|
+
* @param p
|
|
95
|
+
* parent node
|
|
96
|
+
* @param o
|
|
97
|
+
* tree origin
|
|
98
|
+
* @param halfSize
|
|
99
|
+
* half length of the tree volume along a single axis
|
|
100
|
+
*/
|
|
101
|
+
private PointOctree(PointOctree p, Vec3D o, float halfSize) {
|
|
102
|
+
super(o.add(halfSize, halfSize, halfSize), new Vec3D(halfSize,
|
|
103
|
+
halfSize, halfSize));
|
|
104
|
+
this.parent = p;
|
|
105
|
+
this.halfSize = halfSize;
|
|
106
|
+
this.size = halfSize * 2;
|
|
107
|
+
this.offset = o;
|
|
108
|
+
this.numChildren = 0;
|
|
109
|
+
if (parent != null) {
|
|
110
|
+
depth = parent.depth + 1;
|
|
111
|
+
minNodeSize = parent.minNodeSize;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Constructs a new PointOctree node within the AABB cube volume: {o.x, o.y,
|
|
117
|
+
* o.z} ... {o.x+size, o.y+size, o.z+size}
|
|
118
|
+
*
|
|
119
|
+
* @param o
|
|
120
|
+
* tree origin
|
|
121
|
+
* @param size
|
|
122
|
+
* size of the tree volume along a single axis
|
|
123
|
+
*/
|
|
124
|
+
public PointOctree(Vec3D o, float size) {
|
|
125
|
+
this(null, o, size / 2);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Adds all points of the collection to the octree. IMPORTANT: Points need
|
|
130
|
+
* be of type Vec3D or have subclassed it.
|
|
131
|
+
*
|
|
132
|
+
* @param points
|
|
133
|
+
* point collection
|
|
134
|
+
* @return true, if all points have been added successfully.
|
|
135
|
+
*/
|
|
136
|
+
public boolean addAll(Collection<Vec3D> points) {
|
|
137
|
+
boolean addedAll = true;
|
|
138
|
+
for (Vec3D p : points) {
|
|
139
|
+
addedAll &= addPoint(p);
|
|
140
|
+
}
|
|
141
|
+
return addedAll;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Adds a new point/particle to the tree structure. All points are stored
|
|
146
|
+
* within leaf nodes only. The tree implementation is using lazy
|
|
147
|
+
* instantiation for all intermediate tree levels.
|
|
148
|
+
*
|
|
149
|
+
* @param p
|
|
150
|
+
* @return true, if point has been added successfully
|
|
151
|
+
*/
|
|
152
|
+
public boolean addPoint(Vec3D p) {
|
|
153
|
+
// check if point is inside cube
|
|
154
|
+
if (containsPoint(p)) {
|
|
155
|
+
// only add points to leaves for now
|
|
156
|
+
if (halfSize <= minNodeSize) {
|
|
157
|
+
if (points == null) {
|
|
158
|
+
points = new ArrayList<>();
|
|
159
|
+
}
|
|
160
|
+
points.add(p);
|
|
161
|
+
return true;
|
|
162
|
+
} else {
|
|
163
|
+
Vec3D plocal = p.sub(offset);
|
|
164
|
+
if (children == null) {
|
|
165
|
+
children = new PointOctree[8];
|
|
166
|
+
}
|
|
167
|
+
int octant = getOctantID(plocal);
|
|
168
|
+
if (children[octant] == null) {
|
|
169
|
+
Vec3D off = offset.add(new Vec3D(
|
|
170
|
+
(octant & 1) != 0 ? halfSize : 0,
|
|
171
|
+
(octant & 2) != 0 ? halfSize : 0,
|
|
172
|
+
(octant & 4) != 0 ? halfSize : 0));
|
|
173
|
+
children[octant] = new PointOctree(this, off,
|
|
174
|
+
halfSize * 0.5f);
|
|
175
|
+
numChildren++;
|
|
176
|
+
}
|
|
177
|
+
return children[octant].addPoint(p);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Applies the given {@link OctreeVisitor} implementation to this node and
|
|
185
|
+
* all of its children.
|
|
186
|
+
* @param visitor
|
|
187
|
+
*/
|
|
188
|
+
public void applyVisitor(OctreeVisitor visitor) {
|
|
189
|
+
visitor.visitNode(this);
|
|
190
|
+
if (numChildren > 0) {
|
|
191
|
+
for (PointOctree c : children) {
|
|
192
|
+
if (c != null) {
|
|
193
|
+
c.applyVisitor(visitor);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
@Override
|
|
200
|
+
public boolean containsPoint(ReadonlyVec3D p) {
|
|
201
|
+
return p.isInAABB(this);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
*
|
|
206
|
+
*/
|
|
207
|
+
public void empty() {
|
|
208
|
+
numChildren = 0;
|
|
209
|
+
children = null;
|
|
210
|
+
points = null;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @return a copy of the child nodes array
|
|
215
|
+
*/
|
|
216
|
+
public PointOctree[] getChildren() {
|
|
217
|
+
if (children != null) {
|
|
218
|
+
PointOctree[] clones = new PointOctree[8];
|
|
219
|
+
System.arraycopy(children, 0, clones, 0, 8);
|
|
220
|
+
return clones;
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* @return the depth
|
|
227
|
+
*/
|
|
228
|
+
public int getDepth() {
|
|
229
|
+
return depth;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Finds the leaf node which spatially relates to the given point
|
|
234
|
+
*
|
|
235
|
+
* @param p
|
|
236
|
+
* point to check
|
|
237
|
+
* @return leaf node or null if point is outside the tree dimensions
|
|
238
|
+
*/
|
|
239
|
+
public PointOctree getLeafForPoint(ReadonlyVec3D p) {
|
|
240
|
+
// if not a leaf node...
|
|
241
|
+
if (p.isInAABB(this)) {
|
|
242
|
+
if (numChildren > 0) {
|
|
243
|
+
int octant = getOctantID(p.sub(offset));
|
|
244
|
+
if (children[octant] != null) {
|
|
245
|
+
return children[octant].getLeafForPoint(p);
|
|
246
|
+
}
|
|
247
|
+
} else if (points != null) {
|
|
248
|
+
return this;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Returns the minimum size of nodes (in world units). This value acts as
|
|
256
|
+
* tree recursion limit since nodes smaller than this size are not
|
|
257
|
+
* subdivided further. Leaf node are always smaller or equal to this size.
|
|
258
|
+
*
|
|
259
|
+
* @return the minimum size of tree nodes
|
|
260
|
+
*/
|
|
261
|
+
public float getMinNodeSize() {
|
|
262
|
+
return minNodeSize;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
*
|
|
267
|
+
* @return
|
|
268
|
+
*/
|
|
269
|
+
public float getNodeSize() {
|
|
270
|
+
return size;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* @return the number of child nodes (max. 8)
|
|
275
|
+
*/
|
|
276
|
+
public int getNumChildren() {
|
|
277
|
+
return numChildren;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Computes the local child octant/cube index for the given point
|
|
282
|
+
*
|
|
283
|
+
* @param plocal
|
|
284
|
+
* point in the node-local coordinate system
|
|
285
|
+
* @return octant index
|
|
286
|
+
*/
|
|
287
|
+
protected final int getOctantID(Vec3D plocal) {
|
|
288
|
+
return (plocal.x >= halfSize ? 1 : 0) + (plocal.y >= halfSize ? 2 : 0)
|
|
289
|
+
+ (plocal.z >= halfSize ? 4 : 0);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* @return the offset
|
|
294
|
+
*/
|
|
295
|
+
public ReadonlyVec3D getOffset() {
|
|
296
|
+
return offset;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* @return the parent
|
|
301
|
+
*/
|
|
302
|
+
public PointOctree getParent() {
|
|
303
|
+
return parent;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* @return the points
|
|
308
|
+
*/
|
|
309
|
+
public List<Vec3D> getPoints() {
|
|
310
|
+
List<Vec3D> results = null;
|
|
311
|
+
if (points != null) {
|
|
312
|
+
results = new ArrayList<>(points);
|
|
313
|
+
} else if (numChildren > 0) {
|
|
314
|
+
for (int i = 0; i < 8; i++) {
|
|
315
|
+
if (children[i] != null) {
|
|
316
|
+
List<Vec3D> childPoints = children[i].getPoints();
|
|
317
|
+
if (childPoints != null) {
|
|
318
|
+
if (results == null) {
|
|
319
|
+
results = new ArrayList<>();
|
|
320
|
+
}
|
|
321
|
+
results.addAll(childPoints);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return results;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Selects all stored points within the given axis-aligned bounding box.
|
|
331
|
+
*
|
|
332
|
+
* @param b
|
|
333
|
+
* AABB
|
|
334
|
+
* @return all points with the box volume
|
|
335
|
+
*/
|
|
336
|
+
public List<Vec3D> getPointsWithinBox(AABB b) {
|
|
337
|
+
ArrayList<Vec3D> results = null;
|
|
338
|
+
if (this.intersectsBox(b)) {
|
|
339
|
+
if (points != null) {
|
|
340
|
+
for (Vec3D q : points) {
|
|
341
|
+
if (q.isInAABB(b)) {
|
|
342
|
+
if (results == null) {
|
|
343
|
+
results = new ArrayList<>();
|
|
344
|
+
}
|
|
345
|
+
results.add(q);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
} else if (numChildren > 0) {
|
|
349
|
+
for (int i = 0; i < 8; i++) {
|
|
350
|
+
if (children[i] != null) {
|
|
351
|
+
List<Vec3D> pts = children[i].getPointsWithinBox(b);
|
|
352
|
+
if (pts != null) {
|
|
353
|
+
if (results == null) {
|
|
354
|
+
results = new ArrayList<>();
|
|
355
|
+
}
|
|
356
|
+
results.addAll(pts);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return results;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Selects all stored points within the given sphere volume
|
|
367
|
+
*
|
|
368
|
+
* @param s
|
|
369
|
+
* sphere
|
|
370
|
+
* @return selected points
|
|
371
|
+
*/
|
|
372
|
+
public List<Vec3D> getPointsWithinSphere(Sphere s) {
|
|
373
|
+
ArrayList<Vec3D> results = null;
|
|
374
|
+
if (this.intersectsSphere(s)) {
|
|
375
|
+
if (points != null) {
|
|
376
|
+
for (Vec3D q : points) {
|
|
377
|
+
if (s.containsPoint(q)) {
|
|
378
|
+
if (results == null) {
|
|
379
|
+
results = new ArrayList<>();
|
|
380
|
+
}
|
|
381
|
+
results.add(q);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
} else if (numChildren > 0) {
|
|
385
|
+
for (int i = 0; i < 8; i++) {
|
|
386
|
+
if (children[i] != null) {
|
|
387
|
+
List<Vec3D> pts = children[i]
|
|
388
|
+
.getPointsWithinSphere(s);
|
|
389
|
+
if (pts != null) {
|
|
390
|
+
if (results == null) {
|
|
391
|
+
results = new ArrayList<>();
|
|
392
|
+
}
|
|
393
|
+
results.addAll(pts);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return results;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Selects all stored points within the given sphere volume
|
|
404
|
+
*
|
|
405
|
+
* @param sphereOrigin
|
|
406
|
+
* @param clipRadius
|
|
407
|
+
* @return selected points
|
|
408
|
+
*/
|
|
409
|
+
public List<Vec3D> getPointsWithinSphere(Vec3D sphereOrigin,
|
|
410
|
+
float clipRadius) {
|
|
411
|
+
return getPointsWithinSphere(new Sphere(sphereOrigin, clipRadius));
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* @return the size
|
|
416
|
+
*/
|
|
417
|
+
public float getSize() {
|
|
418
|
+
return size;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
private void reduceBranch() {
|
|
422
|
+
if (points != null && points.isEmpty()) {
|
|
423
|
+
points = null;
|
|
424
|
+
}
|
|
425
|
+
if (numChildren > 0) {
|
|
426
|
+
for (int i = 0; i < 8; i++) {
|
|
427
|
+
if (children[i] != null && children[i].points == null) {
|
|
428
|
+
children[i] = null;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (parent != null) {
|
|
433
|
+
parent.reduceBranch();
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Removes a point from the tree and (optionally) tries to release memory by
|
|
439
|
+
* reducing now empty sub-branches.
|
|
440
|
+
*
|
|
441
|
+
* @param p
|
|
442
|
+
* point to delete
|
|
443
|
+
* @return true, if the point was found & removed
|
|
444
|
+
*/
|
|
445
|
+
public boolean remove(Vec3D p) {
|
|
446
|
+
boolean found = false;
|
|
447
|
+
PointOctree leaf = getLeafForPoint(p);
|
|
448
|
+
if (leaf != null) {
|
|
449
|
+
if (leaf.points.remove(p)) {
|
|
450
|
+
found = true;
|
|
451
|
+
if (isAutoReducing && leaf.points.isEmpty()) {
|
|
452
|
+
leaf.reduceBranch();
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return found;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
*
|
|
461
|
+
* @param points
|
|
462
|
+
*/
|
|
463
|
+
public void removeAll(Collection<Vec3D> points) {
|
|
464
|
+
for (Vec3D p : points) {
|
|
465
|
+
remove(p);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* @param minNodeSize
|
|
471
|
+
*/
|
|
472
|
+
public void setMinNodeSize(float minNodeSize) {
|
|
473
|
+
this.minNodeSize = minNodeSize * 0.5f;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Enables/disables auto reduction of branches after points have been
|
|
478
|
+
* deleted from the tree. Turned off by default.
|
|
479
|
+
*
|
|
480
|
+
* @param state
|
|
481
|
+
* true, to enable feature
|
|
482
|
+
*/
|
|
483
|
+
public void setTreeAutoReduction(boolean state) {
|
|
484
|
+
isAutoReducing = state;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/*
|
|
488
|
+
* (non-Javadoc)
|
|
489
|
+
*
|
|
490
|
+
* @see toxi.geom.AABB#toString()
|
|
491
|
+
*/
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
*
|
|
495
|
+
* @return
|
|
496
|
+
*/
|
|
497
|
+
|
|
498
|
+
@Override
|
|
499
|
+
public String toString() {
|
|
500
|
+
return "<octree> offset: " + super.toString() + " size: " + size;
|
|
501
|
+
}
|
|
502
|
+
}
|