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,25 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* To change this template, choose Tools | Templates
|
|
3
|
+
* and open the template in the editor.
|
|
4
|
+
*/
|
|
5
|
+
package toxi.processing;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @author sid
|
|
10
|
+
*/
|
|
11
|
+
public enum Tracing {
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
INIT,
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
EXPORTING,
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
*/
|
|
23
|
+
EXPORTED
|
|
24
|
+
|
|
25
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package toxi.processing;
|
|
2
|
+
|
|
3
|
+
import toxi.color.ReadonlyTColor;
|
|
4
|
+
import toxi.color.TColor;
|
|
5
|
+
import toxi.geom.Matrix4x4;
|
|
6
|
+
import toxi.geom.Vec3D;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @author tux
|
|
11
|
+
*/
|
|
12
|
+
public class XYZNormalMapper implements NormalMapper {
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
17
|
+
public static final Matrix4x4 normalMap = new Matrix4x4().translateSelf(
|
|
18
|
+
0.5, 0.5, 0.5).scaleSelf(0.4999);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @param normal
|
|
23
|
+
* @return
|
|
24
|
+
*/
|
|
25
|
+
@Override
|
|
26
|
+
public ReadonlyTColor getRGBForNormal(Vec3D normal) {
|
|
27
|
+
normal = normalMap.applyTo(normal);
|
|
28
|
+
return TColor.newRGB(normal.x, normal.y, normal.z);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,297 @@
|
|
|
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.sim.automata;
|
|
29
|
+
|
|
30
|
+
import toxi.math.MathUtils;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* A 1D/2D Cellular Automata simulation matrix with flexible support of automata
|
|
34
|
+
* rules. The class provides accessors to the backing matrix arrays and utility
|
|
35
|
+
* methods to manipulate them.
|
|
36
|
+
*/
|
|
37
|
+
public class CAMatrix implements EvolvableMatrix {
|
|
38
|
+
|
|
39
|
+
protected int width,
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
*
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
*
|
|
47
|
+
*/
|
|
48
|
+
height;
|
|
49
|
+
protected int[] matrix,
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
*
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
*/
|
|
58
|
+
swap;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
*/
|
|
63
|
+
protected CARule rule;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
*/
|
|
68
|
+
protected int generation;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Creates a new 1D instance of the given width. Technically this matrix is
|
|
72
|
+
* still 2D, only its height = 1.
|
|
73
|
+
*
|
|
74
|
+
* @param width
|
|
75
|
+
*/
|
|
76
|
+
public CAMatrix(int width) {
|
|
77
|
+
this(width, 1);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Creates a new 2D instance of the given width & height.
|
|
82
|
+
*
|
|
83
|
+
* @param w
|
|
84
|
+
* @param h
|
|
85
|
+
*/
|
|
86
|
+
public CAMatrix(int w, int h) {
|
|
87
|
+
width = w;
|
|
88
|
+
height = h;
|
|
89
|
+
matrix = new int[w * h];
|
|
90
|
+
swap = new int[w * h];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
*
|
|
95
|
+
* @param probability
|
|
96
|
+
* @return
|
|
97
|
+
*/
|
|
98
|
+
public CAMatrix addNoise(float probability) {
|
|
99
|
+
return addNoise(probability, 0, rule != null ? rule.getStateCount() : 2);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Adds noise to the matrix. Cell states are modified with the given
|
|
104
|
+
* probability and within the given interval of possible target states.
|
|
105
|
+
*
|
|
106
|
+
* @param probability
|
|
107
|
+
* @param minState
|
|
108
|
+
* @param maxState
|
|
109
|
+
* @return itself
|
|
110
|
+
*/
|
|
111
|
+
public CAMatrix addNoise(float probability, int minState, int maxState) {
|
|
112
|
+
if (rule != null) {
|
|
113
|
+
minState = MathUtils.clip(minState, 0, rule.getStateCount());
|
|
114
|
+
maxState = MathUtils.clip(maxState, 0, rule.getStateCount());
|
|
115
|
+
for (int x = 0; x < width; x++) {
|
|
116
|
+
for (int y = 0; y < height; y++) {
|
|
117
|
+
if (MathUtils.randomChance(probability)) {
|
|
118
|
+
int idx = y * width + x;
|
|
119
|
+
swap[idx] = matrix[idx] = MathUtils.random(minState,
|
|
120
|
+
maxState);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return this;
|
|
125
|
+
}
|
|
126
|
+
throw new IllegalStateException("CA rule not yet initialized");
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Sets all matrix cells in a square around the given x,y coordinates to the
|
|
131
|
+
* requested state.
|
|
132
|
+
*
|
|
133
|
+
* @param x
|
|
134
|
+
* box center x
|
|
135
|
+
* @param y
|
|
136
|
+
* box center y
|
|
137
|
+
* @param w
|
|
138
|
+
* box width
|
|
139
|
+
* @param state
|
|
140
|
+
* target state
|
|
141
|
+
* @return itself
|
|
142
|
+
*/
|
|
143
|
+
public CAMatrix drawBoxAt(int x, int y, int w, int state) {
|
|
144
|
+
for (int i = y - w / 2; i < y + w / 2; i++) {
|
|
145
|
+
for (int j = x - w / 2; j < x + w / 2; j++) {
|
|
146
|
+
if (j >= 0 && j < width && i >= 0 && i < height) {
|
|
147
|
+
int idx = j + i * width;
|
|
148
|
+
swap[idx] = matrix[idx] = state;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return this;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/*
|
|
156
|
+
* (non-Javadoc)
|
|
157
|
+
*
|
|
158
|
+
* @see toxi.sim.automata.EvolvableMatrix#getGeneration()
|
|
159
|
+
*/
|
|
160
|
+
@Override
|
|
161
|
+
public final int getGeneration() {
|
|
162
|
+
return generation;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* (non-Javadoc)
|
|
167
|
+
*
|
|
168
|
+
* @see toxi.sim.automata.EvolvableMatrix#getHeight()
|
|
169
|
+
*/
|
|
170
|
+
@Override
|
|
171
|
+
public final int getHeight() {
|
|
172
|
+
return height;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Computes the array index for the cell at x,y.
|
|
177
|
+
*
|
|
178
|
+
* @param x
|
|
179
|
+
* @param y
|
|
180
|
+
* @return index
|
|
181
|
+
*/
|
|
182
|
+
public final int getIndexFor(int x, int y) {
|
|
183
|
+
return x + y * width;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
@Override
|
|
187
|
+
public final int[] getMatrix() {
|
|
188
|
+
return matrix;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @return the rule instance
|
|
193
|
+
*/
|
|
194
|
+
public final MatrixEvolver getRule() {
|
|
195
|
+
return rule;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
@Override
|
|
199
|
+
public final int[] getSwapBuffer() {
|
|
200
|
+
return swap;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
@Override
|
|
204
|
+
public final int getWidth() {
|
|
205
|
+
return width;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Clears the matrix and resets the generation counter.
|
|
210
|
+
*
|
|
211
|
+
* @return itself
|
|
212
|
+
*/
|
|
213
|
+
public CAMatrix reset() {
|
|
214
|
+
for (int i = 0; i < matrix.length; i++) {
|
|
215
|
+
matrix[i] = 0;
|
|
216
|
+
swap[i] = 0;
|
|
217
|
+
}
|
|
218
|
+
generation = 0;
|
|
219
|
+
return this;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Uses the given ARGB pixel array as seed mask for the matrix. The image is
|
|
224
|
+
* placed centered and if bigger. Only the blue channel (lowest 8 bit of an
|
|
225
|
+
* int) is used to determine if a cell is set to be alive or dead.
|
|
226
|
+
*
|
|
227
|
+
* @param pixels
|
|
228
|
+
* @param imgWidth
|
|
229
|
+
* @param imgHeight
|
|
230
|
+
* @return itself
|
|
231
|
+
*/
|
|
232
|
+
public CAMatrix seedImage(int[] pixels, int imgWidth, int imgHeight) {
|
|
233
|
+
final int xo = MathUtils.clip((width - imgWidth) / 2, 0, width - 1);
|
|
234
|
+
final int yo = MathUtils.clip((height - imgHeight) / 2, 0, height - 1);
|
|
235
|
+
imgWidth = MathUtils.min(imgWidth, width);
|
|
236
|
+
imgHeight = MathUtils.min(imgHeight, height);
|
|
237
|
+
for (int y = 0; y < imgHeight; y++) {
|
|
238
|
+
final int i = y * imgWidth;
|
|
239
|
+
final int yoIndex = (yo + y) * width;
|
|
240
|
+
for (int x = 0; x < imgWidth; x++) {
|
|
241
|
+
if (0 < (pixels[i + x] & 0xff)) {
|
|
242
|
+
int idx = yoIndex + xo + x;
|
|
243
|
+
matrix[idx] = 1;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return this;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Assigns the given rule as evaluator for this matrix.
|
|
252
|
+
*
|
|
253
|
+
* @param r
|
|
254
|
+
* rule implementation
|
|
255
|
+
* @return itself
|
|
256
|
+
*/
|
|
257
|
+
public CAMatrix setRule(CARule r) {
|
|
258
|
+
rule = r;
|
|
259
|
+
return this;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Sets the cell state at x,y. If the coordinates are outside the matrix an
|
|
264
|
+
* {@link ArrayIndexOutOfBoundsException} is thrown.
|
|
265
|
+
*
|
|
266
|
+
* @param x
|
|
267
|
+
* @param y
|
|
268
|
+
* @param state
|
|
269
|
+
* @return itself
|
|
270
|
+
*/
|
|
271
|
+
public CAMatrix setStateAt(int x, int y, int state) {
|
|
272
|
+
int idx = x + y * width;
|
|
273
|
+
if (idx >= 0 && idx < matrix.length) {
|
|
274
|
+
swap[idx] = matrix[idx] = state;
|
|
275
|
+
} else {
|
|
276
|
+
throw new ArrayIndexOutOfBoundsException("given coordinates: " + x
|
|
277
|
+
+ ";" + y + " are out of bounds");
|
|
278
|
+
}
|
|
279
|
+
return this;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Evolves the matrix to the next generation by applying one iteration of
|
|
284
|
+
* the assigned {@link CARule} implementation. If no rule is assigned, the
|
|
285
|
+
* method does nothing.
|
|
286
|
+
*
|
|
287
|
+
* @return itself
|
|
288
|
+
*/
|
|
289
|
+
public CAMatrix update() {
|
|
290
|
+
if (rule != null) {
|
|
291
|
+
rule.evolve(this);
|
|
292
|
+
System.arraycopy(swap, 0, matrix, 0, matrix.length);
|
|
293
|
+
generation++;
|
|
294
|
+
}
|
|
295
|
+
return this;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
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.sim.automata;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* This interface defines the required API for a {@link CAMatrix} compatible
|
|
32
|
+
* cellular automata rule implementation.
|
|
33
|
+
*/
|
|
34
|
+
public interface CARule extends MatrixEvolver {
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
*
|
|
38
|
+
* @return
|
|
39
|
+
*/
|
|
40
|
+
public int getStateCount();
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
* @return
|
|
45
|
+
*/
|
|
46
|
+
public boolean isAutoExpire();
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
*
|
|
50
|
+
* @return
|
|
51
|
+
*/
|
|
52
|
+
public boolean isTiling();
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
*/
|
|
57
|
+
public void randomize();
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
*
|
|
61
|
+
* @param isAutoExpire
|
|
62
|
+
*/
|
|
63
|
+
public void setAutoExpire(boolean isAutoExpire);
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
* @param num
|
|
68
|
+
*/
|
|
69
|
+
public void setStateCount(int num);
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
* @param state
|
|
74
|
+
*/
|
|
75
|
+
public void setTiling(boolean state);
|
|
76
|
+
}
|
|
@@ -0,0 +1,354 @@
|
|
|
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.sim.automata;
|
|
29
|
+
|
|
30
|
+
import java.util.ArrayList;
|
|
31
|
+
import java.util.List;
|
|
32
|
+
|
|
33
|
+
import toxi.math.MathUtils;
|
|
34
|
+
import toxi.util.datatypes.ArrayUtil;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
*
|
|
38
|
+
* @author tux
|
|
39
|
+
*/
|
|
40
|
+
public class CARule2D implements CARule {
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
* @param kernel
|
|
45
|
+
* @return
|
|
46
|
+
*/
|
|
47
|
+
public static final byte[] booleanToByteArray(boolean[] kernel) {
|
|
48
|
+
List<Byte> buf = new ArrayList<>(kernel.length);
|
|
49
|
+
for (byte i = 0; i < kernel.length; i++) {
|
|
50
|
+
if (kernel[i]) {
|
|
51
|
+
buf.add(i);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return byteListToArray(buf);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
*
|
|
59
|
+
* @param rules
|
|
60
|
+
* @return
|
|
61
|
+
*/
|
|
62
|
+
public static final byte[] byteListToArray(List<Byte> rules) {
|
|
63
|
+
byte[] r = new byte[rules.size()];
|
|
64
|
+
for (int i = rules.size() - 1; i >= 0; i--) {
|
|
65
|
+
r[i] = rules.get(i);
|
|
66
|
+
}
|
|
67
|
+
return r;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
*
|
|
72
|
+
*/
|
|
73
|
+
protected boolean[] survivalRules;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
*
|
|
77
|
+
*/
|
|
78
|
+
protected boolean[] birthRules;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
*
|
|
82
|
+
*/
|
|
83
|
+
protected int stateCount;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
*
|
|
87
|
+
*/
|
|
88
|
+
protected float randomBirthChance = 0.15f;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
*
|
|
92
|
+
*/
|
|
93
|
+
protected float randomSurvivalChance = 0.25f;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
*
|
|
97
|
+
*/
|
|
98
|
+
protected boolean isTiling;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
*
|
|
102
|
+
*/
|
|
103
|
+
protected boolean isAutoExpire;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
*
|
|
107
|
+
* @param brules
|
|
108
|
+
* @param srules
|
|
109
|
+
* @param st
|
|
110
|
+
* @param tiled
|
|
111
|
+
*/
|
|
112
|
+
public CARule2D(byte[] brules, byte[] srules, int st, boolean tiled) {
|
|
113
|
+
birthRules = new boolean[9];
|
|
114
|
+
setBirthRules(brules);
|
|
115
|
+
survivalRules = new boolean[9];
|
|
116
|
+
setSurvivalRules(srules);
|
|
117
|
+
stateCount = MathUtils.max(1, st);
|
|
118
|
+
setTiling(tiled);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
*
|
|
123
|
+
* @param m
|
|
124
|
+
*/
|
|
125
|
+
@Override
|
|
126
|
+
public void evolve(EvolvableMatrix m) {
|
|
127
|
+
int width = m.getWidth();
|
|
128
|
+
int height = m.getHeight();
|
|
129
|
+
int[] matrix = m.getMatrix();
|
|
130
|
+
int[] temp = m.getSwapBuffer();
|
|
131
|
+
int maxState = stateCount - 1;
|
|
132
|
+
int x1, x2, y1, y2;
|
|
133
|
+
if (isTiling) {
|
|
134
|
+
x1 = 0;
|
|
135
|
+
x2 = width;
|
|
136
|
+
y1 = 0;
|
|
137
|
+
y2 = height;
|
|
138
|
+
} else {
|
|
139
|
+
x1 = 1;
|
|
140
|
+
x2 = width - 1;
|
|
141
|
+
y1 = 1;
|
|
142
|
+
y2 = height - 1;
|
|
143
|
+
}
|
|
144
|
+
for (int y = y1; y < y2; y++) {
|
|
145
|
+
// determine up and down cell indices
|
|
146
|
+
int up = (y > 0 ? y - 1 : height - 1) * width;
|
|
147
|
+
int down = (y < height - 1 ? y + 1 : 0) * width;
|
|
148
|
+
int centre = y * width;
|
|
149
|
+
for (int x = x1; x < x2; x++) {
|
|
150
|
+
// determine left and right cell offsets
|
|
151
|
+
int left = x > 0 ? x - 1 : width - 1;
|
|
152
|
+
int right = x < width - 1 ? x + 1 : 0;
|
|
153
|
+
int currVal = matrix[centre + x];
|
|
154
|
+
int newVal = currVal;
|
|
155
|
+
int sum = 0;
|
|
156
|
+
if (matrix[up + left] > 0) {
|
|
157
|
+
sum++; // top left
|
|
158
|
+
}
|
|
159
|
+
if (matrix[up + x] > 0) {
|
|
160
|
+
sum++; // top
|
|
161
|
+
}
|
|
162
|
+
if (matrix[up + right] > 0) {
|
|
163
|
+
sum++; // top right
|
|
164
|
+
}
|
|
165
|
+
if (matrix[centre + left] > 0) {
|
|
166
|
+
sum++; // left
|
|
167
|
+
}
|
|
168
|
+
if (matrix[centre + right] > 0) {
|
|
169
|
+
sum++; // right
|
|
170
|
+
}
|
|
171
|
+
if (matrix[down + left] > 0) {
|
|
172
|
+
sum++; // bottom left
|
|
173
|
+
}
|
|
174
|
+
if (matrix[down + x] > 0) {
|
|
175
|
+
sum++; // bottom
|
|
176
|
+
}
|
|
177
|
+
if (matrix[down + right] > 0) {
|
|
178
|
+
sum++; // bottom right
|
|
179
|
+
}
|
|
180
|
+
if (currVal > 0) {
|
|
181
|
+
// if alive, check survival...
|
|
182
|
+
if (survivalRules[sum]) {
|
|
183
|
+
if (isAutoExpire) {
|
|
184
|
+
newVal = (newVal + 1) % stateCount;
|
|
185
|
+
} else {
|
|
186
|
+
newVal = MathUtils.min(newVal + 1, maxState);
|
|
187
|
+
}
|
|
188
|
+
} else {
|
|
189
|
+
newVal = 0;
|
|
190
|
+
}
|
|
191
|
+
} else {
|
|
192
|
+
// else check birth rules...
|
|
193
|
+
if (birthRules[sum]) {
|
|
194
|
+
newVal = 1;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
temp[centre + x] = newVal;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
*
|
|
204
|
+
* @return
|
|
205
|
+
*/
|
|
206
|
+
public byte[] getBirthRules() {
|
|
207
|
+
return booleanToByteArray(birthRules);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
*
|
|
212
|
+
* @return
|
|
213
|
+
*/
|
|
214
|
+
@Override
|
|
215
|
+
public int getStateCount() {
|
|
216
|
+
return stateCount;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
*
|
|
221
|
+
* @return
|
|
222
|
+
*/
|
|
223
|
+
public byte[] getSurvivalRules() {
|
|
224
|
+
return booleanToByteArray(survivalRules);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
*
|
|
229
|
+
* @return
|
|
230
|
+
*/
|
|
231
|
+
@Override
|
|
232
|
+
public boolean isAutoExpire() {
|
|
233
|
+
return isAutoExpire;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
*
|
|
238
|
+
* @return
|
|
239
|
+
*/
|
|
240
|
+
@Override
|
|
241
|
+
public boolean isTiling() {
|
|
242
|
+
return isTiling;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
*
|
|
247
|
+
* @param chance
|
|
248
|
+
* @return
|
|
249
|
+
*/
|
|
250
|
+
protected byte[] randomArray(double chance) {
|
|
251
|
+
List<Byte> rules = new ArrayList<>();
|
|
252
|
+
for (byte i = 0; i < 9; i++) {
|
|
253
|
+
if (MathUtils.randomChance(chance)) {
|
|
254
|
+
rules.add(i);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (rules.isEmpty()) {
|
|
258
|
+
rules.add((byte) MathUtils.random(9));
|
|
259
|
+
}
|
|
260
|
+
return byteListToArray(rules);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
*
|
|
265
|
+
*/
|
|
266
|
+
@Override
|
|
267
|
+
public void randomize() {
|
|
268
|
+
setRuleArray(randomArray(randomBirthChance), birthRules);
|
|
269
|
+
setRuleArray(randomArray(randomSurvivalChance), survivalRules);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
*
|
|
274
|
+
* @param state
|
|
275
|
+
*/
|
|
276
|
+
@Override
|
|
277
|
+
public void setAutoExpire(boolean state) {
|
|
278
|
+
this.isAutoExpire = state;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
*
|
|
283
|
+
* @param b
|
|
284
|
+
*/
|
|
285
|
+
public final void setBirthRules(byte[] b) {
|
|
286
|
+
setRuleArray(b, birthRules);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
*
|
|
291
|
+
* @param birth
|
|
292
|
+
* @param survival
|
|
293
|
+
*/
|
|
294
|
+
public void setRandomProbabilities(float birth, float survival) {
|
|
295
|
+
randomBirthChance = birth;
|
|
296
|
+
randomSurvivalChance = survival;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
*
|
|
301
|
+
* @param seed
|
|
302
|
+
* @param kernel
|
|
303
|
+
*/
|
|
304
|
+
protected void setRuleArray(byte[] seed, boolean[] kernel) {
|
|
305
|
+
for (int i = 0; i < kernel.length; i++) {
|
|
306
|
+
kernel[i] = false;
|
|
307
|
+
}
|
|
308
|
+
for (int i = 0; i < seed.length; i++) {
|
|
309
|
+
byte id = seed[i];
|
|
310
|
+
if (id >= 0 && id < kernel.length) {
|
|
311
|
+
kernel[id] = true;
|
|
312
|
+
} else {
|
|
313
|
+
throw new ArrayIndexOutOfBoundsException("invalid rule index: "
|
|
314
|
+
+ id + " (needs to be less than 9 for a 3x3 kernel");
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
*
|
|
321
|
+
* @param num
|
|
322
|
+
*/
|
|
323
|
+
@Override
|
|
324
|
+
public void setStateCount(int num) {
|
|
325
|
+
stateCount = num;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
*
|
|
330
|
+
* @param s
|
|
331
|
+
*/
|
|
332
|
+
public final void setSurvivalRules(byte[] s) {
|
|
333
|
+
setRuleArray(s, survivalRules);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
*
|
|
338
|
+
* @param state
|
|
339
|
+
*/
|
|
340
|
+
@Override
|
|
341
|
+
public final void setTiling(boolean state) {
|
|
342
|
+
isTiling = state;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
*
|
|
347
|
+
* @return
|
|
348
|
+
*/
|
|
349
|
+
@Override
|
|
350
|
+
public String toString() {
|
|
351
|
+
return "births: " + ArrayUtil.toString(getBirthRules()) + " survivals:"
|
|
352
|
+
+ ArrayUtil.toString(getSurvivalRules());
|
|
353
|
+
}
|
|
354
|
+
}
|