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,351 @@
|
|
|
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.Arrays;
|
|
32
|
+
import java.util.List;
|
|
33
|
+
|
|
34
|
+
import javax.xml.bind.annotation.XmlAccessType;
|
|
35
|
+
import javax.xml.bind.annotation.XmlAccessorType;
|
|
36
|
+
import javax.xml.bind.annotation.XmlAttribute;
|
|
37
|
+
import javax.xml.bind.annotation.XmlElement;
|
|
38
|
+
import javax.xml.bind.annotation.XmlTransient;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* <p>
|
|
42
|
+
* This is a generic 3D B-Spline class for curves of arbitrary length, control
|
|
43
|
+
* handles and patches are created and joined automatically as described here:
|
|
44
|
+
* <a
|
|
45
|
+
* href="http://www.ibiblio.org/e-notes/Splines/Bint.htm">ibiblio.org/e-notes/
|
|
46
|
+
* Splines/Bint.htm</a>
|
|
47
|
+
* </p>
|
|
48
|
+
*
|
|
49
|
+
* <p>
|
|
50
|
+
* Thanks to a bug report by Aaron Meyers (http://universaloscillation.com) the
|
|
51
|
+
* {@linkplain #toLineStrip3D(int)} method has a slightly changed behaviour from
|
|
52
|
+
* version 0014 onwards. In earlier versions erroneous duplicate points would be
|
|
53
|
+
* added near each given control point, which lead to various weird results.
|
|
54
|
+
* </p>
|
|
55
|
+
*
|
|
56
|
+
* <p>
|
|
57
|
+
* The new behaviour of the curve interpolation/computation is described in the
|
|
58
|
+
* docs for the {@linkplain #toLineStrip3D(int)} method below.
|
|
59
|
+
* </p>
|
|
60
|
+
*
|
|
61
|
+
* @version 0014 Added user adjustable curve tightness control
|
|
62
|
+
* @version 0015 Added JAXB annotations and List support for dynamic building of
|
|
63
|
+
* spline
|
|
64
|
+
*/
|
|
65
|
+
@XmlAccessorType(XmlAccessType.FIELD)
|
|
66
|
+
public class Spline3D {
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
*
|
|
70
|
+
*/
|
|
71
|
+
public static final float DEFAULT_TIGHTNESS = 0.25f;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
*
|
|
75
|
+
*/
|
|
76
|
+
@XmlTransient
|
|
77
|
+
protected Vec3D[] points;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
*
|
|
81
|
+
*/
|
|
82
|
+
@XmlElement(name = "p")
|
|
83
|
+
public List<Vec3D> pointList = new ArrayList<>();
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
*
|
|
87
|
+
*/
|
|
88
|
+
@XmlTransient
|
|
89
|
+
public BernsteinPolynomial bernstein;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
*
|
|
93
|
+
*/
|
|
94
|
+
@XmlTransient
|
|
95
|
+
public Vec3D[] delta;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
*
|
|
99
|
+
*/
|
|
100
|
+
@XmlTransient
|
|
101
|
+
public Vec3D[] coeffA;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
*
|
|
105
|
+
*/
|
|
106
|
+
@XmlTransient
|
|
107
|
+
public float[] bi;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
*
|
|
111
|
+
*/
|
|
112
|
+
@XmlAttribute
|
|
113
|
+
protected float tightness;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
*
|
|
117
|
+
*/
|
|
118
|
+
@XmlTransient
|
|
119
|
+
protected float invTightness;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Constructs an empty spline container with default curve tightness. You
|
|
123
|
+
* need to populate the spline manually by using {@link #add(ReadonlyVec3D)}
|
|
124
|
+
* .
|
|
125
|
+
*/
|
|
126
|
+
public Spline3D() {
|
|
127
|
+
setTightness(DEFAULT_TIGHTNESS);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @param rawPoints
|
|
132
|
+
* list of control point vectors
|
|
133
|
+
*/
|
|
134
|
+
public Spline3D(List<Vec3D> rawPoints) {
|
|
135
|
+
this(rawPoints, null, DEFAULT_TIGHTNESS);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @param rawPoints
|
|
140
|
+
* list of control point vectors
|
|
141
|
+
* @param b
|
|
142
|
+
* predefined Bernstein polynomial (good for reusing)
|
|
143
|
+
* @param tightness
|
|
144
|
+
* default curve tightness used for the interpolated vertices
|
|
145
|
+
* {@linkplain #setTightness(float)}
|
|
146
|
+
*/
|
|
147
|
+
public Spline3D(List<Vec3D> rawPoints, BernsteinPolynomial b,
|
|
148
|
+
float tightness) {
|
|
149
|
+
pointList.addAll(rawPoints);
|
|
150
|
+
bernstein = b;
|
|
151
|
+
setTightness(tightness);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* @param pointArray
|
|
156
|
+
* array of control point vectors
|
|
157
|
+
*/
|
|
158
|
+
public Spline3D(Vec3D[] pointArray) {
|
|
159
|
+
this(pointArray, null, DEFAULT_TIGHTNESS);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* @param pointArray
|
|
164
|
+
* array of control point vectors
|
|
165
|
+
* @param b
|
|
166
|
+
* predefined Bernstein polynomial (good for reusing)
|
|
167
|
+
* @param tightness
|
|
168
|
+
* default curve tightness used for the interpolated vertices
|
|
169
|
+
* {@linkplain #setTightness(float)}
|
|
170
|
+
*/
|
|
171
|
+
public Spline3D(Vec3D[] pointArray, BernsteinPolynomial b, float tightness) {
|
|
172
|
+
this(Arrays.asList(pointArray), b, tightness);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
*
|
|
177
|
+
* @param x
|
|
178
|
+
* @param y
|
|
179
|
+
* @param z
|
|
180
|
+
* @return
|
|
181
|
+
*/
|
|
182
|
+
public Spline3D add(float x, float y, float z) {
|
|
183
|
+
return add(new Vec3D(x, y, z));
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Adds the given point to the list of control points.
|
|
188
|
+
*
|
|
189
|
+
* @param p
|
|
190
|
+
* @return itself
|
|
191
|
+
*/
|
|
192
|
+
public Spline3D add(ReadonlyVec3D p) {
|
|
193
|
+
pointList.add(p.copy());
|
|
194
|
+
return this;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
*
|
|
199
|
+
*/
|
|
200
|
+
protected void findCPoints() {
|
|
201
|
+
bi[1] = -tightness;
|
|
202
|
+
coeffA[1].set((points[2].x - points[0].x - delta[0].x) * tightness,
|
|
203
|
+
(points[2].y - points[0].y - delta[0].y) * tightness,
|
|
204
|
+
(points[2].z - points[0].z - delta[0].z) * tightness);
|
|
205
|
+
final int numP = getNumPoints();
|
|
206
|
+
for (int i = 2; i < numP - 1; i++) {
|
|
207
|
+
bi[i] = -1 / (invTightness + bi[i - 1]);
|
|
208
|
+
coeffA[i].set(
|
|
209
|
+
-(points[i + 1].x - points[i - 1].x - coeffA[i - 1].x)
|
|
210
|
+
* bi[i],
|
|
211
|
+
-(points[i + 1].y - points[i - 1].y - coeffA[i - 1].y)
|
|
212
|
+
* bi[i],
|
|
213
|
+
-(points[i + 1].z - points[i - 1].z - coeffA[i - 1].z)
|
|
214
|
+
* bi[i]);
|
|
215
|
+
}
|
|
216
|
+
for (int i = numP - 2; i > 0; i--) {
|
|
217
|
+
delta[i].set(coeffA[i].x + delta[i + 1].x * bi[i], coeffA[i].y
|
|
218
|
+
+ delta[i + 1].y * bi[i], coeffA[i].z + delta[i + 1].z
|
|
219
|
+
* bi[i]);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Returns the number of key points.
|
|
225
|
+
*
|
|
226
|
+
* @return the numP
|
|
227
|
+
*/
|
|
228
|
+
public final int getNumPoints() {
|
|
229
|
+
return pointList.size();
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* @return the pointList
|
|
234
|
+
*/
|
|
235
|
+
public List<Vec3D> getPointList() {
|
|
236
|
+
return pointList;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* @see #setTightness(float)
|
|
241
|
+
* @return the spline3d tightness
|
|
242
|
+
* @since 0014 (rev.216)
|
|
243
|
+
*/
|
|
244
|
+
public float getTightness() {
|
|
245
|
+
return tightness;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Overrides the current control points with the given list.
|
|
250
|
+
*
|
|
251
|
+
* @param plist
|
|
252
|
+
* the pointList to set
|
|
253
|
+
* @return itself
|
|
254
|
+
*/
|
|
255
|
+
public Spline3D setPointList(List<Vec3D> plist) {
|
|
256
|
+
pointList.clear();
|
|
257
|
+
for (ReadonlyVec3D p : plist) {
|
|
258
|
+
pointList.add(p.copy());
|
|
259
|
+
}
|
|
260
|
+
return this;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Sets the tightness for future curve interpolation calls. Default value is
|
|
265
|
+
* 0.25. A value of 0.0 equals linear interpolation between the given curve
|
|
266
|
+
* input points. Curve behaviour for values outside the 0.0 .. 0.5 interval
|
|
267
|
+
* is unspecified and becomes increasingly less intuitive. Negative values
|
|
268
|
+
* are possible too and create interesting results (in some cases).
|
|
269
|
+
*
|
|
270
|
+
* @param tightness
|
|
271
|
+
* the tightness value used for the next call to
|
|
272
|
+
* {@link #toLineStrip3D(int)}
|
|
273
|
+
* @since 0014 (rev. 216)
|
|
274
|
+
* @return itself
|
|
275
|
+
*/
|
|
276
|
+
public final Spline3D setTightness(float tightness) {
|
|
277
|
+
this.tightness = tightness;
|
|
278
|
+
this.invTightness = 1f / tightness;
|
|
279
|
+
return this;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* <p>
|
|
284
|
+
* Computes all curve vertices based on the resolution/number of
|
|
285
|
+
* subdivisions requested. The higher, the more vertices are computed:
|
|
286
|
+
* </p>
|
|
287
|
+
* <p>
|
|
288
|
+
* <strong>(number of control points - 1) * resolution + 1</strong>
|
|
289
|
+
* </p>
|
|
290
|
+
* <p>
|
|
291
|
+
* Since version 0014 the automatic placement of the curve handles can also
|
|
292
|
+
* be manipulated via the {@linkplain #setTightness(float)} method.
|
|
293
|
+
* </p>
|
|
294
|
+
*
|
|
295
|
+
* @param res
|
|
296
|
+
* the number of vertices to be computed per segment between
|
|
297
|
+
* original control points (incl. control point always at the
|
|
298
|
+
* start of each segment)
|
|
299
|
+
* @return list of Vec3D vertices along the curve
|
|
300
|
+
*/
|
|
301
|
+
public LineStrip3D toLineStrip3D(int res) {
|
|
302
|
+
updateCoefficients();
|
|
303
|
+
if (res < 1) {
|
|
304
|
+
res = 1;
|
|
305
|
+
}
|
|
306
|
+
res++;
|
|
307
|
+
if (bernstein == null || bernstein.resolution != res) {
|
|
308
|
+
bernstein = new BernsteinPolynomial(res);
|
|
309
|
+
}
|
|
310
|
+
LineStrip3D strip = new LineStrip3D();
|
|
311
|
+
findCPoints();
|
|
312
|
+
Vec3D deltaP = new Vec3D();
|
|
313
|
+
Vec3D deltaQ = new Vec3D();
|
|
314
|
+
res--;
|
|
315
|
+
for (int i = 0, numP = getNumPoints(); i < numP - 1; i++) {
|
|
316
|
+
Vec3D p = points[i];
|
|
317
|
+
Vec3D q = points[i + 1];
|
|
318
|
+
deltaP.set(delta[i]).addSelf(p);
|
|
319
|
+
deltaQ.set(q).subSelf(delta[i + 1]);
|
|
320
|
+
for (int k = 0; k < res; k++) {
|
|
321
|
+
float x = p.x * bernstein.b0[k] + deltaP.x * bernstein.b1[k]
|
|
322
|
+
+ deltaQ.x * bernstein.b2[k] + q.x * bernstein.b3[k];
|
|
323
|
+
float y = p.y * bernstein.b0[k] + deltaP.y * bernstein.b1[k]
|
|
324
|
+
+ deltaQ.y * bernstein.b2[k] + q.y * bernstein.b3[k];
|
|
325
|
+
float z = p.z * bernstein.b0[k] + deltaP.z * bernstein.b1[k]
|
|
326
|
+
+ deltaQ.z * bernstein.b2[k] + q.z * bernstein.b3[k];
|
|
327
|
+
strip.add(new Vec3D(x, y, z));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
strip.add(points[points.length - 1].copy());
|
|
331
|
+
return strip;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
*
|
|
336
|
+
*/
|
|
337
|
+
public void updateCoefficients() {
|
|
338
|
+
final int numP = getNumPoints();
|
|
339
|
+
if (points == null || (points != null && points.length != numP)) {
|
|
340
|
+
coeffA = new Vec3D[numP];
|
|
341
|
+
delta = new Vec3D[numP];
|
|
342
|
+
bi = new float[numP];
|
|
343
|
+
for (int i = 0; i < numP; i++) {
|
|
344
|
+
coeffA[i] = new Vec3D();
|
|
345
|
+
delta[i] = new Vec3D();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
setTightness(tightness);
|
|
349
|
+
points = pointList.toArray(new Vec3D[numP]);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
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.List;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A version of the Sutherland-Hodgeman algorithm to clip 2D polygons optimized
|
|
35
|
+
* for rectangular clipping regions.
|
|
36
|
+
*
|
|
37
|
+
* More information: http://en.wikipedia.org/wiki/Sutherland-Hodgman_algorithm
|
|
38
|
+
*
|
|
39
|
+
* @see ConvexPolygonClipper
|
|
40
|
+
*/
|
|
41
|
+
public class SutherlandHodgemanClipper implements PolygonClipper2D {
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
protected Rect bounds;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
*
|
|
50
|
+
* @param bounds
|
|
51
|
+
*/
|
|
52
|
+
public SutherlandHodgemanClipper(Rect bounds) {
|
|
53
|
+
this.bounds = bounds;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@Override
|
|
57
|
+
public Polygon2D clipPolygon(Polygon2D poly) {
|
|
58
|
+
List<Vec2D> points = new ArrayList<>(poly.vertices);
|
|
59
|
+
List<Vec2D> clipped = new ArrayList<>();
|
|
60
|
+
points.add(points.get(0));
|
|
61
|
+
for (int edgeID = 0; edgeID < 4; edgeID++) {
|
|
62
|
+
clipped.clear();
|
|
63
|
+
for (int i = 0, num = points.size() - 1; i < num; i++) {
|
|
64
|
+
Vec2D p = points.get(i);
|
|
65
|
+
Vec2D q = points.get(i + 1);
|
|
66
|
+
if (isInsideEdge(p, edgeID)) {
|
|
67
|
+
if (isInsideEdge(q, edgeID)) {
|
|
68
|
+
clipped.add(q.copy());
|
|
69
|
+
} else {
|
|
70
|
+
clipped.add(getClippedPosOnEdge(edgeID, p, q));
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (isInsideEdge(q, edgeID)) {
|
|
75
|
+
clipped.add(getClippedPosOnEdge(edgeID, p, q));
|
|
76
|
+
clipped.add(q.copy());
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (clipped.size() > 0
|
|
80
|
+
&& clipped.get(0) != clipped.get(clipped.size() - 1)) {
|
|
81
|
+
clipped.add(clipped.get(0));
|
|
82
|
+
}
|
|
83
|
+
List<Vec2D> t = points;
|
|
84
|
+
points = clipped;
|
|
85
|
+
clipped = t;
|
|
86
|
+
}
|
|
87
|
+
return new Polygon2D(points).removeDuplicates(0.001f);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* @return the bounding rect
|
|
92
|
+
*/
|
|
93
|
+
public Rect getBounds() {
|
|
94
|
+
return bounds;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private Vec2D getClippedPosOnEdge(int edgeID, Vec2D p1, Vec2D p2) {
|
|
98
|
+
switch (edgeID) {
|
|
99
|
+
case 0:
|
|
100
|
+
return new Vec2D(p1.x + ((bounds.y - p1.y) * (p2.x - p1.x))
|
|
101
|
+
/ (p2.y - p1.y), bounds.y);
|
|
102
|
+
case 2:
|
|
103
|
+
float by = bounds.y + bounds.height;
|
|
104
|
+
return new Vec2D(p1.x + ((by - p1.y) * (p2.x - p1.x))
|
|
105
|
+
/ (p2.y - p1.y), by);
|
|
106
|
+
case 1:
|
|
107
|
+
float bx = bounds.x + bounds.width;
|
|
108
|
+
return new Vec2D(bx, p1.y + ((bx - p1.x) * (p2.y - p1.y))
|
|
109
|
+
/ (p2.x - p1.x));
|
|
110
|
+
|
|
111
|
+
case 3:
|
|
112
|
+
return new Vec2D(bounds.x, p1.y
|
|
113
|
+
+ ((bounds.x - p1.x) * (p2.y - p1.y)) / (p2.x - p1.x));
|
|
114
|
+
default:
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private boolean isInsideEdge(Vec2D p, int edgeID) {
|
|
120
|
+
switch (edgeID) {
|
|
121
|
+
case 0:
|
|
122
|
+
return p.y >= bounds.y;
|
|
123
|
+
case 2:
|
|
124
|
+
return p.y < bounds.y + bounds.height;
|
|
125
|
+
case 3:
|
|
126
|
+
return p.x >= bounds.x;
|
|
127
|
+
case 1:
|
|
128
|
+
return p.x < bounds.x + bounds.width;
|
|
129
|
+
default:
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
*
|
|
136
|
+
* @param list
|
|
137
|
+
* @param q
|
|
138
|
+
* @return
|
|
139
|
+
*/
|
|
140
|
+
protected boolean isKnownVertex(List<Vec2D> list, Vec2D q) {
|
|
141
|
+
return list.stream().anyMatch((p) -> (p.equalsWithTolerance(q, 0.0001f)));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @param bounds
|
|
146
|
+
* the bounding rect to set
|
|
147
|
+
*/
|
|
148
|
+
public void setBounds(Rect bounds) {
|
|
149
|
+
this.bounds = bounds;
|
|
150
|
+
}
|
|
151
|
+
}
|