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,448 @@
|
|
|
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.physics2d;
|
|
29
|
+
|
|
30
|
+
import java.util.ArrayList;
|
|
31
|
+
import java.util.Iterator;
|
|
32
|
+
import java.util.List;
|
|
33
|
+
|
|
34
|
+
import toxi.geom.Rect;
|
|
35
|
+
import toxi.geom.SpatialIndex;
|
|
36
|
+
import toxi.geom.Vec2D;
|
|
37
|
+
import toxi.physics2d.behaviors.GravityBehavior2D;
|
|
38
|
+
import toxi.physics2d.behaviors.ParticleBehavior2D;
|
|
39
|
+
import toxi.physics2d.constraints.ParticleConstraint2D;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 3D particle physics engine using Verlet integration based on:
|
|
43
|
+
* http://en.wikipedia.org/wiki/Verlet_integration
|
|
44
|
+
* http://www.teknikus.dk/tj/gdc2001.htm
|
|
45
|
+
*
|
|
46
|
+
*/
|
|
47
|
+
public class VerletPhysics2D {
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
* @param c
|
|
52
|
+
* @param list
|
|
53
|
+
*/
|
|
54
|
+
public static void addConstraintToAll(ParticleConstraint2D c,
|
|
55
|
+
List<VerletParticle2D> list) {
|
|
56
|
+
for (VerletParticle2D p : list) {
|
|
57
|
+
p.addConstraint(c);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
*
|
|
63
|
+
* @param c
|
|
64
|
+
* @param list
|
|
65
|
+
*/
|
|
66
|
+
public static void removeConstraintFromAll(ParticleConstraint2D c,
|
|
67
|
+
List<VerletParticle2D> list) {
|
|
68
|
+
for (VerletParticle2D p : list) {
|
|
69
|
+
p.removeConstraint(c);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* List of particles
|
|
75
|
+
*/
|
|
76
|
+
public ArrayList<VerletParticle2D> particles;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* List of spring/stick connectors
|
|
80
|
+
*/
|
|
81
|
+
public ArrayList<VerletSpring2D> springs;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Default time step = 1.0
|
|
85
|
+
*/
|
|
86
|
+
protected float timeStep;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Default iterations for verlet solver = 50
|
|
90
|
+
*/
|
|
91
|
+
protected int numIterations;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Optional bounding rect to constrain particles too
|
|
95
|
+
*/
|
|
96
|
+
protected Rect worldBounds;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
*
|
|
100
|
+
*/
|
|
101
|
+
public final List<ParticleBehavior2D> behaviors = new ArrayList<>(
|
|
102
|
+
1);
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
*
|
|
106
|
+
*/
|
|
107
|
+
public final List<ParticleConstraint2D> constraints = new ArrayList<>(
|
|
108
|
+
1);
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
*
|
|
112
|
+
*/
|
|
113
|
+
protected float drag;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
*
|
|
117
|
+
*/
|
|
118
|
+
protected SpatialIndex<Vec2D> index;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Initializes a Verlet engine instance using the default values.
|
|
122
|
+
*/
|
|
123
|
+
public VerletPhysics2D() {
|
|
124
|
+
this(null, 50, 0, 1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Initializes an Verlet engine instance with the passed in configuration.
|
|
129
|
+
*
|
|
130
|
+
* @param gravity
|
|
131
|
+
* 3D gravity vector
|
|
132
|
+
* @param numIterations
|
|
133
|
+
* iterations per time step for verlet solver
|
|
134
|
+
* @param drag
|
|
135
|
+
* drag value 0...1
|
|
136
|
+
* @param timeStep
|
|
137
|
+
* time step for calculating forces
|
|
138
|
+
*/
|
|
139
|
+
public VerletPhysics2D(Vec2D gravity, int numIterations, float drag,
|
|
140
|
+
float timeStep) {
|
|
141
|
+
particles = new ArrayList<>();
|
|
142
|
+
springs = new ArrayList<>();
|
|
143
|
+
this.numIterations = numIterations;
|
|
144
|
+
this.timeStep = timeStep;
|
|
145
|
+
setDrag(drag);
|
|
146
|
+
if (gravity != null) {
|
|
147
|
+
addBehavior(new GravityBehavior2D(gravity));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
*
|
|
153
|
+
* @param behavior
|
|
154
|
+
*/
|
|
155
|
+
public final void addBehavior(ParticleBehavior2D behavior) {
|
|
156
|
+
behavior.configure(timeStep);
|
|
157
|
+
behaviors.add(behavior);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
*
|
|
162
|
+
* @param constraint
|
|
163
|
+
*/
|
|
164
|
+
public void addConstraint(ParticleConstraint2D constraint) {
|
|
165
|
+
constraints.add(constraint);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Adds a particle to the list
|
|
170
|
+
*
|
|
171
|
+
* @param p
|
|
172
|
+
* @return itself
|
|
173
|
+
*/
|
|
174
|
+
public VerletPhysics2D addParticle(VerletParticle2D p) {
|
|
175
|
+
particles.add(p);
|
|
176
|
+
return this;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Adds a spring connector
|
|
181
|
+
*
|
|
182
|
+
* @param s
|
|
183
|
+
* @return itself
|
|
184
|
+
*/
|
|
185
|
+
public VerletPhysics2D addSpring(VerletSpring2D s) {
|
|
186
|
+
if (getSpring(s.a, s.b) == null) {
|
|
187
|
+
springs.add(s);
|
|
188
|
+
}
|
|
189
|
+
return this;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Applies all global constraints and constrains all particle positions to
|
|
194
|
+
* the world bounding rect set.
|
|
195
|
+
*/
|
|
196
|
+
protected void applyConstaints() {
|
|
197
|
+
boolean hasGlobalConstraints = constraints.size() > 0;
|
|
198
|
+
for (VerletParticle2D p : particles) {
|
|
199
|
+
if (hasGlobalConstraints) {
|
|
200
|
+
for (ParticleConstraint2D c : constraints) {
|
|
201
|
+
c.apply(p);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (p.bounds != null) {
|
|
205
|
+
p.constrain(p.bounds);
|
|
206
|
+
}
|
|
207
|
+
if (worldBounds != null) {
|
|
208
|
+
p.constrain(worldBounds);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
*
|
|
215
|
+
* @return
|
|
216
|
+
*/
|
|
217
|
+
public VerletPhysics2D clear() {
|
|
218
|
+
behaviors.clear();
|
|
219
|
+
constraints.clear();
|
|
220
|
+
particles.clear();
|
|
221
|
+
springs.clear();
|
|
222
|
+
return this;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
*
|
|
227
|
+
* @return
|
|
228
|
+
*/
|
|
229
|
+
public Rect getCurrentBounds() {
|
|
230
|
+
Vec2D min = new Vec2D(Float.MAX_VALUE, Float.MAX_VALUE);
|
|
231
|
+
Vec2D max = new Vec2D(Float.MIN_VALUE, Float.MIN_VALUE);
|
|
232
|
+
for (VerletParticle2D p : particles) {
|
|
233
|
+
min.minSelf(p);
|
|
234
|
+
max.maxSelf(p);
|
|
235
|
+
}
|
|
236
|
+
return new Rect(min, max);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
*
|
|
241
|
+
* @return
|
|
242
|
+
*/
|
|
243
|
+
public float getDrag() {
|
|
244
|
+
return 1f - drag;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @return the index
|
|
249
|
+
*/
|
|
250
|
+
public SpatialIndex<Vec2D> getIndex() {
|
|
251
|
+
return index;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* @return the numIterations
|
|
256
|
+
*/
|
|
257
|
+
public int getNumIterations() {
|
|
258
|
+
return numIterations;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Attempts to find the spring element between the 2 particles supplied
|
|
263
|
+
*
|
|
264
|
+
* @param a
|
|
265
|
+
* particle 1
|
|
266
|
+
* @param b
|
|
267
|
+
* particle 2
|
|
268
|
+
* @return spring instance, or null if not found
|
|
269
|
+
*/
|
|
270
|
+
public VerletSpring2D getSpring(Vec2D a, Vec2D b) {
|
|
271
|
+
for (VerletSpring2D s : springs) {
|
|
272
|
+
if ((s.a == a && s.b == b) || (s.a == b && s.b == a)) {
|
|
273
|
+
return s;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* @return the timeStep
|
|
281
|
+
*/
|
|
282
|
+
public float getTimeStep() {
|
|
283
|
+
return timeStep;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* @return the worldBounds
|
|
288
|
+
*/
|
|
289
|
+
public Rect getWorldBounds() {
|
|
290
|
+
return worldBounds;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
*
|
|
295
|
+
* @param c
|
|
296
|
+
* @return
|
|
297
|
+
*/
|
|
298
|
+
public boolean removeBehavior(ParticleBehavior2D c) {
|
|
299
|
+
return behaviors.remove(c);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
*
|
|
304
|
+
* @param c
|
|
305
|
+
* @return
|
|
306
|
+
*/
|
|
307
|
+
public boolean removeConstraint(ParticleConstraint2D c) {
|
|
308
|
+
return constraints.remove(c);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Removes a particle from the simulation.
|
|
313
|
+
*
|
|
314
|
+
* @param p
|
|
315
|
+
* particle to remove
|
|
316
|
+
* @return true, if removed successfully
|
|
317
|
+
*/
|
|
318
|
+
public boolean removeParticle(VerletParticle2D p) {
|
|
319
|
+
return particles.remove(p);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Removes a spring connector from the simulation instance.
|
|
324
|
+
*
|
|
325
|
+
* @param s
|
|
326
|
+
* spring to remove
|
|
327
|
+
* @return true, if the spring has been removed
|
|
328
|
+
*/
|
|
329
|
+
public boolean removeSpring(VerletSpring2D s) {
|
|
330
|
+
return springs.remove(s);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Removes a spring connector and its both end point particles from the
|
|
335
|
+
* simulation
|
|
336
|
+
*
|
|
337
|
+
* @param s
|
|
338
|
+
* spring to remove
|
|
339
|
+
* @return true, only if spring AND particles have been removed successfully
|
|
340
|
+
*/
|
|
341
|
+
public boolean removeSpringElements(VerletSpring2D s) {
|
|
342
|
+
if (removeSpring(s)) {
|
|
343
|
+
return (removeParticle(s.a) && removeParticle(s.b));
|
|
344
|
+
}
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
*
|
|
350
|
+
* @param drag
|
|
351
|
+
*/
|
|
352
|
+
public final void setDrag(float drag) {
|
|
353
|
+
this.drag = 1f - drag;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* @param index
|
|
358
|
+
* the index to set
|
|
359
|
+
*/
|
|
360
|
+
public void setIndex(SpatialIndex<Vec2D> index) {
|
|
361
|
+
this.index = index;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* @param numIterations
|
|
366
|
+
* the numIterations to set
|
|
367
|
+
*/
|
|
368
|
+
public void setNumIterations(int numIterations) {
|
|
369
|
+
this.numIterations = numIterations;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* @param timeStep
|
|
374
|
+
* the timeStep to set
|
|
375
|
+
*/
|
|
376
|
+
public void setTimeStep(float timeStep) {
|
|
377
|
+
this.timeStep = timeStep;
|
|
378
|
+
for (ParticleBehavior2D b : behaviors) {
|
|
379
|
+
b.configure(timeStep);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Sets bounding box
|
|
385
|
+
*
|
|
386
|
+
* @param world
|
|
387
|
+
* @return itself
|
|
388
|
+
*/
|
|
389
|
+
public VerletPhysics2D setWorldBounds(Rect world) {
|
|
390
|
+
worldBounds = world;
|
|
391
|
+
return this;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Progresses the physics simulation by 1 time step and updates all forces
|
|
396
|
+
* and particle positions accordingly
|
|
397
|
+
*
|
|
398
|
+
* @return itself
|
|
399
|
+
*/
|
|
400
|
+
public VerletPhysics2D update() {
|
|
401
|
+
updateParticles();
|
|
402
|
+
updateSprings();
|
|
403
|
+
applyConstaints();
|
|
404
|
+
updateIndex();
|
|
405
|
+
return this;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
private void updateIndex() {
|
|
409
|
+
if (index != null) {
|
|
410
|
+
index.clear();
|
|
411
|
+
for (VerletParticle2D p : particles) {
|
|
412
|
+
index.index(p);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Updates all particle positions
|
|
419
|
+
*/
|
|
420
|
+
protected void updateParticles() {
|
|
421
|
+
for (ParticleBehavior2D b : behaviors) {
|
|
422
|
+
if (index != null && b.supportsSpatialIndex()) {
|
|
423
|
+
b.applyWithIndex(index);
|
|
424
|
+
} else {
|
|
425
|
+
for (VerletParticle2D p : particles) {
|
|
426
|
+
b.apply(p);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
for (VerletParticle2D p : particles) {
|
|
431
|
+
p.scaleVelocity(drag);
|
|
432
|
+
p.update();
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Updates all spring connections based on new particle positions
|
|
438
|
+
*/
|
|
439
|
+
protected void updateSprings() {
|
|
440
|
+
if (springs.size() > 0) {
|
|
441
|
+
for (int i = numIterations; i > 0; i--) {
|
|
442
|
+
for (VerletSpring2D s : springs) {
|
|
443
|
+
s.update(i == 1);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
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.physics2d;
|
|
29
|
+
|
|
30
|
+
import toxi.geom.Vec2D;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* <p>
|
|
34
|
+
* A spring class connecting two VerletParticles in space. Based on the
|
|
35
|
+
* configuration of the spring instance and that of the physics engine, the
|
|
36
|
+
* behaviour of the spring can vary between springy and stiff/stick like.
|
|
37
|
+
* </p>
|
|
38
|
+
*
|
|
39
|
+
* <p>
|
|
40
|
+
* The simulation takes particle weights into account and can be configured to
|
|
41
|
+
* lock either particle in space in order to force the other one to move. This
|
|
42
|
+
* is sometimes handy for resolving collisions (currently outside the scope of
|
|
43
|
+
* this library).
|
|
44
|
+
* </p>
|
|
45
|
+
*
|
|
46
|
+
* @see toxi.physics3d.VerletPhysics3D
|
|
47
|
+
*/
|
|
48
|
+
public class VerletSpring2D {
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
*/
|
|
53
|
+
protected static final float EPS = 1e-6f;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Spring end points / particles
|
|
57
|
+
*/
|
|
58
|
+
public VerletParticle2D a, b;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Spring rest length to which it always wants to return too
|
|
62
|
+
*/
|
|
63
|
+
protected float restLength, restLengthSquared;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Spring strength, possible value range depends on engine configuration
|
|
67
|
+
* (time step, drag)
|
|
68
|
+
*/
|
|
69
|
+
protected float strength;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Flag, if either particle is locked in space (only within the scope of
|
|
73
|
+
* this spring)
|
|
74
|
+
*/
|
|
75
|
+
protected boolean isALocked, isBLocked;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @param a
|
|
79
|
+
* 1st particle
|
|
80
|
+
* @param b
|
|
81
|
+
* 2nd particle
|
|
82
|
+
* @param len
|
|
83
|
+
* desired rest length
|
|
84
|
+
* @param str
|
|
85
|
+
* spring strength
|
|
86
|
+
*/
|
|
87
|
+
public VerletSpring2D(VerletParticle2D a, VerletParticle2D b, float len,
|
|
88
|
+
float str) {
|
|
89
|
+
this.a = a;
|
|
90
|
+
this.b = b;
|
|
91
|
+
restLength = len;
|
|
92
|
+
strength = str;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
*
|
|
97
|
+
* @return
|
|
98
|
+
*/
|
|
99
|
+
public float getRestLength() {
|
|
100
|
+
return restLength;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
*
|
|
105
|
+
* @return
|
|
106
|
+
*/
|
|
107
|
+
public float getStrength() {
|
|
108
|
+
return strength;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* (Un)Locks the 1st end point of the spring. <b>NOTE: this acts purely
|
|
113
|
+
* within the scope of this spring instance and does NOT call
|
|
114
|
+
* {@link VerletParticle2D#lock()}</b>
|
|
115
|
+
*
|
|
116
|
+
* @param s
|
|
117
|
+
* @return itself
|
|
118
|
+
*/
|
|
119
|
+
public VerletSpring2D lockA(boolean s) {
|
|
120
|
+
isALocked = s;
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* (Un)Locks the 2nd end point of the spring
|
|
126
|
+
*
|
|
127
|
+
* @param s
|
|
128
|
+
* @return itself
|
|
129
|
+
*/
|
|
130
|
+
|
|
131
|
+
public VerletSpring2D lockB(boolean s) {
|
|
132
|
+
isBLocked = s;
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
*
|
|
138
|
+
* @param len
|
|
139
|
+
* @return
|
|
140
|
+
*/
|
|
141
|
+
public VerletSpring2D setRestLength(float len) {
|
|
142
|
+
restLength = len;
|
|
143
|
+
restLengthSquared = len * len;
|
|
144
|
+
return this;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
*
|
|
149
|
+
* @param strength
|
|
150
|
+
* @return
|
|
151
|
+
*/
|
|
152
|
+
public VerletSpring2D setStrength(float strength) {
|
|
153
|
+
this.strength = strength;
|
|
154
|
+
return this;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Updates both particle positions (if not locked) based on their current
|
|
159
|
+
* distance, weight and spring configuration *
|
|
160
|
+
* @param applyConstraints
|
|
161
|
+
*/
|
|
162
|
+
protected void update(boolean applyConstraints) {
|
|
163
|
+
Vec2D delta = b.sub(a);
|
|
164
|
+
// add minute offset to avoid div-by-zero errors
|
|
165
|
+
float dist = delta.magnitude() + EPS;
|
|
166
|
+
float normDistStrength = (dist - restLength)
|
|
167
|
+
/ (dist * (a.invWeight + b.invWeight)) * strength;
|
|
168
|
+
if (!a.isLocked && !isALocked) {
|
|
169
|
+
a.addSelf(delta.scale(normDistStrength * a.invWeight));
|
|
170
|
+
if (applyConstraints) {
|
|
171
|
+
a.applyConstraints();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (!b.isLocked && !isBLocked) {
|
|
175
|
+
b.addSelf(delta.scale(-normDistStrength * b.invWeight));
|
|
176
|
+
if (applyConstraints) {
|
|
177
|
+
b.applyConstraints();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|