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,560 @@
|
|
|
1
|
+
package toxi.geom.mesh2d;
|
|
2
|
+
|
|
3
|
+
import java.util.Arrays;
|
|
4
|
+
import toxi.geom.Vec2D;
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* Copyright (c) 2005, 2007 by L. Paul Chew.
|
|
8
|
+
*
|
|
9
|
+
* Permission is hereby granted, without written agreement and without
|
|
10
|
+
* license or royalty fees, to use, copy, modify, and distribute this
|
|
11
|
+
* software and its documentation for any purpose, subject to the following
|
|
12
|
+
* conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included
|
|
15
|
+
* in all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
18
|
+
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
22
|
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
23
|
+
* DEALINGS IN THE SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Points in Euclidean space, implemented as double[].
|
|
28
|
+
*
|
|
29
|
+
* Includes simple geometric operations. Uses matrices; a matrix is represented
|
|
30
|
+
* as an array of Pnts. Uses simplices; a simplex is represented as an array of
|
|
31
|
+
* Pnts.
|
|
32
|
+
*
|
|
33
|
+
* @author Paul Chew Created July 2005. Derived from an earlier, messier
|
|
34
|
+
* version. Modified Novemeber 2007. Minor clean up.
|
|
35
|
+
*/
|
|
36
|
+
public class DelaunayVertex {
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Circumcenter of a simplex.
|
|
40
|
+
*
|
|
41
|
+
* @param simplex
|
|
42
|
+
* the simplex (as an array of Pnts)
|
|
43
|
+
* @return the circumcenter (a DelaunayVertex) of simplex
|
|
44
|
+
*/
|
|
45
|
+
public static DelaunayVertex circumcenter(DelaunayVertex[] simplex) {
|
|
46
|
+
int dim = simplex[0].dimension();
|
|
47
|
+
if (simplex.length - 1 != dim) {
|
|
48
|
+
throw new IllegalArgumentException("Dimension mismatch");
|
|
49
|
+
}
|
|
50
|
+
DelaunayVertex[] matrix = new DelaunayVertex[dim];
|
|
51
|
+
for (int i = 0; i < dim; i++) {
|
|
52
|
+
matrix[i] = simplex[i].bisector(simplex[i + 1]);
|
|
53
|
+
}
|
|
54
|
+
DelaunayVertex hCenter = cross(matrix); // Center in homogeneous
|
|
55
|
+
// coordinates
|
|
56
|
+
double last = hCenter.coordinates[dim];
|
|
57
|
+
double[] result = new double[dim];
|
|
58
|
+
for (int i = 0; i < dim; i++) {
|
|
59
|
+
result[i] = hCenter.coordinates[i] / last;
|
|
60
|
+
}
|
|
61
|
+
return new DelaunayVertex(result);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Determine the signed content (i.e., area or volume, etc.) of a simplex.
|
|
66
|
+
*
|
|
67
|
+
* @param simplex
|
|
68
|
+
* the simplex (as an array of Pnts)
|
|
69
|
+
* @return the signed content of the simplex
|
|
70
|
+
*/
|
|
71
|
+
public static double content(DelaunayVertex[] simplex) {
|
|
72
|
+
DelaunayVertex[] matrix = new DelaunayVertex[simplex.length];
|
|
73
|
+
for (int i = 0; i < matrix.length; i++) {
|
|
74
|
+
matrix[i] = simplex[i].extend(1);
|
|
75
|
+
}
|
|
76
|
+
int fact = 1;
|
|
77
|
+
for (int i = 1; i < matrix.length; i++) {
|
|
78
|
+
fact = fact * i;
|
|
79
|
+
}
|
|
80
|
+
return determinant(matrix) / fact;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Compute generalized cross-product of the rows of a matrix. The result is
|
|
85
|
+
* a DelaunayVertex perpendicular (as a vector) to each row of the matrix.
|
|
86
|
+
* This is not an efficient implementation, but should be adequate for low
|
|
87
|
+
* dimension.
|
|
88
|
+
*
|
|
89
|
+
* @param matrix
|
|
90
|
+
* the matrix of Pnts (one less row than the DelaunayVertex
|
|
91
|
+
* dimension)
|
|
92
|
+
* @return a DelaunayVertex perpendicular to each row DelaunayVertex
|
|
93
|
+
* @throws IllegalArgumentException
|
|
94
|
+
* if matrix is wrong shape
|
|
95
|
+
*/
|
|
96
|
+
public static DelaunayVertex cross(DelaunayVertex[] matrix) {
|
|
97
|
+
int len = matrix.length + 1;
|
|
98
|
+
if (len != matrix[0].dimension()) {
|
|
99
|
+
throw new IllegalArgumentException("Dimension mismatch");
|
|
100
|
+
}
|
|
101
|
+
boolean[] columns = new boolean[len];
|
|
102
|
+
for (int i = 0; i < len; i++) {
|
|
103
|
+
columns[i] = true;
|
|
104
|
+
}
|
|
105
|
+
double[] result = new double[len];
|
|
106
|
+
int sign = 1;
|
|
107
|
+
try {
|
|
108
|
+
for (int i = 0; i < len; i++) {
|
|
109
|
+
columns[i] = false;
|
|
110
|
+
result[i] = sign * determinant(matrix, 0, columns);
|
|
111
|
+
columns[i] = true;
|
|
112
|
+
sign = -sign;
|
|
113
|
+
}
|
|
114
|
+
} catch (ArrayIndexOutOfBoundsException e) {
|
|
115
|
+
throw new IllegalArgumentException("Matrix is wrong shape");
|
|
116
|
+
}
|
|
117
|
+
return new DelaunayVertex(result);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Compute the determinant of a matrix (array of Pnts). This is not an
|
|
122
|
+
* efficient implementation, but should be adequate for low dimension.
|
|
123
|
+
*
|
|
124
|
+
* @param matrix
|
|
125
|
+
* the matrix as an array of Pnts
|
|
126
|
+
* @return the determinnant of the input matrix
|
|
127
|
+
* @throws IllegalArgumentException
|
|
128
|
+
* if dimensions are wrong
|
|
129
|
+
*/
|
|
130
|
+
public static double determinant(DelaunayVertex[] matrix) {
|
|
131
|
+
if (matrix.length != matrix[0].dimension()) {
|
|
132
|
+
throw new IllegalArgumentException("Matrix is not square");
|
|
133
|
+
}
|
|
134
|
+
boolean[] columns = new boolean[matrix.length];
|
|
135
|
+
for (int i = 0; i < matrix.length; i++) {
|
|
136
|
+
columns[i] = true;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
return determinant(matrix, 0, columns);
|
|
140
|
+
} catch (ArrayIndexOutOfBoundsException e) {
|
|
141
|
+
throw new IllegalArgumentException("Matrix is wrong shape");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Compute the determinant of a submatrix specified by starting row and by
|
|
147
|
+
* "active" columns.
|
|
148
|
+
*
|
|
149
|
+
* @param matrix
|
|
150
|
+
* the matrix as an array of Pnts
|
|
151
|
+
* @param row
|
|
152
|
+
* the starting row
|
|
153
|
+
* @param columns
|
|
154
|
+
* a boolean array indicating the "active" columns
|
|
155
|
+
* @return the determinant of the specified submatrix
|
|
156
|
+
* @throws ArrayIndexOutOfBoundsException
|
|
157
|
+
* if dimensions are wrong
|
|
158
|
+
*/
|
|
159
|
+
private static double determinant(DelaunayVertex[] matrix, int row,
|
|
160
|
+
boolean[] columns) {
|
|
161
|
+
if (row == matrix.length) {
|
|
162
|
+
return 1;
|
|
163
|
+
}
|
|
164
|
+
double sum = 0;
|
|
165
|
+
int sign = 1;
|
|
166
|
+
for (int col = 0; col < columns.length; col++) {
|
|
167
|
+
if (!columns[col]) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
columns[col] = false;
|
|
171
|
+
sum += sign * matrix[row].coordinates[col]
|
|
172
|
+
* determinant(matrix, row + 1, columns);
|
|
173
|
+
columns[col] = true;
|
|
174
|
+
sign = -sign;
|
|
175
|
+
}
|
|
176
|
+
return sum;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Create a String for a matrix.
|
|
181
|
+
*
|
|
182
|
+
* @param matrix
|
|
183
|
+
* the matrix (an array of Pnts)
|
|
184
|
+
* @return a String represenation of the matrix
|
|
185
|
+
*/
|
|
186
|
+
public static String toString(DelaunayVertex[] matrix) {
|
|
187
|
+
StringBuilder buf = new StringBuilder("{");
|
|
188
|
+
for (DelaunayVertex row : matrix) {
|
|
189
|
+
buf.append(" ").append(row);
|
|
190
|
+
}
|
|
191
|
+
buf.append(" }");
|
|
192
|
+
return buf.toString();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private final double[] coordinates; // The point's coordinates
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Constructor.
|
|
199
|
+
*
|
|
200
|
+
* @param coords
|
|
201
|
+
* the coordinates
|
|
202
|
+
*/
|
|
203
|
+
public DelaunayVertex(double... coords) {
|
|
204
|
+
// Copying is done here to ensure that DelaunayVertex's coords cannot be
|
|
205
|
+
// altered.
|
|
206
|
+
// This is necessary because the double... notation actually creates a
|
|
207
|
+
// constructor with double[] as its argument.
|
|
208
|
+
coordinates = new double[coords.length];
|
|
209
|
+
System.arraycopy(coords, 0, coordinates, 0, coords.length);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Add.
|
|
214
|
+
*
|
|
215
|
+
* @param p
|
|
216
|
+
* the other DelaunayVertex
|
|
217
|
+
* @return a new DelaunayVertex = this + p
|
|
218
|
+
*/
|
|
219
|
+
public DelaunayVertex add(DelaunayVertex p) {
|
|
220
|
+
int len = dimCheck(p);
|
|
221
|
+
double[] coords = new double[len];
|
|
222
|
+
for (int i = 0; i < len; i++) {
|
|
223
|
+
coords[i] = this.coordinates[i] + p.coordinates[i];
|
|
224
|
+
}
|
|
225
|
+
return new DelaunayVertex(coords);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Angle (in radians) between two Pnts (treated as vectors).
|
|
230
|
+
*
|
|
231
|
+
* @param p
|
|
232
|
+
* the other DelaunayVertex
|
|
233
|
+
* @return the angle (in radians) between the two Pnts
|
|
234
|
+
*/
|
|
235
|
+
public double angle(DelaunayVertex p) {
|
|
236
|
+
return Math.acos(this.dot(p) / (this.magnitude() * p.magnitude()));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Perpendicular bisector of two Pnts. Works in any dimension. The
|
|
241
|
+
* coefficients are returned as a DelaunayVertex of one higher dimension
|
|
242
|
+
* (e.g., (A,B,C,D) for an equation of the form Ax + By + Cz + D = 0).
|
|
243
|
+
*
|
|
244
|
+
* @param point
|
|
245
|
+
* the other point
|
|
246
|
+
* @return the coefficients of the perpendicular bisector
|
|
247
|
+
*/
|
|
248
|
+
public DelaunayVertex bisector(DelaunayVertex point) {
|
|
249
|
+
dimCheck(point);
|
|
250
|
+
DelaunayVertex diff = this.subtract(point);
|
|
251
|
+
DelaunayVertex sum = this.add(point);
|
|
252
|
+
double dot = diff.dot(sum);
|
|
253
|
+
return diff.extend(-dot / 2);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* @param i
|
|
258
|
+
* @return the specified coordinate of this DelaunayVertex
|
|
259
|
+
* @throws ArrayIndexOutOfBoundsException
|
|
260
|
+
* for bad coordinate
|
|
261
|
+
*/
|
|
262
|
+
public double coord(int i) {
|
|
263
|
+
return this.coordinates[i];
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Check that dimensions match.
|
|
268
|
+
*
|
|
269
|
+
* @param p
|
|
270
|
+
* the DelaunayVertex to check (against this DelaunayVertex)
|
|
271
|
+
* @return the dimension of the Pnts
|
|
272
|
+
* @throws IllegalArgumentException
|
|
273
|
+
* if dimension fail to match
|
|
274
|
+
*/
|
|
275
|
+
public int dimCheck(DelaunayVertex p) {
|
|
276
|
+
int len = this.coordinates.length;
|
|
277
|
+
if (len != p.coordinates.length) {
|
|
278
|
+
throw new IllegalArgumentException("Dimension mismatch");
|
|
279
|
+
}
|
|
280
|
+
return len;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* @return this DelaunayVertex's dimension.
|
|
285
|
+
*/
|
|
286
|
+
public int dimension() {
|
|
287
|
+
return coordinates.length;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* Pnts as matrices */
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Dot product.
|
|
294
|
+
*
|
|
295
|
+
* @param p
|
|
296
|
+
* the other DelaunayVertex
|
|
297
|
+
* @return dot product of this DelaunayVertex and p
|
|
298
|
+
*/
|
|
299
|
+
public double dot(DelaunayVertex p) {
|
|
300
|
+
int len = dimCheck(p);
|
|
301
|
+
double sum = 0;
|
|
302
|
+
for (int i = 0; i < len; i++) {
|
|
303
|
+
sum += this.coordinates[i] * p.coordinates[i];
|
|
304
|
+
}
|
|
305
|
+
return sum;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
*
|
|
310
|
+
* @param other
|
|
311
|
+
* @return
|
|
312
|
+
*/
|
|
313
|
+
@Override
|
|
314
|
+
public boolean equals(Object other) {
|
|
315
|
+
if (!(other instanceof DelaunayVertex)) {
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
DelaunayVertex p = (DelaunayVertex) other;
|
|
319
|
+
if (this.coordinates.length != p.coordinates.length) {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
for (int i = 0; i < this.coordinates.length; i++) {
|
|
323
|
+
if (this.coordinates[i] != p.coordinates[i]) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
*
|
|
332
|
+
* @return
|
|
333
|
+
*/
|
|
334
|
+
@Override
|
|
335
|
+
public int hashCode() {
|
|
336
|
+
int hash = 7;
|
|
337
|
+
hash = 97 * hash + Arrays.hashCode(this.coordinates);
|
|
338
|
+
return hash;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Create a new DelaunayVertex by adding additional coordinates to this
|
|
343
|
+
* DelaunayVertex.
|
|
344
|
+
*
|
|
345
|
+
* @param coords
|
|
346
|
+
* the new coordinates (added on the right end)
|
|
347
|
+
* @return a new DelaunayVertex with the additional coordinates
|
|
348
|
+
*/
|
|
349
|
+
public DelaunayVertex extend(double... coords) {
|
|
350
|
+
double[] result = new double[coordinates.length + coords.length];
|
|
351
|
+
System.arraycopy(coordinates, 0, result, 0, coordinates.length);
|
|
352
|
+
System.arraycopy(coords, 0, result, coordinates.length, coords.length);
|
|
353
|
+
return new DelaunayVertex(result);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/* Pnts as simplices */
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Test if this DelaunayVertex is inside a simplex.
|
|
360
|
+
*
|
|
361
|
+
* @param simplex
|
|
362
|
+
* the simplex (an arary of Pnts)
|
|
363
|
+
* @return true iff this DelaunayVertex is inside simplex.
|
|
364
|
+
*/
|
|
365
|
+
public boolean isInside(DelaunayVertex[] simplex) {
|
|
366
|
+
int[] result = this.relation(simplex);
|
|
367
|
+
for (int r : result) {
|
|
368
|
+
if (r >= 0) {
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return true;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Test if this DelaunayVertex is on a simplex.
|
|
377
|
+
*
|
|
378
|
+
* @param simplex
|
|
379
|
+
* the simplex (an array of Pnts)
|
|
380
|
+
* @return the simplex DelaunayVertex that "witnesses" on-ness (or null if
|
|
381
|
+
* not on)
|
|
382
|
+
*/
|
|
383
|
+
public DelaunayVertex isOn(DelaunayVertex[] simplex) {
|
|
384
|
+
int[] result = this.relation(simplex);
|
|
385
|
+
DelaunayVertex witness = null;
|
|
386
|
+
for (int i = 0; i < result.length; i++) {
|
|
387
|
+
if (result[i] == 0) {
|
|
388
|
+
witness = simplex[i];
|
|
389
|
+
} else if (result[i] > 0) {
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return witness;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Test if this DelaunayVertex is outside of simplex.
|
|
398
|
+
*
|
|
399
|
+
* @param simplex
|
|
400
|
+
* the simplex (an array of Pnts)
|
|
401
|
+
* @return simplex DelaunayVertex that "witnesses" outsideness (or null if
|
|
402
|
+
* not outside)
|
|
403
|
+
*/
|
|
404
|
+
public DelaunayVertex isOutside(DelaunayVertex[] simplex) {
|
|
405
|
+
int[] result = this.relation(simplex);
|
|
406
|
+
for (int i = 0; i < result.length; i++) {
|
|
407
|
+
if (result[i] > 0) {
|
|
408
|
+
return simplex[i];
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Magnitude (as a vector).
|
|
416
|
+
*
|
|
417
|
+
* @return the Euclidean length of this vector
|
|
418
|
+
*/
|
|
419
|
+
public double magnitude() {
|
|
420
|
+
return Math.sqrt(this.dot(this));
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Relation between this DelaunayVertex and a simplex (represented as an
|
|
425
|
+
* array of Pnts). Result is an array of signs, one for each vertex of the
|
|
426
|
+
* simplex, indicating the relation between the vertex, the vertex's
|
|
427
|
+
* opposite facet, and this DelaunayVertex.
|
|
428
|
+
*
|
|
429
|
+
* <pre>
|
|
430
|
+
* -1 means DelaunayVertex is on same side of facet
|
|
431
|
+
* 0 means DelaunayVertex is on the facet
|
|
432
|
+
* +1 means DelaunayVertex is on opposite side of facet
|
|
433
|
+
* </pre>
|
|
434
|
+
*
|
|
435
|
+
* @param simplex
|
|
436
|
+
* an array of Pnts representing a simplex
|
|
437
|
+
* @return an array of signs showing relation between this DelaunayVertex
|
|
438
|
+
* and simplex
|
|
439
|
+
*/
|
|
440
|
+
public int[] relation(DelaunayVertex[] simplex) {
|
|
441
|
+
/*
|
|
442
|
+
* In 2D, we compute the cross of this matrix: 1 1 1 1 p0 a0 b0 c0 p1 a1
|
|
443
|
+
* b1 c1 where (a, b, c) is the simplex and p is this DelaunayVertex.
|
|
444
|
+
* The result is a vector in which the first coordinate is the signed
|
|
445
|
+
* area (all signed areas are off by the same constant factor) of the
|
|
446
|
+
* simplex and the remaining coordinates are the *negated* signed areas
|
|
447
|
+
* for the simplices in which p is substituted for each of the vertices.
|
|
448
|
+
* Analogous results occur in higher dimensions.
|
|
449
|
+
*/
|
|
450
|
+
int dim = simplex.length - 1;
|
|
451
|
+
if (this.dimension() != dim) {
|
|
452
|
+
throw new IllegalArgumentException("Dimension mismatch");
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/* Create and load the matrix */
|
|
456
|
+
DelaunayVertex[] matrix = new DelaunayVertex[dim + 1];
|
|
457
|
+
/* First row */
|
|
458
|
+
double[] coords = new double[dim + 2];
|
|
459
|
+
for (int j = 0; j < coords.length; j++) {
|
|
460
|
+
coords[j] = 1;
|
|
461
|
+
}
|
|
462
|
+
matrix[0] = new DelaunayVertex(coords);
|
|
463
|
+
/* Other rows */
|
|
464
|
+
for (int i = 0; i < dim; i++) {
|
|
465
|
+
coords[0] = this.coordinates[i];
|
|
466
|
+
for (int j = 0; j < simplex.length; j++) {
|
|
467
|
+
coords[j + 1] = simplex[j].coordinates[i];
|
|
468
|
+
}
|
|
469
|
+
matrix[i + 1] = new DelaunayVertex(coords);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/* Compute and analyze the vector of areas/volumes/contents */
|
|
473
|
+
DelaunayVertex vector = cross(matrix);
|
|
474
|
+
double content = vector.coordinates[0];
|
|
475
|
+
int[] result = new int[dim + 1];
|
|
476
|
+
for (int i = 0; i < result.length; i++) {
|
|
477
|
+
double value = vector.coordinates[i + 1];
|
|
478
|
+
if (Math.abs(value) <= 1.0e-6 * Math.abs(content)) {
|
|
479
|
+
result[i] = 0;
|
|
480
|
+
} else if (value < 0) {
|
|
481
|
+
result[i] = -1;
|
|
482
|
+
} else {
|
|
483
|
+
result[i] = 1;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
if (content < 0) {
|
|
487
|
+
for (int i = 0; i < result.length; i++) {
|
|
488
|
+
result[i] = -result[i];
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
if (content == 0) {
|
|
492
|
+
for (int i = 0; i < result.length; i++) {
|
|
493
|
+
result[i] = Math.abs(result[i]);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return result;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Subtract.
|
|
501
|
+
*
|
|
502
|
+
* @param p
|
|
503
|
+
* the other DelaunayVertex
|
|
504
|
+
* @return a new DelaunayVertex = this - p
|
|
505
|
+
*/
|
|
506
|
+
public DelaunayVertex subtract(DelaunayVertex p) {
|
|
507
|
+
int len = dimCheck(p);
|
|
508
|
+
double[] coords = new double[len];
|
|
509
|
+
for (int i = 0; i < len; i++) {
|
|
510
|
+
coords[i] = this.coordinates[i] - p.coordinates[i];
|
|
511
|
+
}
|
|
512
|
+
return new DelaunayVertex(coords);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
*
|
|
517
|
+
* @return
|
|
518
|
+
*/
|
|
519
|
+
@Override
|
|
520
|
+
public String toString() {
|
|
521
|
+
if (coordinates.length == 0) {
|
|
522
|
+
return "DelaunayVertex()";
|
|
523
|
+
}
|
|
524
|
+
String result = "DelaunayVertex(" + coordinates[0];
|
|
525
|
+
for (int i = 1; i < coordinates.length; i++) {
|
|
526
|
+
result = result + "," + coordinates[i];
|
|
527
|
+
}
|
|
528
|
+
result = result + ")";
|
|
529
|
+
return result;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
*
|
|
534
|
+
* @return
|
|
535
|
+
*/
|
|
536
|
+
public Vec2D toVec2D() {
|
|
537
|
+
return new Vec2D((float) coordinates[0], (float) coordinates[1]);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Test relation between this DelaunayVertex and circumcircle of a simplex.
|
|
542
|
+
*
|
|
543
|
+
* @param simplex
|
|
544
|
+
* the simplex (as an array of Pnts)
|
|
545
|
+
* @return -1, 0, or +1 for inside, on, or outside of circumcircle
|
|
546
|
+
*/
|
|
547
|
+
public int vsCircumcircle(DelaunayVertex[] simplex) {
|
|
548
|
+
DelaunayVertex[] matrix = new DelaunayVertex[simplex.length + 1];
|
|
549
|
+
for (int i = 0; i < simplex.length; i++) {
|
|
550
|
+
matrix[i] = simplex[i].extend(1, simplex[i].dot(simplex[i]));
|
|
551
|
+
}
|
|
552
|
+
matrix[simplex.length] = this.extend(1, this.dot(this));
|
|
553
|
+
double d = determinant(matrix);
|
|
554
|
+
int result = (d < 0) ? -1 : ((d > 0) ? +1 : 0);
|
|
555
|
+
if (content(simplex) < 0) {
|
|
556
|
+
result = -result;
|
|
557
|
+
}
|
|
558
|
+
return result;
|
|
559
|
+
}
|
|
560
|
+
}
|