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,430 @@
|
|
|
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.Iterator;
|
|
33
|
+
import java.util.List;
|
|
34
|
+
|
|
35
|
+
import javax.xml.bind.annotation.XmlElement;
|
|
36
|
+
|
|
37
|
+
import toxi.geom.Line2D.LineIntersection;
|
|
38
|
+
import toxi.geom.Line2D.LineIntersection.Type;
|
|
39
|
+
import toxi.math.MathUtils;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
*
|
|
43
|
+
* @author tux
|
|
44
|
+
*/
|
|
45
|
+
public class LineStrip2D implements Iterable<Vec2D> {
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
*
|
|
49
|
+
*/
|
|
50
|
+
@XmlElement(name = "v")
|
|
51
|
+
protected List<Vec2D> vertices = new ArrayList<>();
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
*
|
|
55
|
+
*/
|
|
56
|
+
protected float[] arcLenIndex;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
*/
|
|
61
|
+
public LineStrip2D() {
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
*
|
|
66
|
+
* @param vertices
|
|
67
|
+
*/
|
|
68
|
+
public LineStrip2D(Collection<? extends Vec2D> vertices) {
|
|
69
|
+
this.vertices = new ArrayList<>(vertices);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
*
|
|
74
|
+
* @param x
|
|
75
|
+
* @param y
|
|
76
|
+
* @return
|
|
77
|
+
*/
|
|
78
|
+
public LineStrip2D add(float x, float y) {
|
|
79
|
+
vertices.add(new Vec2D(x, y));
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
*
|
|
85
|
+
* @param p
|
|
86
|
+
* @return
|
|
87
|
+
*/
|
|
88
|
+
public LineStrip2D add(ReadonlyVec2D p) {
|
|
89
|
+
vertices.add(p.copy());
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
*
|
|
95
|
+
* @param p
|
|
96
|
+
* @return
|
|
97
|
+
*/
|
|
98
|
+
public LineStrip2D add(Vec2D p) {
|
|
99
|
+
vertices.add(p);
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Returns the vertex at the given index. This function follows Python
|
|
105
|
+
* convention, in that if the index is negative, it is considered relative
|
|
106
|
+
* to the list end. Therefore the vertex at index -1 is the last vertex in
|
|
107
|
+
* the list.
|
|
108
|
+
*
|
|
109
|
+
* @param i
|
|
110
|
+
* index
|
|
111
|
+
* @return vertex
|
|
112
|
+
*/
|
|
113
|
+
public Vec2D get(int i) {
|
|
114
|
+
if (i < 0) {
|
|
115
|
+
i += vertices.size();
|
|
116
|
+
}
|
|
117
|
+
return vertices.get(i);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
*
|
|
122
|
+
* @return
|
|
123
|
+
*/
|
|
124
|
+
public Circle getBoundingCircle() {
|
|
125
|
+
return Circle.newBoundingCircle(vertices);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
*
|
|
130
|
+
* @return
|
|
131
|
+
*/
|
|
132
|
+
public Rect getBounds() {
|
|
133
|
+
return Rect.getBoundingRect(vertices);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
*
|
|
138
|
+
* @return
|
|
139
|
+
*/
|
|
140
|
+
public Vec2D getCentroid() {
|
|
141
|
+
int num = vertices.size();
|
|
142
|
+
if (num > 0) {
|
|
143
|
+
Vec2D centroid = new Vec2D();
|
|
144
|
+
vertices.stream().forEach((v) -> {
|
|
145
|
+
centroid.addSelf(v);
|
|
146
|
+
});
|
|
147
|
+
return centroid.scaleSelf(1f / num);
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Computes a list of points along the spline which are uniformly separated
|
|
154
|
+
* by the given step distance.
|
|
155
|
+
*
|
|
156
|
+
* @param step
|
|
157
|
+
* @return point list
|
|
158
|
+
*/
|
|
159
|
+
public List<Vec2D> getDecimatedVertices(float step) {
|
|
160
|
+
return getDecimatedVertices(step, true);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Computes a list of points along the spline which are close to uniformly
|
|
165
|
+
* separated by the given step distance. The uniform distribution is only an
|
|
166
|
+
* approximation and is based on the estimated arc length of the polyline.
|
|
167
|
+
* The distance between returned points might vary in places, especially if
|
|
168
|
+
* there're sharp angles between line segments.
|
|
169
|
+
*
|
|
170
|
+
* @param step
|
|
171
|
+
* @param doAddFinalVertex
|
|
172
|
+
* true, if the last vertex computed should be added regardless
|
|
173
|
+
* of its distance.
|
|
174
|
+
* @return point list
|
|
175
|
+
*/
|
|
176
|
+
public List<Vec2D> getDecimatedVertices(float step, boolean doAddFinalVertex) {
|
|
177
|
+
ArrayList<Vec2D> uniform = new ArrayList<>();
|
|
178
|
+
if (vertices.size() < 3) {
|
|
179
|
+
if (vertices.size() == 2) {
|
|
180
|
+
new Line2D(vertices.get(0), vertices.get(1)).splitIntoSegments(
|
|
181
|
+
uniform, step, true);
|
|
182
|
+
if (!doAddFinalVertex) {
|
|
183
|
+
uniform.remove(uniform.size() - 1);
|
|
184
|
+
}
|
|
185
|
+
} else {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
float arcLen = getLength();
|
|
190
|
+
if (arcLen > 0) {
|
|
191
|
+
double delta = step / arcLen;
|
|
192
|
+
int currIdx = 0;
|
|
193
|
+
for (double t = 0; t < 1.0; t += delta) {
|
|
194
|
+
double currT = t * arcLen;
|
|
195
|
+
while (currT >= arcLenIndex[currIdx]) {
|
|
196
|
+
currIdx++;
|
|
197
|
+
}
|
|
198
|
+
ReadonlyVec2D p = vertices.get(currIdx - 1);
|
|
199
|
+
ReadonlyVec2D q = vertices.get(currIdx);
|
|
200
|
+
float frac = (float) ((currT - arcLenIndex[currIdx - 1]) / (arcLenIndex[currIdx] - arcLenIndex[currIdx - 1]));
|
|
201
|
+
Vec2D i = p.interpolateTo(q, frac);
|
|
202
|
+
uniform.add(i);
|
|
203
|
+
}
|
|
204
|
+
if (doAddFinalVertex) {
|
|
205
|
+
uniform.add(vertices.get(vertices.size() - 1).copy());
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return uniform;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Returns a list of {@link Line2D} segments representing the segments
|
|
213
|
+
* between the vertices of this strip.
|
|
214
|
+
*
|
|
215
|
+
* @return list of lines
|
|
216
|
+
*/
|
|
217
|
+
public List<Line2D> getEdges() {
|
|
218
|
+
int num = vertices.size();
|
|
219
|
+
List<Line2D> edges = new ArrayList<>(num - 1);
|
|
220
|
+
for (int i = 1; i < num; i++) {
|
|
221
|
+
edges.add(new Line2D(vertices.get(i - 1), vertices.get(i)));
|
|
222
|
+
}
|
|
223
|
+
return edges;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
*
|
|
228
|
+
* @return
|
|
229
|
+
*/
|
|
230
|
+
public float getLength() {
|
|
231
|
+
if (arcLenIndex == null
|
|
232
|
+
|| (arcLenIndex != null && arcLenIndex.length != vertices
|
|
233
|
+
.size())) {
|
|
234
|
+
arcLenIndex = new float[vertices.size()];
|
|
235
|
+
}
|
|
236
|
+
float arcLen = 0;
|
|
237
|
+
for (int i = 1; i < arcLenIndex.length; i++) {
|
|
238
|
+
ReadonlyVec2D p = vertices.get(i - 1);
|
|
239
|
+
ReadonlyVec2D q = vertices.get(i);
|
|
240
|
+
arcLen += p.distanceTo(q);
|
|
241
|
+
arcLenIndex[i] = arcLen;
|
|
242
|
+
}
|
|
243
|
+
return arcLen;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Computes point at position t, where t is the normalized position along
|
|
248
|
+
* the strip. If t<0 then the first vertex of the strip is returned. If
|
|
249
|
+
* t>=1.0 the last vertex is returned. If the strip contains less than 2
|
|
250
|
+
* vertices, this method returns null.
|
|
251
|
+
*
|
|
252
|
+
* @param t
|
|
253
|
+
* @return
|
|
254
|
+
*/
|
|
255
|
+
public Vec2D getPointAt(float t) {
|
|
256
|
+
int num = vertices.size();
|
|
257
|
+
if (num > 1) {
|
|
258
|
+
if (t <= 0.0) {
|
|
259
|
+
return vertices.get(0);
|
|
260
|
+
} else if (t >= 1.0) {
|
|
261
|
+
return vertices.get(num - 1);
|
|
262
|
+
}
|
|
263
|
+
float totalLength = this.getLength();
|
|
264
|
+
double offp = 0, offq = 0;
|
|
265
|
+
for (int i = 1; i < num; i++) {
|
|
266
|
+
Vec2D p = vertices.get(i - 1);
|
|
267
|
+
Vec2D q = vertices.get(i);
|
|
268
|
+
offq += q.distanceTo(p) / totalLength;
|
|
269
|
+
if (offp <= t && offq >= t) {
|
|
270
|
+
return p.interpolateTo(q, (float) MathUtils.mapInterval(t,
|
|
271
|
+
offp, offq, 0.0, 1.0));
|
|
272
|
+
}
|
|
273
|
+
offp = offq;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
*
|
|
281
|
+
* @return
|
|
282
|
+
*/
|
|
283
|
+
public List<Line2D> getSegments() {
|
|
284
|
+
final int num = vertices.size();
|
|
285
|
+
List<Line2D> segments = new ArrayList<>(num - 1);
|
|
286
|
+
for (int i = 1; i < num; i++) {
|
|
287
|
+
segments.add(new Line2D(vertices.get(i - 1), vertices.get(i)));
|
|
288
|
+
}
|
|
289
|
+
return segments;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* @return the vertices
|
|
294
|
+
*/
|
|
295
|
+
public List<Vec2D> getVertices() {
|
|
296
|
+
return vertices;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
*
|
|
301
|
+
* @param line
|
|
302
|
+
* @return
|
|
303
|
+
*/
|
|
304
|
+
public LineIntersection intersectLine(Line2D line) {
|
|
305
|
+
Line2D l = new Line2D(new Vec2D(), new Vec2D());
|
|
306
|
+
for (int i = 1, num = vertices.size(); i < num; i++) {
|
|
307
|
+
l.set(vertices.get(i - 1), vertices.get(i));
|
|
308
|
+
LineIntersection isec = l.intersectLine(line);
|
|
309
|
+
if (isec.getType() == Type.INTERSECTING
|
|
310
|
+
|| isec.getType() == Type.COINCIDENT) {
|
|
311
|
+
return isec;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
*
|
|
319
|
+
* @return
|
|
320
|
+
*/
|
|
321
|
+
@Override
|
|
322
|
+
public Iterator<Vec2D> iterator() {
|
|
323
|
+
return vertices.iterator();
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
*
|
|
328
|
+
* @param theta
|
|
329
|
+
* @return
|
|
330
|
+
*/
|
|
331
|
+
public LineStrip2D rotate(float theta) {
|
|
332
|
+
vertices.stream().forEach((v) -> {
|
|
333
|
+
v.rotate(theta);
|
|
334
|
+
});
|
|
335
|
+
return this;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
*
|
|
340
|
+
* @param scale
|
|
341
|
+
* @return
|
|
342
|
+
*/
|
|
343
|
+
public LineStrip2D scale(float scale) {
|
|
344
|
+
return scale(scale, scale);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
*
|
|
349
|
+
* @param x
|
|
350
|
+
* @param y
|
|
351
|
+
* @return
|
|
352
|
+
*/
|
|
353
|
+
public LineStrip2D scale(float x, float y) {
|
|
354
|
+
vertices.stream().forEach((v) -> {
|
|
355
|
+
v.scaleSelf(x, y);
|
|
356
|
+
});
|
|
357
|
+
return this;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
*
|
|
362
|
+
* @param scale
|
|
363
|
+
* @return
|
|
364
|
+
*/
|
|
365
|
+
public LineStrip2D scale(ReadonlyVec2D scale) {
|
|
366
|
+
return scale(scale.x(), scale.y());
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
*
|
|
371
|
+
* @param scale
|
|
372
|
+
* @return
|
|
373
|
+
*/
|
|
374
|
+
public LineStrip2D scaleSize(float scale) {
|
|
375
|
+
return scaleSize(scale, scale);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
*
|
|
380
|
+
* @param x
|
|
381
|
+
* @param y
|
|
382
|
+
* @return
|
|
383
|
+
*/
|
|
384
|
+
public LineStrip2D scaleSize(float x, float y) {
|
|
385
|
+
Vec2D centroid = getCentroid();
|
|
386
|
+
vertices.stream().forEach((v) -> {
|
|
387
|
+
v.subSelf(centroid).scaleSelf(x, y).addSelf(centroid);
|
|
388
|
+
});
|
|
389
|
+
return this;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
*
|
|
394
|
+
* @param scale
|
|
395
|
+
* @return
|
|
396
|
+
*/
|
|
397
|
+
public LineStrip2D scaleSize(ReadonlyVec2D scale) {
|
|
398
|
+
return scaleSize(scale.x(), scale.y());
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* @param vertices
|
|
403
|
+
* the vertices to set
|
|
404
|
+
*/
|
|
405
|
+
public void setVertices(List<Vec2D> vertices) {
|
|
406
|
+
this.vertices = vertices;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
*
|
|
411
|
+
* @param x
|
|
412
|
+
* @param y
|
|
413
|
+
* @return
|
|
414
|
+
*/
|
|
415
|
+
public LineStrip2D translate(float x, float y) {
|
|
416
|
+
vertices.stream().forEach((v) -> {
|
|
417
|
+
v.addSelf(x, y);
|
|
418
|
+
});
|
|
419
|
+
return this;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
*
|
|
424
|
+
* @param offset
|
|
425
|
+
* @return
|
|
426
|
+
*/
|
|
427
|
+
public LineStrip2D translate(ReadonlyVec2D offset) {
|
|
428
|
+
return translate(offset.x(), offset.y());
|
|
429
|
+
}
|
|
430
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
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.Iterator;
|
|
33
|
+
import java.util.List;
|
|
34
|
+
|
|
35
|
+
import javax.xml.bind.annotation.XmlElement;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* @author tux
|
|
40
|
+
*/
|
|
41
|
+
public class LineStrip3D implements Iterable<Vec3D> {
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
@XmlElement(name = "v")
|
|
47
|
+
protected List<Vec3D> vertices = new ArrayList<>();
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
*/
|
|
52
|
+
protected float[] arcLenIndex;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
*/
|
|
57
|
+
public LineStrip3D() {
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
* @param vertices
|
|
63
|
+
*/
|
|
64
|
+
public LineStrip3D(Collection<? extends Vec3D> vertices) {
|
|
65
|
+
this.vertices = new ArrayList<>(vertices);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
*
|
|
70
|
+
* @param x
|
|
71
|
+
* @param y
|
|
72
|
+
* @param z
|
|
73
|
+
* @return
|
|
74
|
+
*/
|
|
75
|
+
public LineStrip3D add(float x, float y, float z) {
|
|
76
|
+
vertices.add(new Vec3D(x, y, z));
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
*
|
|
82
|
+
* @param p
|
|
83
|
+
* @return
|
|
84
|
+
*/
|
|
85
|
+
public LineStrip3D add(ReadonlyVec3D p) {
|
|
86
|
+
vertices.add(p.copy());
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
*
|
|
92
|
+
* @param p
|
|
93
|
+
* @return
|
|
94
|
+
*/
|
|
95
|
+
public LineStrip3D add(Vec3D p) {
|
|
96
|
+
vertices.add(p);
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Returns the vertex at the given index. This function follows Python
|
|
102
|
+
* convention, in that if the index is negative, it is considered relative
|
|
103
|
+
* to the list end. Therefore the vertex at index -1 is the last vertex in
|
|
104
|
+
* the list.
|
|
105
|
+
*
|
|
106
|
+
* @param i
|
|
107
|
+
* index
|
|
108
|
+
* @return vertex
|
|
109
|
+
*/
|
|
110
|
+
public Vec3D get(int i) {
|
|
111
|
+
if (i < 0) {
|
|
112
|
+
i += vertices.size();
|
|
113
|
+
}
|
|
114
|
+
return vertices.get(i);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Computes a list of points along the spline which are uniformly separated
|
|
119
|
+
* by the given step distance.
|
|
120
|
+
*
|
|
121
|
+
* @param step
|
|
122
|
+
* @return point list
|
|
123
|
+
*/
|
|
124
|
+
public List<Vec3D> getDecimatedVertices(float step) {
|
|
125
|
+
return getDecimatedVertices(step, true);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Computes a list of points along the spline which are close to uniformly
|
|
130
|
+
* separated by the given step distance. The uniform distribution is only an
|
|
131
|
+
* approximation and is based on the estimated arc length of the polyline.
|
|
132
|
+
* The distance between returned points might vary in places, especially if
|
|
133
|
+
* there're sharp angles between line segments.
|
|
134
|
+
*
|
|
135
|
+
* @param step
|
|
136
|
+
* @param doAddFinalVertex
|
|
137
|
+
* true, if the last vertex computed should be added regardless
|
|
138
|
+
* of its distance.
|
|
139
|
+
* @return point list
|
|
140
|
+
*/
|
|
141
|
+
public List<Vec3D> getDecimatedVertices(float step, boolean doAddFinalVertex) {
|
|
142
|
+
ArrayList<Vec3D> uniform = new ArrayList<>();
|
|
143
|
+
if (vertices.size() < 3) {
|
|
144
|
+
if (vertices.size() == 2) {
|
|
145
|
+
new Line3D(vertices.get(0), vertices.get(1)).splitIntoSegments(
|
|
146
|
+
uniform, step, true);
|
|
147
|
+
if (!doAddFinalVertex) {
|
|
148
|
+
uniform.remove(uniform.size() - 1);
|
|
149
|
+
}
|
|
150
|
+
} else {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
float arcLen = getEstimatedArcLength();
|
|
155
|
+
double delta = (double) step / arcLen;
|
|
156
|
+
int currIdx = 0;
|
|
157
|
+
for (double t = 0; t < 1.0; t += delta) {
|
|
158
|
+
double currT = t * arcLen;
|
|
159
|
+
while (currT >= arcLenIndex[currIdx]) {
|
|
160
|
+
currIdx++;
|
|
161
|
+
}
|
|
162
|
+
ReadonlyVec3D p = vertices.get(currIdx - 1);
|
|
163
|
+
ReadonlyVec3D q = vertices.get(currIdx);
|
|
164
|
+
float frac = (float) ((currT - arcLenIndex[currIdx - 1]) / (arcLenIndex[currIdx] - arcLenIndex[currIdx - 1]));
|
|
165
|
+
Vec3D i = p.interpolateTo(q, frac);
|
|
166
|
+
uniform.add(i);
|
|
167
|
+
}
|
|
168
|
+
if (doAddFinalVertex) {
|
|
169
|
+
uniform.add(vertices.get(vertices.size() - 1).copy());
|
|
170
|
+
}
|
|
171
|
+
return uniform;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
*
|
|
176
|
+
* @return
|
|
177
|
+
*/
|
|
178
|
+
public float getEstimatedArcLength() {
|
|
179
|
+
if (arcLenIndex == null
|
|
180
|
+
|| (arcLenIndex != null && arcLenIndex.length != vertices
|
|
181
|
+
.size())) {
|
|
182
|
+
arcLenIndex = new float[vertices.size()];
|
|
183
|
+
}
|
|
184
|
+
float arcLen = 0;
|
|
185
|
+
for (int i = 1; i < arcLenIndex.length; i++) {
|
|
186
|
+
ReadonlyVec3D p = vertices.get(i - 1);
|
|
187
|
+
ReadonlyVec3D q = vertices.get(i);
|
|
188
|
+
arcLen += p.distanceTo(q);
|
|
189
|
+
arcLenIndex[i] = arcLen;
|
|
190
|
+
}
|
|
191
|
+
return arcLen;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
*
|
|
196
|
+
* @return
|
|
197
|
+
*/
|
|
198
|
+
public List<Line3D> getSegments() {
|
|
199
|
+
final int num = vertices.size();
|
|
200
|
+
List<Line3D> segments = new ArrayList<>(num - 1);
|
|
201
|
+
for (int i = 1; i < num; i++) {
|
|
202
|
+
segments.add(new Line3D(vertices.get(i - 1), vertices.get(i)));
|
|
203
|
+
}
|
|
204
|
+
return segments;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @return the vertices
|
|
209
|
+
*/
|
|
210
|
+
public List<Vec3D> getVertices() {
|
|
211
|
+
return vertices;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
*
|
|
216
|
+
* @return
|
|
217
|
+
*/
|
|
218
|
+
@Override
|
|
219
|
+
public Iterator<Vec3D> iterator() {
|
|
220
|
+
return vertices.iterator();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @param vertices
|
|
225
|
+
* the vertices to set
|
|
226
|
+
*/
|
|
227
|
+
public void setVertices(List<Vec3D> vertices) {
|
|
228
|
+
this.vertices = vertices;
|
|
229
|
+
}
|
|
230
|
+
}
|