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,58 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* $RCSfile$
|
|
3
|
+
*
|
|
4
|
+
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
|
|
5
|
+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
6
|
+
*
|
|
7
|
+
* This code is free software; you can redistribute it and/or modify it
|
|
8
|
+
* under the terms of the GNU General Public License version 2 only, as
|
|
9
|
+
* published by the Free Software Foundation. Sun designates this
|
|
10
|
+
* particular file as subject to the "Classpath" exception as provided
|
|
11
|
+
* by Sun in the LICENSE file that accompanied this code.
|
|
12
|
+
*
|
|
13
|
+
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
14
|
+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
15
|
+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
16
|
+
* version 2 for more details (a copy is included in the LICENSE file that
|
|
17
|
+
* accompanied this code).
|
|
18
|
+
*
|
|
19
|
+
* You should have received a copy of the GNU General Public License version
|
|
20
|
+
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
21
|
+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
22
|
+
*
|
|
23
|
+
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
24
|
+
* CA 95054 USA or visit www.sun.com if you need additional information or
|
|
25
|
+
* have any questions.
|
|
26
|
+
*
|
|
27
|
+
* $Revision: 127 $
|
|
28
|
+
* $Date: 2008-02-28 20:18:51 +0000 (Thu, 28 Feb 2008) $
|
|
29
|
+
* $State$
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
package toxi.geom;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Indicates that an operation cannot be completed properly because of a
|
|
36
|
+
* mismatch in the sizes of object attributes.
|
|
37
|
+
*/
|
|
38
|
+
public class MatrixSizeException extends RuntimeException {
|
|
39
|
+
|
|
40
|
+
private static final long serialVersionUID = 1L;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Create the exception object with default values.
|
|
44
|
+
*/
|
|
45
|
+
public MatrixSizeException() {
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Create the exception object that outputs a message.
|
|
50
|
+
*
|
|
51
|
+
* @param str
|
|
52
|
+
* the message string to be output.
|
|
53
|
+
*/
|
|
54
|
+
public MatrixSizeException(String str) {
|
|
55
|
+
super(str);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* __ .__ .__ ._____.
|
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
|
7
|
+
* \/ \/ \/ \/
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
10
|
+
*
|
|
11
|
+
* This library is free software; you can redistribute it and/or
|
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
* License as published by the Free Software Foundation; either
|
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
*
|
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
17
|
+
*
|
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21
|
+
* Lesser General Public License for more details.
|
|
22
|
+
*
|
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
24
|
+
* License along with this library; if not, write to the Free Software
|
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
package toxi.geom;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* This interface is the core part of the visitor pattern application for
|
|
32
|
+
* {@link PointOctree}s. It can be used to apply a procedure to all tree nodes
|
|
33
|
+
* when passed to {@link PointOctree#applyVisitor(OctreeVisitor)}.
|
|
34
|
+
*/
|
|
35
|
+
public interface OctreeVisitor {
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Applies the procedure defined by an implementation of this interface to
|
|
39
|
+
* the given tree node.
|
|
40
|
+
*
|
|
41
|
+
* @param node
|
|
42
|
+
*/
|
|
43
|
+
void visitNode(PointOctree node);
|
|
44
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
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 toxi.geom.Vec3D.Axis;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* This class defines an origin and set of axis vectors for a 3D cartesian
|
|
34
|
+
* coordinate system.
|
|
35
|
+
*/
|
|
36
|
+
public class Origin3D {
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
public ReadonlyVec3D origin;
|
|
42
|
+
public ReadonlyVec3D xAxis,
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
*/
|
|
47
|
+
yAxis,
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
*/
|
|
52
|
+
zAxis;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Creates a new origin at the world origin using the standard XYZ axes
|
|
56
|
+
*/
|
|
57
|
+
public Origin3D() {
|
|
58
|
+
this(new Vec3D());
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
*
|
|
63
|
+
* @param x
|
|
64
|
+
* @param y
|
|
65
|
+
* @param z
|
|
66
|
+
*/
|
|
67
|
+
public Origin3D(float x, float y, float z) {
|
|
68
|
+
this(new Vec3D(x, y, z));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
* @param mat
|
|
74
|
+
*/
|
|
75
|
+
public Origin3D(Matrix4x4 mat) {
|
|
76
|
+
this.origin = mat.applyToSelf(new Vec3D());
|
|
77
|
+
this.xAxis = mat.applyTo(Vec3D.X_AXIS).subSelf(origin).normalize();
|
|
78
|
+
this.yAxis = mat.applyTo(Vec3D.Y_AXIS).subSelf(origin).normalize();
|
|
79
|
+
zAxis = xAxis.crossInto(yAxis, new Vec3D());
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new origin at the given origin using the standard XYZ axes
|
|
84
|
+
*
|
|
85
|
+
* @param o
|
|
86
|
+
* origin
|
|
87
|
+
*/
|
|
88
|
+
public Origin3D(Vec3D o) {
|
|
89
|
+
origin = o;
|
|
90
|
+
xAxis = Vec3D.X_AXIS;
|
|
91
|
+
yAxis = Vec3D.Y_AXIS;
|
|
92
|
+
zAxis = Vec3D.Z_AXIS;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Attempts to create a cartesian coordinate system with the given point as
|
|
97
|
+
* its origin and the direction as its Z-axis. In cases when two of the
|
|
98
|
+
* direction vector components are equal, the constructor will throw an
|
|
99
|
+
* {@link IllegalArgumentException}.
|
|
100
|
+
*
|
|
101
|
+
* @param o
|
|
102
|
+
* origin of the coordinate system
|
|
103
|
+
* @param dir
|
|
104
|
+
* z-axis
|
|
105
|
+
*/
|
|
106
|
+
public Origin3D(Vec3D o, Vec3D dir) {
|
|
107
|
+
this.origin = o;
|
|
108
|
+
this.zAxis = dir.getNormalized();
|
|
109
|
+
Vec3D av = null;
|
|
110
|
+
Axis a = zAxis.getClosestAxis();
|
|
111
|
+
if (a == Vec3D.Axis.X) {
|
|
112
|
+
av = Vec3D.Axis.Z.getVector().getInverted();
|
|
113
|
+
} else if (a == Vec3D.Axis.Y) {
|
|
114
|
+
av = Vec3D.Axis.Z.getVector().getInverted();
|
|
115
|
+
} else if (a == Vec3D.Axis.Z) {
|
|
116
|
+
av = Vec3D.Axis.X.getVector().getInverted();
|
|
117
|
+
}
|
|
118
|
+
if (av == null) {
|
|
119
|
+
throw new IllegalArgumentException(
|
|
120
|
+
"can't create a coordinate system for direction: " + dir);
|
|
121
|
+
}
|
|
122
|
+
xAxis = av.cross(dir).normalize();
|
|
123
|
+
yAxis = xAxis.cross(zAxis).normalize();
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @param o
|
|
129
|
+
* origin of the coordinate system
|
|
130
|
+
* @param x
|
|
131
|
+
* x-direction of the coordinate system
|
|
132
|
+
* @param y
|
|
133
|
+
* y-direction of the coordinate system
|
|
134
|
+
* @throws IllegalArgumentException
|
|
135
|
+
* if x and y vectors are not orthogonal
|
|
136
|
+
*/
|
|
137
|
+
public Origin3D(Vec3D o, Vec3D x, Vec3D y) throws IllegalArgumentException {
|
|
138
|
+
origin = o;
|
|
139
|
+
xAxis = x;
|
|
140
|
+
yAxis = y;
|
|
141
|
+
xAxis.getNormalized();
|
|
142
|
+
yAxis.getNormalized();
|
|
143
|
+
if (Math.abs(xAxis.dot(yAxis)) > 0.0001) {
|
|
144
|
+
throw new IllegalArgumentException("Axis vectors aren't orthogonal");
|
|
145
|
+
}
|
|
146
|
+
zAxis = xAxis.crossInto(yAxis, new Vec3D());
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* __ .__ .__ ._____.
|
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
|
7
|
+
* \/ \/ \/ \/
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
10
|
+
*
|
|
11
|
+
* This library is free software; you can redistribute it and/or
|
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
13
|
+
* License as published by the Free Software Foundation; either
|
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
15
|
+
*
|
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
17
|
+
*
|
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21
|
+
* Lesser General Public License for more details.
|
|
22
|
+
*
|
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
24
|
+
* License along with this library; if not, write to the Free Software
|
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
package toxi.geom;
|
|
29
|
+
|
|
30
|
+
import javax.xml.bind.annotation.XmlAccessType;
|
|
31
|
+
import javax.xml.bind.annotation.XmlAccessorType;
|
|
32
|
+
import javax.xml.bind.annotation.XmlElement;
|
|
33
|
+
|
|
34
|
+
import toxi.geom.mesh.Mesh3D;
|
|
35
|
+
import toxi.geom.mesh.TriangleMesh;
|
|
36
|
+
import toxi.math.MathUtils;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Class to describe and work with infinite generic 3D planes. Useful for
|
|
40
|
+
* intersection problems and classifying points.
|
|
41
|
+
*/
|
|
42
|
+
@XmlAccessorType(XmlAccessType.FIELD)
|
|
43
|
+
public class Plane extends Vec3D implements Shape3D {
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Classifier constant for {@link Plane#classifyPoint(ReadonlyVec3D, float)}
|
|
47
|
+
*/
|
|
48
|
+
public enum Classifier {
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
*/
|
|
53
|
+
FRONT,
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
*/
|
|
58
|
+
BACK,
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
*/
|
|
63
|
+
ON_PLANE;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
*
|
|
68
|
+
*/
|
|
69
|
+
public static final Plane XY = new Plane(new Vec3D(), Vec3D.Z_AXIS);
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
*/
|
|
74
|
+
public static final Plane XZ = new Plane(new Vec3D(), Vec3D.Y_AXIS);
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
*
|
|
78
|
+
*/
|
|
79
|
+
public static final Plane YZ = new Plane(new Vec3D(), Vec3D.X_AXIS);
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
*/
|
|
84
|
+
@XmlElement(required = true)
|
|
85
|
+
public Vec3D normal;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
*
|
|
89
|
+
*/
|
|
90
|
+
public Plane() {
|
|
91
|
+
super();
|
|
92
|
+
normal = Vec3D.Y_AXIS.copy();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
*
|
|
97
|
+
* @param origin
|
|
98
|
+
* @param norm
|
|
99
|
+
*/
|
|
100
|
+
public Plane(ReadonlyVec3D origin, ReadonlyVec3D norm) {
|
|
101
|
+
super(origin);
|
|
102
|
+
normal = norm.getNormalized();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
*
|
|
107
|
+
* @param t
|
|
108
|
+
*/
|
|
109
|
+
public Plane(Triangle3D t) {
|
|
110
|
+
this(t.computeCentroid(), t.computeNormal());
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Classifies the relative position of the given point to the plane using
|
|
115
|
+
* the given tolerance.
|
|
116
|
+
*
|
|
117
|
+
* @param p
|
|
118
|
+
* @param tolerance
|
|
119
|
+
* @return One of the 3 classification types: FRONT, BACK, ON_PLANE
|
|
120
|
+
*/
|
|
121
|
+
public Classifier classifyPoint(ReadonlyVec3D p, float tolerance) {
|
|
122
|
+
float d = this.sub(p).normalize().dot(normal);
|
|
123
|
+
if (d < -tolerance) {
|
|
124
|
+
return Classifier.FRONT;
|
|
125
|
+
} else if (d > tolerance) {
|
|
126
|
+
return Classifier.BACK;
|
|
127
|
+
}
|
|
128
|
+
return Classifier.ON_PLANE;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
@Override
|
|
132
|
+
public boolean containsPoint(ReadonlyVec3D p) {
|
|
133
|
+
return classifyPoint(p, MathUtils.EPS) == Classifier.ON_PLANE;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
*
|
|
138
|
+
* @return
|
|
139
|
+
*/
|
|
140
|
+
public float getDCoeff() {
|
|
141
|
+
return this.dot(normal);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Calculates distance from the plane to point P.
|
|
146
|
+
*
|
|
147
|
+
* @param p
|
|
148
|
+
* @return distance
|
|
149
|
+
*/
|
|
150
|
+
public float getDistanceToPoint(Vec3D p) {
|
|
151
|
+
float sn = -normal.dot(p.sub(this));
|
|
152
|
+
float sd = normal.magSquared();
|
|
153
|
+
Vec3D isec = p.add(normal.scale(sn / sd));
|
|
154
|
+
return isec.distanceTo(p);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Calculates the intersection point between plane and ray (line).
|
|
159
|
+
*
|
|
160
|
+
* @param r
|
|
161
|
+
* @return intersection point or null if ray doesn't intersect plane
|
|
162
|
+
*/
|
|
163
|
+
public ReadonlyVec3D getIntersectionWithRay(Ray3D r) {
|
|
164
|
+
float denom = normal.dot(r.getDirection());
|
|
165
|
+
if (denom > MathUtils.EPS) {
|
|
166
|
+
float u = normal.dot(this.sub(r)) / denom;
|
|
167
|
+
return r.getPointAtDistance(u);
|
|
168
|
+
} else {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
*
|
|
175
|
+
* @param p
|
|
176
|
+
* @return
|
|
177
|
+
*/
|
|
178
|
+
public Vec3D getProjectedPoint(Vec3D p) {
|
|
179
|
+
Vec3D dir;
|
|
180
|
+
if (normal.dot(sub(p)) < 0) {
|
|
181
|
+
dir = normal.getInverted();
|
|
182
|
+
} else {
|
|
183
|
+
dir = normal;
|
|
184
|
+
}
|
|
185
|
+
Vec3D proj = new Ray3D(p, dir)
|
|
186
|
+
.getPointAtDistance(getDistanceToPoint(p));
|
|
187
|
+
return proj;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Calculates the distance of the vector to the given plane in the specified
|
|
192
|
+
* direction. A plane is specified by a 3D point and a normal vector
|
|
193
|
+
* perpendicular to the plane. Normalized directional vectors expected (for
|
|
194
|
+
* rayDir and planeNormal).
|
|
195
|
+
*
|
|
196
|
+
* @param ray
|
|
197
|
+
* intersection ray
|
|
198
|
+
* @return distance to plane in world units, -1 if no intersection.
|
|
199
|
+
*/
|
|
200
|
+
public float intersectRayDistance(Ray3D ray) {
|
|
201
|
+
float d = -normal.dot(this);
|
|
202
|
+
float numer = normal.dot(ray) + d;
|
|
203
|
+
float denom = normal.dot(ray.dir);
|
|
204
|
+
|
|
205
|
+
// normal is orthogonal to vector, cant intersect
|
|
206
|
+
if (MathUtils.abs(denom) < MathUtils.EPS) {
|
|
207
|
+
return -1;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return -(numer / denom);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Computes the intersection ray between this plane and the given one. If
|
|
215
|
+
* the planes are parallel or coincident the method returns null. If the
|
|
216
|
+
* planes are intersecting, the returned {@link Ray3D} will start at a point
|
|
217
|
+
* lying on both planes and point along the infinite intersection line
|
|
218
|
+
* between them.
|
|
219
|
+
*
|
|
220
|
+
* Code ported from:
|
|
221
|
+
* http://forums.create.msdn.com/forums/p/39074/234178.aspx#234178
|
|
222
|
+
*
|
|
223
|
+
* @param plane
|
|
224
|
+
* intersection partner
|
|
225
|
+
* @return intersection ray or null
|
|
226
|
+
*/
|
|
227
|
+
public Ray3D intersectsPlane(Plane plane) {
|
|
228
|
+
float d = getDCoeff();
|
|
229
|
+
float d2 = plane.getDCoeff();
|
|
230
|
+
|
|
231
|
+
if (normal.equalsWithTolerance(plane.normal, 0.0001f) || d == d2) {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
float offDiagonal = normal.dot(plane.normal);
|
|
236
|
+
double det = 1.0 / (1 - offDiagonal * offDiagonal);
|
|
237
|
+
double a = (d - d2 * offDiagonal) * det;
|
|
238
|
+
double b = (d2 - d * offDiagonal) * det;
|
|
239
|
+
Vec3D anchor = normal.scale((float) a).addSelf(
|
|
240
|
+
plane.normal.scale((float) b));
|
|
241
|
+
Vec3D dir = normal.cross(plane.normal);
|
|
242
|
+
|
|
243
|
+
return new Ray3D(anchor, dir);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Creates a TriangleMesh representation of the plane as a finite, squared
|
|
248
|
+
* quad of the requested size, centred around the current plane point.
|
|
249
|
+
*
|
|
250
|
+
* @param size
|
|
251
|
+
* desired edge length
|
|
252
|
+
* @return mesh
|
|
253
|
+
*/
|
|
254
|
+
public Mesh3D toMesh(float size) {
|
|
255
|
+
return toMesh(null, size);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
*
|
|
260
|
+
* @param mesh
|
|
261
|
+
* @param size
|
|
262
|
+
* @return
|
|
263
|
+
*/
|
|
264
|
+
public Mesh3D toMesh(Mesh3D mesh, float size) {
|
|
265
|
+
if (mesh == null) {
|
|
266
|
+
mesh = new TriangleMesh("plane", 4, 2);
|
|
267
|
+
}
|
|
268
|
+
ReadonlyVec3D p = equalsWithTolerance(Vec3D.ZERO, 0.01f) ? add(0.01f,
|
|
269
|
+
0.01f, 0.01f) : this;
|
|
270
|
+
size *= 0.5f;
|
|
271
|
+
Vec3D n = p.cross(normal).normalizeTo(size);
|
|
272
|
+
Vec3D m = n.cross(normal).normalizeTo(size);
|
|
273
|
+
Vec3D a = this.add(n).addSelf(m);
|
|
274
|
+
Vec3D b = this.add(n).subSelf(m);
|
|
275
|
+
Vec3D c = this.sub(n).subSelf(m);
|
|
276
|
+
Vec3D d = this.sub(n).addSelf(m);
|
|
277
|
+
mesh.addFace(a, d, b, null, null, null, null);
|
|
278
|
+
mesh.addFace(b, d, c, null, null, null, null);
|
|
279
|
+
return mesh;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
*
|
|
284
|
+
* @return
|
|
285
|
+
*/
|
|
286
|
+
@Override
|
|
287
|
+
public String toString() {
|
|
288
|
+
StringBuilder sb = new StringBuilder();
|
|
289
|
+
sb.append("origin: ").append(super.toString()).append(" norm: ")
|
|
290
|
+
.append(normal.toString());
|
|
291
|
+
return sb.toString();
|
|
292
|
+
}
|
|
293
|
+
}
|