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,120 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* jgeom: Geometry Library fo Java
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2005 Samuel Gerber
|
|
5
|
+
*
|
|
6
|
+
* This program is free software; you can redistribute it and/or
|
|
7
|
+
* modify it under the terms of the GNU General Public License
|
|
8
|
+
* as published by the Free Software Foundation; either version 2
|
|
9
|
+
* of the License, or (at your option) any later version.
|
|
10
|
+
*
|
|
11
|
+
* This program is distributed in the hope that it will be useful,
|
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
* GNU General Public License for more details.
|
|
15
|
+
*
|
|
16
|
+
* You should have received a copy of the GNU General Public License
|
|
17
|
+
* along with this program; if not, write to the Free Software
|
|
18
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
19
|
+
*/
|
|
20
|
+
package toxi.geom.nurbs;
|
|
21
|
+
|
|
22
|
+
import toxi.geom.Polygon2D;
|
|
23
|
+
import toxi.geom.Vec3D;
|
|
24
|
+
import toxi.geom.Vec4D;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Interface for Nurbs Curves
|
|
28
|
+
*
|
|
29
|
+
* @author sg
|
|
30
|
+
* @version 1.0
|
|
31
|
+
*/
|
|
32
|
+
public interface NurbsCurve {
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Computes control points of dth derivative<br />
|
|
36
|
+
* Piegel, L. The Nurbs Book<br />
|
|
37
|
+
* Algorithm A3.3 -> Page 98<br />
|
|
38
|
+
* <br />
|
|
39
|
+
*
|
|
40
|
+
* @param d
|
|
41
|
+
* - dth derivative<br />
|
|
42
|
+
* @param r1
|
|
43
|
+
* - from control point (0 for all control points)<br />
|
|
44
|
+
* @param r2
|
|
45
|
+
* - to control point (n for all control points)<br />
|
|
46
|
+
* @return Vec4D[k][i] kth derivative, ith control point
|
|
47
|
+
*/
|
|
48
|
+
public Vec4D[][] curveDerivCpts(int d, int r1, int r2);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
* @param u
|
|
53
|
+
* @param d
|
|
54
|
+
* @return
|
|
55
|
+
*/
|
|
56
|
+
public abstract Vec3D[] derivativesOnCurve(float u, int d);
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
* @param u
|
|
61
|
+
* @param d
|
|
62
|
+
* @param ders
|
|
63
|
+
* @return
|
|
64
|
+
*/
|
|
65
|
+
public abstract Vec3D[] derivativesOnCurve(float u, int d, Vec3D[] ders);
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Get the ControlPoints of this curve
|
|
69
|
+
*
|
|
70
|
+
* @return the ordered ControlPoints
|
|
71
|
+
*/
|
|
72
|
+
Vec4D[] getControlPoints();
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get the Degree of the curve
|
|
76
|
+
*
|
|
77
|
+
* @return degree of curve
|
|
78
|
+
*/
|
|
79
|
+
int getDegree();
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Gets the Knot values of the Nurbs curve
|
|
83
|
+
*
|
|
84
|
+
* @return knot values
|
|
85
|
+
*/
|
|
86
|
+
float[] getKnots();
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
*
|
|
90
|
+
* @return
|
|
91
|
+
*/
|
|
92
|
+
KnotVector getKnotVector();
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Calculate point on surface for the given u value
|
|
96
|
+
*
|
|
97
|
+
* @param u
|
|
98
|
+
* value to calculate point of
|
|
99
|
+
* @return calculated Point
|
|
100
|
+
*/
|
|
101
|
+
Vec3D pointOnCurve(float u);
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Calculate point on surface for the given u value
|
|
105
|
+
*
|
|
106
|
+
* @param u
|
|
107
|
+
* value to calculate point of
|
|
108
|
+
* @param out
|
|
109
|
+
* Point to place result in
|
|
110
|
+
* @return
|
|
111
|
+
*/
|
|
112
|
+
Vec3D pointOnCurve(float u, Vec3D out);
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
*
|
|
116
|
+
* @param res
|
|
117
|
+
* @return
|
|
118
|
+
*/
|
|
119
|
+
Polygon2D toPolygon2D(int res);
|
|
120
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
package toxi.geom.nurbs;
|
|
2
|
+
|
|
3
|
+
import toxi.geom.Vec2D;
|
|
4
|
+
import toxi.geom.Vec3D;
|
|
5
|
+
import toxi.geom.mesh.Mesh3D;
|
|
6
|
+
import toxi.geom.mesh.TriangleMesh;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @author tux
|
|
11
|
+
*/
|
|
12
|
+
public class NurbsMeshCreator {
|
|
13
|
+
|
|
14
|
+
private NurbsSurface surf;
|
|
15
|
+
private Vec2D maxUV;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
* @param surf
|
|
20
|
+
*/
|
|
21
|
+
public NurbsMeshCreator(NurbsSurface surf) {
|
|
22
|
+
this(surf, new Vec2D(1, 1));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
* @param surf
|
|
28
|
+
* @param maxUV
|
|
29
|
+
*/
|
|
30
|
+
public NurbsMeshCreator(NurbsSurface surf, Vec2D maxUV) {
|
|
31
|
+
this.surf = surf;
|
|
32
|
+
this.maxUV = maxUV;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
*
|
|
37
|
+
* @param mesh
|
|
38
|
+
* @return
|
|
39
|
+
*/
|
|
40
|
+
public Mesh3D createControlMesh(Mesh3D mesh) {
|
|
41
|
+
Vec3D[] prev = null;
|
|
42
|
+
if (mesh == null) {
|
|
43
|
+
mesh = new TriangleMesh();
|
|
44
|
+
}
|
|
45
|
+
int resU = surf.getControlNet().uLength();
|
|
46
|
+
int resV = surf.getControlNet().vLength();
|
|
47
|
+
Vec2D dUV = maxUV.scale(1f / resU, 1f / resV);
|
|
48
|
+
for (int u = 0; u < resU; u++) {
|
|
49
|
+
Vec3D[] curr = new Vec3D[resV + 1];
|
|
50
|
+
for (int v = 0; v < resV; v++) {
|
|
51
|
+
Vec3D vert = surf.getControlNet().get(u, v).to3D();
|
|
52
|
+
if (v > 0 && u > 0) {
|
|
53
|
+
mesh.addFace(curr[v - 1], vert, prev[v - 1],
|
|
54
|
+
dUV.scale(u, v - 1), dUV.scale(u, v),
|
|
55
|
+
dUV.scale(u - 1, v - 1));
|
|
56
|
+
mesh.addFace(vert, prev[v], prev[v - 1], dUV.scale(u, v),
|
|
57
|
+
dUV.scale(u - 1, v), dUV.scale(u - 1, v - 1));
|
|
58
|
+
}
|
|
59
|
+
curr[v] = vert;
|
|
60
|
+
}
|
|
61
|
+
prev = curr;
|
|
62
|
+
}
|
|
63
|
+
mesh.computeVertexNormals();
|
|
64
|
+
return mesh;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
*
|
|
69
|
+
* @param mesh
|
|
70
|
+
* @param resU
|
|
71
|
+
* @param resV
|
|
72
|
+
* @param isClosed
|
|
73
|
+
* @return
|
|
74
|
+
*/
|
|
75
|
+
public Mesh3D createMesh(Mesh3D mesh, int resU, int resV, boolean isClosed) {
|
|
76
|
+
final KnotVector knotU = surf.getUKnotVector();
|
|
77
|
+
final KnotVector knotV = surf.getVKnotVector();
|
|
78
|
+
double iresU = knotU.get(knotU.length() - 1) / resU;
|
|
79
|
+
double iresV = knotV.get(knotV.length() - 1) / resV;
|
|
80
|
+
Vec3D[] prev = null;
|
|
81
|
+
Vec3D[] first = null;
|
|
82
|
+
if (mesh == null) {
|
|
83
|
+
mesh = new TriangleMesh();
|
|
84
|
+
}
|
|
85
|
+
Vec2D dUV = maxUV.scale(1f / resU, 1f / resV);
|
|
86
|
+
for (int u = 0; u <= resU; u++) {
|
|
87
|
+
Vec3D[] curr = new Vec3D[resV + 1];
|
|
88
|
+
for (int v = 0; v <= resV; v++) {
|
|
89
|
+
Vec3D vert = null;
|
|
90
|
+
if (isClosed) {
|
|
91
|
+
vert = u < resU ? surf.pointOnSurface(u * iresU, v * iresV)
|
|
92
|
+
: first[v];
|
|
93
|
+
} else {
|
|
94
|
+
vert = surf.pointOnSurface(u * iresU, v * iresV);
|
|
95
|
+
}
|
|
96
|
+
if (v > 0 && u > 0) {
|
|
97
|
+
mesh.addFace(curr[v - 1], vert, prev[v - 1],
|
|
98
|
+
dUV.scale(u, v - 1), dUV.scale(u, v),
|
|
99
|
+
dUV.scale(u - 1, v - 1));
|
|
100
|
+
mesh.addFace(vert, prev[v], prev[v - 1], dUV.scale(u, v),
|
|
101
|
+
dUV.scale(u - 1, v), dUV.scale(u - 1, v - 1));
|
|
102
|
+
}
|
|
103
|
+
curr[v] = vert;
|
|
104
|
+
}
|
|
105
|
+
prev = curr;
|
|
106
|
+
if (u == 0) {
|
|
107
|
+
first = curr;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
mesh.computeVertexNormals();
|
|
111
|
+
return mesh;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
*
|
|
116
|
+
* @return
|
|
117
|
+
*/
|
|
118
|
+
public NurbsSurface getSurface() {
|
|
119
|
+
return surf;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
*
|
|
124
|
+
* @return
|
|
125
|
+
*/
|
|
126
|
+
public Vec2D getUVScale() {
|
|
127
|
+
return maxUV;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
*
|
|
132
|
+
* @param surf
|
|
133
|
+
*/
|
|
134
|
+
public void setSurface(NurbsSurface surf) {
|
|
135
|
+
this.surf = surf;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
*
|
|
140
|
+
* @param maxUV
|
|
141
|
+
*/
|
|
142
|
+
public void setUVScale(Vec2D maxUV) {
|
|
143
|
+
this.maxUV = maxUV;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* jgeom: Geometry Library fo Java
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2005 Samuel Gerber
|
|
5
|
+
*
|
|
6
|
+
* This program is free software; you can redistribute it and/or
|
|
7
|
+
* modify it under the terms of the GNU General Public License
|
|
8
|
+
* as published by the Free Software Foundation; either version 2
|
|
9
|
+
* of the License, or (at your option) any later version.
|
|
10
|
+
*
|
|
11
|
+
* This program is distributed in the hope that it will be useful,
|
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
* GNU General Public License for more details.
|
|
15
|
+
*
|
|
16
|
+
* You should have received a copy of the GNU General Public License
|
|
17
|
+
* along with this program; if not, write to the Free Software
|
|
18
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
19
|
+
*/
|
|
20
|
+
package toxi.geom.nurbs;
|
|
21
|
+
|
|
22
|
+
import toxi.geom.Vec3D;
|
|
23
|
+
import toxi.geom.Vec4D;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Interface for Nurbs Surfaces.
|
|
27
|
+
*
|
|
28
|
+
* @author sg
|
|
29
|
+
* @version 1.2
|
|
30
|
+
*/
|
|
31
|
+
public interface NurbsSurface {
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Get the Contol points of the NurbsSurface
|
|
35
|
+
*
|
|
36
|
+
* @return ControlNet of the Nurbs
|
|
37
|
+
*/
|
|
38
|
+
ControlNet getControlNet();
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get a List of all TrimCurves asociated with this Nurbs Surface
|
|
42
|
+
*
|
|
43
|
+
* @return List of TrimCurves
|
|
44
|
+
*/
|
|
45
|
+
// List<TrimCurve> getTrimCurves();
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Get the degree in u direction
|
|
49
|
+
*
|
|
50
|
+
* @return degree in u direction
|
|
51
|
+
*/
|
|
52
|
+
int getUDegree();
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get the knot values in u direction
|
|
56
|
+
*
|
|
57
|
+
* @return knot values in u direction
|
|
58
|
+
*/
|
|
59
|
+
float[] getUKnots();
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
*
|
|
63
|
+
* @return
|
|
64
|
+
*/
|
|
65
|
+
public abstract KnotVector getUKnotVector();
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Get the degree in v direction
|
|
69
|
+
*
|
|
70
|
+
* @return degree in v direction
|
|
71
|
+
*/
|
|
72
|
+
int getVDegree();
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get the knot values in v direction
|
|
76
|
+
*
|
|
77
|
+
* @return knot values in v direction
|
|
78
|
+
*/
|
|
79
|
+
float[] getVKnots();
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
* @return
|
|
84
|
+
*/
|
|
85
|
+
public abstract KnotVector getVKnotVector();
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
*
|
|
89
|
+
* @param u
|
|
90
|
+
* @param v
|
|
91
|
+
* @return
|
|
92
|
+
*/
|
|
93
|
+
public abstract Vec3D pointOnSurface(double u, double v);
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Calculate point on surface for the given u and v values
|
|
97
|
+
*
|
|
98
|
+
* @param u
|
|
99
|
+
* u value to caculate point from
|
|
100
|
+
* @param v
|
|
101
|
+
* v value to caculate point from
|
|
102
|
+
* @return calculated point
|
|
103
|
+
*/
|
|
104
|
+
Vec3D pointOnSurface(float u, float v);
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Add a TrimCurve to this Nurbs Surface
|
|
108
|
+
*
|
|
109
|
+
* @param tc
|
|
110
|
+
* TrimCurve to add.
|
|
111
|
+
*/
|
|
112
|
+
// void addTrimCurve(TrimCurve tc);
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Calculate point on surface for the given u and v values
|
|
116
|
+
*
|
|
117
|
+
* @param u
|
|
118
|
+
* u value to caculate point from
|
|
119
|
+
* @param v
|
|
120
|
+
* v value to caculate point from
|
|
121
|
+
* @param out
|
|
122
|
+
* point to place result in.
|
|
123
|
+
* @return
|
|
124
|
+
*/
|
|
125
|
+
Vec3D pointOnSurface(float u, float v, Vec3D out);
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Computes control points of dth derivative<br />
|
|
129
|
+
* Piegel, L. The Nurbs Book, Algorithm A3.7 -> Page 114<br />
|
|
130
|
+
*
|
|
131
|
+
* @param d
|
|
132
|
+
* - dth derivative (0<=k+l<=d)<br />
|
|
133
|
+
* @param r1
|
|
134
|
+
* - from control point (u direction; 0 for all control points)<br />
|
|
135
|
+
* @param r2
|
|
136
|
+
* - to control point (u direction; n for all control points)<br />
|
|
137
|
+
* @param s1
|
|
138
|
+
* - from control point (v direction; 0 for all control points)<br />
|
|
139
|
+
* @param s2
|
|
140
|
+
* - to control point (v direction; n for all control points)<br />
|
|
141
|
+
* @return ControlPoint4f[k][l][i][j] i,jth control point, differentiated k
|
|
142
|
+
* times<br />
|
|
143
|
+
* with respect to u and l times with respect to v
|
|
144
|
+
*/
|
|
145
|
+
public Vec4D[][][][] surfaceDerivCpts(int d, int r1, int r2, int s1, int s2);
|
|
146
|
+
|
|
147
|
+
}
|
|
@@ -0,0 +1,331 @@
|
|
|
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.image.util;
|
|
29
|
+
|
|
30
|
+
import processing.core.PImage;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Filter8bit is a collection of non-destructive, threadsafe filters for
|
|
34
|
+
* grayscale images in Processing PImage format. All filters are implemented as
|
|
35
|
+
* static methods so no instance is needed.
|
|
36
|
+
*
|
|
37
|
+
* @version 0.1
|
|
38
|
+
*/
|
|
39
|
+
public class Filter8bit {
|
|
40
|
+
|
|
41
|
+
private static int[] koff;
|
|
42
|
+
|
|
43
|
+
private static int prevKernelSize = -1;
|
|
44
|
+
|
|
45
|
+
private static int prevWidth = -1;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
*
|
|
49
|
+
* @param pix
|
|
50
|
+
* @param width
|
|
51
|
+
* @param height
|
|
52
|
+
* @param kernelSize
|
|
53
|
+
* @param filterConst
|
|
54
|
+
* @return
|
|
55
|
+
*/
|
|
56
|
+
public static int[] adaptiveThreshold(int[] pix, int width, int height,
|
|
57
|
+
int kernelSize, int filterConst) {
|
|
58
|
+
int maxIdx = pix.length;
|
|
59
|
+
int[] dest = new int[maxIdx];
|
|
60
|
+
int kl = kernelSize * kernelSize;
|
|
61
|
+
int ck = kernelSize >> 1;
|
|
62
|
+
if (kl != prevKernelSize || width != prevWidth) {
|
|
63
|
+
System.out.println("recalc threshold filter kernel");
|
|
64
|
+
koff = new int[kl];
|
|
65
|
+
prevKernelSize = kl;
|
|
66
|
+
prevWidth = width;
|
|
67
|
+
for (int k = 0, off = -width * ck - ck; k < kl; k++) {
|
|
68
|
+
koff[k] = off;
|
|
69
|
+
if ((k % kernelSize) == kernelSize - 1) {
|
|
70
|
+
off += width - kernelSize + 1;
|
|
71
|
+
} else {
|
|
72
|
+
off++;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (int i = 0; i < maxIdx; i++) {
|
|
77
|
+
int mean = 0;
|
|
78
|
+
for (int k = 0; k < kl; k++) {
|
|
79
|
+
int idx = i + koff[k];
|
|
80
|
+
if (idx >= 0 && idx < maxIdx) {
|
|
81
|
+
mean += pix[idx] & 0xff;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
mean = (mean / kl) - filterConst;
|
|
85
|
+
if ((pix[i] & 0xff) > mean) {
|
|
86
|
+
dest[i] = 0xff0000ff;
|
|
87
|
+
} else {
|
|
88
|
+
dest[i] = 0xff000000;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return dest;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Non-destructively applies an adaptive thresholding filter to the passed
|
|
96
|
+
* in image (grayscale only). Filter8bit only uses data stored in the blue
|
|
97
|
+
* channel of the image (lowest 8 bit).
|
|
98
|
+
*
|
|
99
|
+
* @param img
|
|
100
|
+
* image to be filtered
|
|
101
|
+
* @param ks
|
|
102
|
+
* kernel size
|
|
103
|
+
* @param c
|
|
104
|
+
* constant integer value to be subtracted from kernel result
|
|
105
|
+
* @return filtered version of the image (with alpha channel set to full
|
|
106
|
+
* opacity)
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
public static PImage adaptiveThreshold(PImage img, int ks, int c) {
|
|
110
|
+
PImage img2 = new PImage(img.width, img.height);
|
|
111
|
+
img2.format = img.format;
|
|
112
|
+
img2.pixels = adaptiveThreshold(img.pixels, img.width, img.height, ks,
|
|
113
|
+
c);
|
|
114
|
+
return img2;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @param pixels
|
|
119
|
+
* @param width
|
|
120
|
+
* @param height
|
|
121
|
+
* @param isInverted
|
|
122
|
+
* @return filtered pixel array
|
|
123
|
+
*/
|
|
124
|
+
public static int[] erodePixels(int[] pixels, int width, int height,
|
|
125
|
+
boolean isInverted) {
|
|
126
|
+
int currIdx = 0;
|
|
127
|
+
int maxIdx = pixels.length;
|
|
128
|
+
int[] out = new int[maxIdx];
|
|
129
|
+
|
|
130
|
+
if (isInverted) {
|
|
131
|
+
// dilation (grow light areas)
|
|
132
|
+
while (currIdx < maxIdx) {
|
|
133
|
+
int currRowIdx = currIdx;
|
|
134
|
+
int maxRowIdx = currIdx + width;
|
|
135
|
+
while (currIdx < maxRowIdx) {
|
|
136
|
+
int colOrig, colOut;
|
|
137
|
+
colOrig = colOut = pixels[currIdx];
|
|
138
|
+
int idxLeft = currIdx - 1;
|
|
139
|
+
int idxRight = currIdx + 1;
|
|
140
|
+
int idxUp = currIdx - width;
|
|
141
|
+
int idxDown = currIdx + width;
|
|
142
|
+
if (idxLeft < currRowIdx) {
|
|
143
|
+
idxLeft = currIdx;
|
|
144
|
+
}
|
|
145
|
+
if (idxRight >= maxRowIdx) {
|
|
146
|
+
idxRight = currIdx;
|
|
147
|
+
}
|
|
148
|
+
if (idxUp < 0) {
|
|
149
|
+
idxUp = 0;
|
|
150
|
+
}
|
|
151
|
+
if (idxDown >= maxIdx) {
|
|
152
|
+
idxDown = currIdx;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
int colUp = pixels[idxUp];
|
|
156
|
+
int colLeft = pixels[idxLeft];
|
|
157
|
+
int colDown = pixels[idxDown];
|
|
158
|
+
int colRight = pixels[idxRight];
|
|
159
|
+
|
|
160
|
+
// compute luminance
|
|
161
|
+
int currLum = colOrig & 0xff;
|
|
162
|
+
int lumLeft = colLeft & 0xff;
|
|
163
|
+
int lumRight = colRight & 0xff;
|
|
164
|
+
int lumUp = colUp & 0xff;
|
|
165
|
+
int lumDown = colDown & 0xff;
|
|
166
|
+
|
|
167
|
+
if (lumLeft > currLum) {
|
|
168
|
+
colOut = colLeft;
|
|
169
|
+
currLum = lumLeft;
|
|
170
|
+
}
|
|
171
|
+
if (lumRight > currLum) {
|
|
172
|
+
colOut = colRight;
|
|
173
|
+
currLum = lumRight;
|
|
174
|
+
}
|
|
175
|
+
if (lumUp > currLum) {
|
|
176
|
+
colOut = colUp;
|
|
177
|
+
currLum = lumUp;
|
|
178
|
+
}
|
|
179
|
+
if (lumDown > currLum) {
|
|
180
|
+
colOut = colDown;
|
|
181
|
+
currLum = lumDown;
|
|
182
|
+
}
|
|
183
|
+
out[currIdx++] = colOut;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
} else {
|
|
187
|
+
// erode (grow dark areas)
|
|
188
|
+
while (currIdx < maxIdx) {
|
|
189
|
+
int currRowIdx = currIdx;
|
|
190
|
+
int maxRowIdx = currIdx + width;
|
|
191
|
+
while (currIdx < maxRowIdx) {
|
|
192
|
+
int colOrig, colOut;
|
|
193
|
+
colOrig = colOut = pixels[currIdx];
|
|
194
|
+
int idxLeft = currIdx - 1;
|
|
195
|
+
int idxRight = currIdx + 1;
|
|
196
|
+
int idxUp = currIdx - width;
|
|
197
|
+
int idxDown = currIdx + width;
|
|
198
|
+
if (idxLeft < currRowIdx) {
|
|
199
|
+
idxLeft = currIdx;
|
|
200
|
+
}
|
|
201
|
+
if (idxRight >= maxRowIdx) {
|
|
202
|
+
idxRight = currIdx;
|
|
203
|
+
}
|
|
204
|
+
if (idxUp < 0) {
|
|
205
|
+
idxUp = 0;
|
|
206
|
+
}
|
|
207
|
+
if (idxDown >= maxIdx) {
|
|
208
|
+
idxDown = currIdx;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
int colUp = pixels[idxUp];
|
|
212
|
+
int colLeft = pixels[idxLeft];
|
|
213
|
+
int colDown = pixels[idxDown];
|
|
214
|
+
int colRight = pixels[idxRight];
|
|
215
|
+
|
|
216
|
+
// compute luminance
|
|
217
|
+
int currLum = colOrig & 0xff;
|
|
218
|
+
int lumLeft = colLeft & 0xff;
|
|
219
|
+
int lumRight = colRight & 0xff;
|
|
220
|
+
int lumUp = colUp & 0xff;
|
|
221
|
+
int lumDown = colDown & 0xff;
|
|
222
|
+
|
|
223
|
+
if (lumLeft < currLum) {
|
|
224
|
+
colOut = colLeft;
|
|
225
|
+
currLum = lumLeft;
|
|
226
|
+
}
|
|
227
|
+
if (lumRight < currLum) {
|
|
228
|
+
colOut = colRight;
|
|
229
|
+
currLum = lumRight;
|
|
230
|
+
}
|
|
231
|
+
if (lumUp < currLum) {
|
|
232
|
+
colOut = colUp;
|
|
233
|
+
currLum = lumUp;
|
|
234
|
+
}
|
|
235
|
+
if (lumDown < currLum) {
|
|
236
|
+
colOut = colDown;
|
|
237
|
+
currLum = lumDown;
|
|
238
|
+
}
|
|
239
|
+
out[currIdx++] = colOut;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return out;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* @param img
|
|
248
|
+
* @param isInverted
|
|
249
|
+
* @return filtered result as new image
|
|
250
|
+
*/
|
|
251
|
+
public static PImage erodePixels(PImage img, boolean isInverted) {
|
|
252
|
+
PImage img2 = new PImage(img.width, img.height);
|
|
253
|
+
img2.format = img.format;
|
|
254
|
+
img2.pixels = erodePixels(img.pixels, img.width, img.height, isInverted);
|
|
255
|
+
return img2;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
*
|
|
260
|
+
* @param srcpix
|
|
261
|
+
* @param lolim
|
|
262
|
+
* @param uplim
|
|
263
|
+
* @return
|
|
264
|
+
*/
|
|
265
|
+
public static int[] stretchLevels(int[] srcpix, int lolim, int uplim) {
|
|
266
|
+
int min = srcpix[0] & 0xff;
|
|
267
|
+
int max = srcpix[0] & 0xff;
|
|
268
|
+
int src_rgb;
|
|
269
|
+
int result;
|
|
270
|
+
float quotient = 0;
|
|
271
|
+
|
|
272
|
+
int[] dest = new int[srcpix.length];
|
|
273
|
+
|
|
274
|
+
// Find the max and min values
|
|
275
|
+
for (int i = 0; i < srcpix.length; i++) {
|
|
276
|
+
src_rgb = srcpix[i] & 0xff;
|
|
277
|
+
if (src_rgb < min) {
|
|
278
|
+
min = src_rgb;
|
|
279
|
+
} else if (src_rgb > max) {
|
|
280
|
+
max = src_rgb;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
quotient = (((float) (uplim - lolim)) / ((float) (max - min)));
|
|
284
|
+
// Calculate the output values
|
|
285
|
+
for (int i = 0; i < srcpix.length; i++) {
|
|
286
|
+
src_rgb = srcpix[i] & 0xff;
|
|
287
|
+
result = (int) ((src_rgb - min) * quotient) + lolim;
|
|
288
|
+
if (result > 255) {
|
|
289
|
+
result = 255;
|
|
290
|
+
} else if (result < 0) {
|
|
291
|
+
result = 0;
|
|
292
|
+
}
|
|
293
|
+
dest[i] = 0xff000000 | result;
|
|
294
|
+
}
|
|
295
|
+
return dest;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Non-destructively stretches levels of an 8bit grayscale image
|
|
300
|
+
*
|
|
301
|
+
* @param img
|
|
302
|
+
* Image to be level stretched
|
|
303
|
+
* @param uplim
|
|
304
|
+
* The upper limit for the values to be stretched between
|
|
305
|
+
* @param lolim
|
|
306
|
+
* The lower limit for the values to be stretched between
|
|
307
|
+
* @return filtered version of the image (with alpha channel set to full
|
|
308
|
+
* opacity)
|
|
309
|
+
*/
|
|
310
|
+
|
|
311
|
+
public static PImage stretchLevels(PImage img, int lolim, int uplim) {
|
|
312
|
+
PImage img2 = new PImage(img.width, img.height);
|
|
313
|
+
img2.format = img.format;
|
|
314
|
+
img2.pixels = stretchLevels(img.pixels, lolim, uplim);
|
|
315
|
+
return img2;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
*
|
|
320
|
+
* @param pix
|
|
321
|
+
* @param threshold
|
|
322
|
+
* @return
|
|
323
|
+
*/
|
|
324
|
+
public static int[] threshold(int[] pix, int threshold) {
|
|
325
|
+
int[] dest = new int[pix.length];
|
|
326
|
+
for (int i = 0; i < pix.length; i++) {
|
|
327
|
+
dest[i] = (pix[i] & 0xff) > threshold ? 0xff0000ff : 0xff000000;
|
|
328
|
+
}
|
|
329
|
+
return dest;
|
|
330
|
+
}
|
|
331
|
+
}
|