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,91 @@
|
|
|
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.util.datatypes;
|
|
29
|
+
|
|
30
|
+
import java.util.HashMap;
|
|
31
|
+
import java.util.logging.Level;
|
|
32
|
+
import java.util.logging.Logger;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Implements a registry for dynamic singleton management. Use this registry
|
|
36
|
+
* instead of using "new" to enforce singletons of any class with a visible
|
|
37
|
+
* default constructor. The registry itself is implemented as singleton.
|
|
38
|
+
*/
|
|
39
|
+
public class SingletonRegistry {
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The singleton instance of the registry itself.
|
|
43
|
+
*/
|
|
44
|
+
public static final SingletonRegistry REGISTRY = new SingletonRegistry();
|
|
45
|
+
|
|
46
|
+
private static final HashMap<String, Object> map = new HashMap<>();
|
|
47
|
+
|
|
48
|
+
private static final Logger logger = Logger.getLogger(SingletonRegistry.class
|
|
49
|
+
.getName());
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Creates or returns an instance of the class requested by name.
|
|
53
|
+
*
|
|
54
|
+
* @param className
|
|
55
|
+
* @return class singleton instance
|
|
56
|
+
*/
|
|
57
|
+
public static synchronized Object getInstanceOf(String className) {
|
|
58
|
+
Object instance = map.get(className);
|
|
59
|
+
if (instance != null) {
|
|
60
|
+
return instance;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
instance = Class.forName(className).newInstance();
|
|
64
|
+
map.put(className, instance);
|
|
65
|
+
logger.log(Level.INFO, "Created singleton: {0}", instance);
|
|
66
|
+
} catch (ClassNotFoundException cnf) {
|
|
67
|
+
logger.log(Level.SEVERE, "Couldn''t find class: {0}", className);
|
|
68
|
+
} catch (InstantiationException ie) {
|
|
69
|
+
logger.log(Level.SEVERE, "Couldn''t instantiate the class: {0}", className);
|
|
70
|
+
} catch (IllegalAccessException ia) {
|
|
71
|
+
logger.log(Level.SEVERE, "Couldn''t access class: {0}", className);
|
|
72
|
+
}
|
|
73
|
+
return instance;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Alternative, more conventional accessor to the singleton instance of the
|
|
78
|
+
* registry itself.
|
|
79
|
+
*
|
|
80
|
+
* @return registry instance
|
|
81
|
+
*/
|
|
82
|
+
public static SingletonRegistry getRegistry() {
|
|
83
|
+
return REGISTRY;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
*
|
|
88
|
+
*/
|
|
89
|
+
protected SingletonRegistry() {
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
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.util.datatypes;
|
|
29
|
+
|
|
30
|
+
import java.io.FileInputStream;
|
|
31
|
+
import java.util.HashMap;
|
|
32
|
+
import java.util.Properties;
|
|
33
|
+
import java.util.StringTokenizer;
|
|
34
|
+
import java.util.logging.Level;
|
|
35
|
+
import java.util.logging.Logger;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Convenience wrapper providing typed access to Java {@link Properties} files.
|
|
39
|
+
*/
|
|
40
|
+
@SuppressWarnings("serial")
|
|
41
|
+
public class TypedProperties extends Properties {
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
public static final String DELIM = "\t\n\r\f\u00A0,";
|
|
47
|
+
|
|
48
|
+
private static final Logger logger = Logger.getLogger(TypedProperties.class
|
|
49
|
+
.getName());
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Returns a property as boolean.
|
|
53
|
+
*
|
|
54
|
+
* @param id
|
|
55
|
+
* property name
|
|
56
|
+
* @param defaultState
|
|
57
|
+
* @return prop value
|
|
58
|
+
*/
|
|
59
|
+
public boolean getBoolean(String id, boolean defaultState) {
|
|
60
|
+
return Boolean.parseBoolean(getProperty(id, "" + defaultState));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Shorthand wrapper for {@link #getByteArray(String, byte[])} automatically
|
|
65
|
+
* supplying an empty byte[] as default value.
|
|
66
|
+
*
|
|
67
|
+
* @param id
|
|
68
|
+
* @return prop values as array
|
|
69
|
+
*/
|
|
70
|
+
public byte[] getByteArray(String id) {
|
|
71
|
+
return getByteArray(id, new byte[0]);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Returns a comma delimited property value as byte[] array. Non-byte values
|
|
76
|
+
* will be ignored.
|
|
77
|
+
*
|
|
78
|
+
* @param id
|
|
79
|
+
* prop name
|
|
80
|
+
* @param defaultArray
|
|
81
|
+
* @return prop values as array
|
|
82
|
+
*/
|
|
83
|
+
public byte[] getByteArray(String id, byte[] defaultArray) {
|
|
84
|
+
StringTokenizer tokenizer = new StringTokenizer(getProperty(id, ""),
|
|
85
|
+
DELIM);
|
|
86
|
+
byte[] pieces = new byte[tokenizer.countTokens()];
|
|
87
|
+
int index = 0;
|
|
88
|
+
while (tokenizer.hasMoreTokens()) {
|
|
89
|
+
try {
|
|
90
|
+
pieces[index] = Byte.parseByte(tokenizer.nextToken());
|
|
91
|
+
index++;
|
|
92
|
+
} catch (NumberFormatException e) {
|
|
93
|
+
// ignore non-integer items
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (index > 0) {
|
|
97
|
+
byte[] result = new byte[index];
|
|
98
|
+
System.arraycopy(pieces, 0, result, 0, index);
|
|
99
|
+
return result;
|
|
100
|
+
} else {
|
|
101
|
+
return defaultArray;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Returns a property as float.
|
|
107
|
+
*
|
|
108
|
+
* @param id
|
|
109
|
+
* @param defaultValue
|
|
110
|
+
* @return prop value
|
|
111
|
+
*/
|
|
112
|
+
public float getFloat(String id, float defaultValue) {
|
|
113
|
+
return Float.parseFloat(getProperty(id, "" + defaultValue));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Shorthand wrapper for {@link #getFloatArray(String, float[])}
|
|
118
|
+
* automatically supplying an empty float[] array as default value.
|
|
119
|
+
*
|
|
120
|
+
* @param id
|
|
121
|
+
* @return prop values as array
|
|
122
|
+
*/
|
|
123
|
+
public float[] getFloatArray(String id) {
|
|
124
|
+
return getFloatArray(id, new float[0]);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Returns a comma delimited property value as float[] array.
|
|
129
|
+
*
|
|
130
|
+
* @param id
|
|
131
|
+
* prop name
|
|
132
|
+
* @param defaultArray
|
|
133
|
+
* @return prop items as array
|
|
134
|
+
*/
|
|
135
|
+
public float[] getFloatArray(String id, float[] defaultArray) {
|
|
136
|
+
StringTokenizer tokenizer = new StringTokenizer(getProperty(id, ""),
|
|
137
|
+
DELIM);
|
|
138
|
+
float pieces[] = new float[tokenizer.countTokens()];
|
|
139
|
+
int index = 0;
|
|
140
|
+
while (tokenizer.hasMoreTokens()) {
|
|
141
|
+
try {
|
|
142
|
+
pieces[index] = Float.parseFloat(tokenizer.nextToken());
|
|
143
|
+
index++;
|
|
144
|
+
} catch (NumberFormatException e) {
|
|
145
|
+
// ignore NaN items
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (index > 0) {
|
|
149
|
+
float[] result = new float[index];
|
|
150
|
+
System.arraycopy(pieces, 0, result, 0, index);
|
|
151
|
+
return result;
|
|
152
|
+
} else {
|
|
153
|
+
return defaultArray;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Returns a hexadecimal property as integer
|
|
159
|
+
*
|
|
160
|
+
* @param id
|
|
161
|
+
* prop name
|
|
162
|
+
* @param defaultValue
|
|
163
|
+
* @return prop value
|
|
164
|
+
*/
|
|
165
|
+
public int getHexInt(String id, int defaultValue) {
|
|
166
|
+
return Integer.parseInt(
|
|
167
|
+
getProperty(id, Integer.toHexString(defaultValue)), 16);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Returns a property as integer.
|
|
172
|
+
*
|
|
173
|
+
* @param id
|
|
174
|
+
* property name
|
|
175
|
+
* @param defaultValue
|
|
176
|
+
* @return prop value
|
|
177
|
+
*/
|
|
178
|
+
public int getInt(String id, int defaultValue) {
|
|
179
|
+
return Integer.parseInt(getProperty(id, "" + defaultValue));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Shorthand wrapper for {{@link #getIntArray(String, int[])} automatically
|
|
184
|
+
* supplying an empty int[] array as default value.
|
|
185
|
+
*
|
|
186
|
+
* @param id
|
|
187
|
+
* @return prop values as array
|
|
188
|
+
*/
|
|
189
|
+
public int[] getIntArray(String id) {
|
|
190
|
+
return getIntArray(id, new int[0]);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Returns a comma delimited property value as int[] array. Non-integer
|
|
195
|
+
* items will be ignored.
|
|
196
|
+
*
|
|
197
|
+
* @param id
|
|
198
|
+
* prop name
|
|
199
|
+
* @param defaultArray
|
|
200
|
+
* @return prop items as array
|
|
201
|
+
*/
|
|
202
|
+
public int[] getIntArray(String id, int[] defaultArray) {
|
|
203
|
+
StringTokenizer tokenizer = new StringTokenizer(getProperty(id, ""),
|
|
204
|
+
DELIM);
|
|
205
|
+
int pieces[] = new int[tokenizer.countTokens()];
|
|
206
|
+
int index = 0;
|
|
207
|
+
while (tokenizer.hasMoreTokens()) {
|
|
208
|
+
try {
|
|
209
|
+
pieces[index] = Integer.parseInt(tokenizer.nextToken());
|
|
210
|
+
index++;
|
|
211
|
+
} catch (NumberFormatException e) {
|
|
212
|
+
// ignore non-integer items
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (index > 0) {
|
|
216
|
+
int[] result = new int[index];
|
|
217
|
+
System.arraycopy(pieces, 0, result, 0, index);
|
|
218
|
+
return result;
|
|
219
|
+
} else {
|
|
220
|
+
return defaultArray;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
*
|
|
226
|
+
* @param id
|
|
227
|
+
* @return
|
|
228
|
+
*/
|
|
229
|
+
public String[] getStringArray(String id) {
|
|
230
|
+
return getStringArray(id, new String[0]);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
*
|
|
235
|
+
* @param id
|
|
236
|
+
* @param defaultArray
|
|
237
|
+
* @return
|
|
238
|
+
*/
|
|
239
|
+
public String[] getStringArray(String id, String[] defaultArray) {
|
|
240
|
+
StringTokenizer tokenizer = new StringTokenizer(getProperty(id, ""),
|
|
241
|
+
DELIM);
|
|
242
|
+
int index = 0;
|
|
243
|
+
String[] pieces = null;
|
|
244
|
+
while (tokenizer.hasMoreTokens()) {
|
|
245
|
+
if (pieces == null) {
|
|
246
|
+
pieces = new String[tokenizer.countTokens()];
|
|
247
|
+
}
|
|
248
|
+
String token = tokenizer.nextToken();
|
|
249
|
+
if (token.length() > 0) {
|
|
250
|
+
pieces[index++] = token;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (index > 0) {
|
|
254
|
+
String[] result = new String[index];
|
|
255
|
+
System.arraycopy(pieces, 0, result, 0, index);
|
|
256
|
+
return result;
|
|
257
|
+
} else {
|
|
258
|
+
return defaultArray;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Attempts to load properties from the specified (absolute) file path (In
|
|
264
|
+
* Processing use sketchPath() or dataPath() to build absolute path).
|
|
265
|
+
*
|
|
266
|
+
* @param path
|
|
267
|
+
* config file
|
|
268
|
+
* @return true, if successful.
|
|
269
|
+
*/
|
|
270
|
+
public boolean load(String path) {
|
|
271
|
+
try {
|
|
272
|
+
load(new FileInputStream(path));
|
|
273
|
+
return true;
|
|
274
|
+
} catch (Exception e) {
|
|
275
|
+
logger.log(Level.WARNING, "error opening config file: {0}", path);
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
*
|
|
282
|
+
* @return
|
|
283
|
+
*/
|
|
284
|
+
public HashMap<String, String> toHashMap() {
|
|
285
|
+
HashMap<String, String> map = new HashMap<>();
|
|
286
|
+
for (String id : stringPropertyNames()) {
|
|
287
|
+
map.put(id, getProperty(id));
|
|
288
|
+
}
|
|
289
|
+
return map;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
package toxi.util.datatypes;
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) 2007 by L. Paul Chew.
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, without written agreement and without
|
|
7
|
+
* license or royalty fees, to use, copy, modify, and distribute this
|
|
8
|
+
* software and its documentation for any purpose, subject to the following
|
|
9
|
+
* conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included
|
|
12
|
+
* in all copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
15
|
+
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
19
|
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
20
|
+
* DEALINGS IN THE SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import java.util.Collections;
|
|
24
|
+
import java.util.HashMap;
|
|
25
|
+
import java.util.Map;
|
|
26
|
+
import java.util.Set;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Straightforward undirected graph implementation. Nodes are generic type N.
|
|
30
|
+
*
|
|
31
|
+
* @author Paul Chew Created November, December 2007. For use in
|
|
32
|
+
* Delaunay/Voronoi code.
|
|
33
|
+
* @author toxi Updated July 2010, minor API changes to be better suited for
|
|
34
|
+
* toxiclibs
|
|
35
|
+
* @param <N>
|
|
36
|
+
*/
|
|
37
|
+
public class UndirectedGraph<N> {
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
*
|
|
41
|
+
*/
|
|
42
|
+
protected Map<N, Set<N>> nodeLinks = new HashMap<>();
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
*/
|
|
47
|
+
protected Set<N> nodeIDs = Collections.unmodifiableSet(nodeLinks.keySet());
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Add a node. If node is already in graph then no change.
|
|
51
|
+
*
|
|
52
|
+
* @param node
|
|
53
|
+
* the node to add
|
|
54
|
+
*/
|
|
55
|
+
public void add(N node) {
|
|
56
|
+
if (nodeLinks.containsKey(node)) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
nodeLinks.put(node, new ArraySet<N>());
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Add a link. If the link is already in graph then no change.
|
|
64
|
+
*
|
|
65
|
+
* @param nodeA
|
|
66
|
+
* one end of the link
|
|
67
|
+
* @param nodeB
|
|
68
|
+
* the other end of the link
|
|
69
|
+
* @throws NullPointerException
|
|
70
|
+
* if either endpoint is not in graph
|
|
71
|
+
*/
|
|
72
|
+
public void connect(N nodeA, N nodeB) throws NullPointerException {
|
|
73
|
+
nodeLinks.get(nodeA).add(nodeB);
|
|
74
|
+
nodeLinks.get(nodeB).add(nodeA);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Remove the specified link. If link not in graph, nothing happens.
|
|
79
|
+
*
|
|
80
|
+
* @param nodeA
|
|
81
|
+
* one end of the link
|
|
82
|
+
* @param nodeB
|
|
83
|
+
* the other end of the link
|
|
84
|
+
* @throws NullPointerException
|
|
85
|
+
* if either endpoint is not in graph
|
|
86
|
+
*/
|
|
87
|
+
public void disconnect(N nodeA, N nodeB) throws NullPointerException {
|
|
88
|
+
nodeLinks.get(nodeA).remove(nodeB);
|
|
89
|
+
nodeLinks.get(nodeB).remove(nodeA);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Report all the neighbors of node.
|
|
94
|
+
*
|
|
95
|
+
* @param node
|
|
96
|
+
* the node
|
|
97
|
+
* @return the neighbors of node
|
|
98
|
+
* @throws NullPointerException
|
|
99
|
+
* if node does not appear in graph
|
|
100
|
+
*/
|
|
101
|
+
public Set<N> getConnectedNodesFor(N node) throws NullPointerException {
|
|
102
|
+
return Collections.unmodifiableSet(nodeLinks.get(node));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Returns an unmodifiable Set view of the nodes contained in this graph.
|
|
107
|
+
* The set is backed by the graph, so changes to the graph are reflected in
|
|
108
|
+
* the set.
|
|
109
|
+
*
|
|
110
|
+
* @return a Set view of the graph's node set
|
|
111
|
+
*/
|
|
112
|
+
public Set<N> getNodes() {
|
|
113
|
+
return nodeIDs;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Remove node and any links that use node. If node not in graph, nothing
|
|
118
|
+
* happens.
|
|
119
|
+
*
|
|
120
|
+
* @param node
|
|
121
|
+
* the node to remove.
|
|
122
|
+
*/
|
|
123
|
+
public void remove(N node) {
|
|
124
|
+
if (!nodeLinks.containsKey(node)) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (N neighbor : nodeLinks.get(node)) {
|
|
128
|
+
nodeLinks.get(neighbor).remove(node);
|
|
129
|
+
}
|
|
130
|
+
nodeLinks.get(node).clear();
|
|
131
|
+
nodeLinks.remove(node);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
}
|