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,671 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Some classes in this package have been partly inspired by & bits ported from
|
|
3
|
+
* Python code written by Tom De Smedt & Frederik De Bleser for the "colors" library
|
|
4
|
+
* of Nodebox.net.
|
|
5
|
+
*
|
|
6
|
+
* http://nodebox.net/code/index.php/Colors
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
|
9
|
+
*
|
|
10
|
+
* This library is free software; you can redistribute it and/or
|
|
11
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
12
|
+
* License as published by the Free Software Foundation; either
|
|
13
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
14
|
+
*
|
|
15
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
16
|
+
*
|
|
17
|
+
* This library is distributed in the hope that it will be useful,
|
|
18
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
20
|
+
* Lesser General Public License for more details.
|
|
21
|
+
*
|
|
22
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
23
|
+
* License along with this library; if not, write to the Free Software
|
|
24
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
package toxi.color;
|
|
28
|
+
|
|
29
|
+
import java.lang.reflect.Field;
|
|
30
|
+
import java.util.HashMap;
|
|
31
|
+
import java.util.logging.Level;
|
|
32
|
+
import java.util.logging.Logger;
|
|
33
|
+
|
|
34
|
+
import toxi.math.MathUtils;
|
|
35
|
+
import toxi.util.datatypes.FloatRange;
|
|
36
|
+
import toxi.util.datatypes.GenericSet;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A ColorRange is a set of contraints to specify possible ranges for hue,
|
|
40
|
+
* saturation, brightness and alpha independently and use these as creation
|
|
41
|
+
* rules for new {@link TColor}s or {@link ColorList}s. The class comes with 11
|
|
42
|
+
* preset ranges reflecting common demands and color characters. You can also
|
|
43
|
+
* construct new ranges and manually add additional constraints. Unless the
|
|
44
|
+
* constraints in a range are very narrow the class will always create random
|
|
45
|
+
* variations within the constraints. Please see the examples for further
|
|
46
|
+
* details.
|
|
47
|
+
*
|
|
48
|
+
* {@link ColorRange}s are a key ingredient for defining {@link ColorTheme}s but
|
|
49
|
+
* can also be used individually.
|
|
50
|
+
*/
|
|
51
|
+
public class ColorRange {
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Default hue variance for {@link #getColor(ReadonlyTColor, float)}
|
|
55
|
+
*/
|
|
56
|
+
public static final float DEFAULT_VARIANCE = 0.035f;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Shade definition: saturation 30-70%, brightness: 90-100%
|
|
60
|
+
*/
|
|
61
|
+
public static final ColorRange LIGHT = new ColorRange(null, new FloatRange(
|
|
62
|
+
0.3f, 0.7f), new FloatRange(0.9f, 1.0f), null, new FloatRange(
|
|
63
|
+
0.15f, 0.30f), null, "light");
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Shade definition: saturation 70-100%, brightness: 15-40%
|
|
67
|
+
*/
|
|
68
|
+
public static final ColorRange DARK = new ColorRange(null, new FloatRange(
|
|
69
|
+
0.7f, 1.0f), new FloatRange(0.15f, 0.4f), null, null,
|
|
70
|
+
new FloatRange(0.5f, 0.75f), "dark");
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Shade definition: saturation 80-100%, brightness: 80-100%
|
|
74
|
+
*/
|
|
75
|
+
public static final ColorRange BRIGHT = new ColorRange(null,
|
|
76
|
+
new FloatRange(0.8f, 1.0f), new FloatRange(0.8f, 1.0f), "bright");
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Shade definition: saturation 15-30%, brightness: 70-100%
|
|
80
|
+
*/
|
|
81
|
+
public static final ColorRange WEAK = new ColorRange(null, new FloatRange(
|
|
82
|
+
0.15f, 0.3f), new FloatRange(0.7f, 1.0f), null, new FloatRange(
|
|
83
|
+
0.2f, 0.2f), null, "weak");
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Shade definition: saturation 25-35%, brightness: 30-70%
|
|
87
|
+
*/
|
|
88
|
+
public static final ColorRange NEUTRAL = new ColorRange(null,
|
|
89
|
+
new FloatRange(0.25f, 0.35f), new FloatRange(0.3f, 0.7f), null,
|
|
90
|
+
new FloatRange(0.15f, 0.15f), new FloatRange(0.9f, 1), "neutral");
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Shade definition: saturation 40-80%, brightness: 80-100%
|
|
94
|
+
*/
|
|
95
|
+
public static final ColorRange FRESH = new ColorRange(null, new FloatRange(
|
|
96
|
+
0.4f, 0.8f), new FloatRange(0.8f, 1.0f), null, new FloatRange(
|
|
97
|
+
0.05f, 0.3f), new FloatRange(0.8f, 1.0f), "fresh");
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Shade definition: saturation 20-30%, brightness: 60-90%
|
|
101
|
+
*/
|
|
102
|
+
public static final ColorRange SOFT = new ColorRange(null, new FloatRange(
|
|
103
|
+
0.2f, 0.3f), new FloatRange(0.6f, 0.9f), null, new FloatRange(
|
|
104
|
+
0.05f, 0.15f), new FloatRange(0.6f, 0.9f), "soft");
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Shade definition: saturation 90-100%, brightness: 40-100%
|
|
108
|
+
*/
|
|
109
|
+
public static final ColorRange HARD = new ColorRange(null, new FloatRange(
|
|
110
|
+
0.9f, 1.0f), new FloatRange(0.4f, 1.0f), "hard");
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Shade definition: saturation 60-90%, brightness: 40-90%
|
|
114
|
+
*/
|
|
115
|
+
public static final ColorRange WARM = new ColorRange(null, new FloatRange(
|
|
116
|
+
0.6f, 0.9f), new FloatRange(0.4f, 0.9f), null, new FloatRange(0.2f,
|
|
117
|
+
0.2f), new FloatRange(0.8f, 1.0f), "warm");
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Shade definition: saturation 5-20%, brightness: 90-100%
|
|
121
|
+
*/
|
|
122
|
+
public static final ColorRange COOL = new ColorRange(null, new FloatRange(
|
|
123
|
+
0.05f, 0.2f), new FloatRange(0.9f, 1.0f), null, null,
|
|
124
|
+
new FloatRange(0.95f, 1.0f), "cool");
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Shade definition: saturation 90-100%, brightness: 20-35% or 80-100%
|
|
128
|
+
*/
|
|
129
|
+
public static final ColorRange INTENSE = new ColorRange(null,
|
|
130
|
+
new FloatRange(0.9f, 1.0f), new FloatRange(0.2f, 0.35f), "intense")
|
|
131
|
+
.addBrightnessRange(new FloatRange(0.8f, 1.0f));
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* List of ColorRange presets.
|
|
135
|
+
*/
|
|
136
|
+
public static final HashMap<String, ColorRange> PRESETS = new HashMap<>();
|
|
137
|
+
|
|
138
|
+
private static int UNTITLED_ID = 1;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
*
|
|
142
|
+
*/
|
|
143
|
+
protected GenericSet<FloatRange> hueConstraint;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
*
|
|
147
|
+
*/
|
|
148
|
+
protected GenericSet<FloatRange> saturationConstraint;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
*
|
|
152
|
+
*/
|
|
153
|
+
protected GenericSet<FloatRange> brightnessConstraint;
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
*
|
|
157
|
+
*/
|
|
158
|
+
protected GenericSet<FloatRange> alphaConstraint;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
*
|
|
162
|
+
*/
|
|
163
|
+
protected FloatRange white;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
*
|
|
167
|
+
*/
|
|
168
|
+
protected FloatRange black;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
*
|
|
172
|
+
*/
|
|
173
|
+
protected String name;
|
|
174
|
+
|
|
175
|
+
static {
|
|
176
|
+
Field[] fields = ColorRange.class.getDeclaredFields();
|
|
177
|
+
for (Field f : fields) {
|
|
178
|
+
if (f.getType() == ColorRange.class) {
|
|
179
|
+
String id = f.getName();
|
|
180
|
+
try {
|
|
181
|
+
PRESETS.put(id, (ColorRange) f.get(null));
|
|
182
|
+
} catch (IllegalArgumentException | IllegalAccessException ex) {
|
|
183
|
+
Logger.getLogger(ColorRange.class.getName()).log(Level.SEVERE, null, ex);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Retrieves one of the predefined ranges by name.
|
|
191
|
+
*
|
|
192
|
+
* @param name
|
|
193
|
+
* @return color range or null if name not registered
|
|
194
|
+
*/
|
|
195
|
+
public static ColorRange getPresetForName(String name) {
|
|
196
|
+
return PRESETS.get(name.toUpperCase());
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Only used internally by {@link #copy()}, doesn't initialize anything.
|
|
201
|
+
*/
|
|
202
|
+
private ColorRange() {
|
|
203
|
+
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Constructs a new range using the given colors as HSV constraints.
|
|
208
|
+
*
|
|
209
|
+
* @param list
|
|
210
|
+
* list base colors
|
|
211
|
+
*/
|
|
212
|
+
public ColorRange(ColorList list) {
|
|
213
|
+
this(list.get(0));
|
|
214
|
+
hueConstraint.clear();
|
|
215
|
+
for (TColor c : list) {
|
|
216
|
+
add(c);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Constructs a new range with the supplied constraints (if an HSV argument
|
|
222
|
+
* is null, a range of 0.0 ... 1.0 is created automatically for that
|
|
223
|
+
* constraint). If alpha is left undefined, it'll be initialized to fully
|
|
224
|
+
* opaque only. You can also specify ranges for possible black and white
|
|
225
|
+
* points which are used if the range is later applied to a grayscale color.
|
|
226
|
+
* The default black point is at 0.0 and white at 1.0.
|
|
227
|
+
*
|
|
228
|
+
* @param hue
|
|
229
|
+
* @param sat
|
|
230
|
+
* @param bri
|
|
231
|
+
* @param alpha
|
|
232
|
+
* @param black
|
|
233
|
+
* @param white
|
|
234
|
+
* @param name
|
|
235
|
+
*/
|
|
236
|
+
public ColorRange(FloatRange hue, FloatRange sat, FloatRange bri,
|
|
237
|
+
FloatRange alpha, FloatRange black, FloatRange white, String name) {
|
|
238
|
+
super();
|
|
239
|
+
hueConstraint = new GenericSet<>(hue != null ? hue
|
|
240
|
+
: new FloatRange(0, 1));
|
|
241
|
+
saturationConstraint = new GenericSet<>(sat != null ? sat
|
|
242
|
+
: new FloatRange(0, 1));
|
|
243
|
+
brightnessConstraint = new GenericSet<>(bri != null ? bri
|
|
244
|
+
: new FloatRange(0, 1));
|
|
245
|
+
alphaConstraint = new GenericSet<>(alpha != null ? alpha
|
|
246
|
+
: new FloatRange(1, 1));
|
|
247
|
+
if (black == null) {
|
|
248
|
+
this.black = new FloatRange(0, 0);
|
|
249
|
+
} else {
|
|
250
|
+
this.black = black;
|
|
251
|
+
}
|
|
252
|
+
if (white == null) {
|
|
253
|
+
this.white = new FloatRange(1, 1);
|
|
254
|
+
} else {
|
|
255
|
+
this.white = white;
|
|
256
|
+
}
|
|
257
|
+
this.name = name != null ? name : "untitled" + (UNTITLED_ID++);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Constructs a new range with the supplied constraints (if an argument is
|
|
262
|
+
* null, a range of 0.0 ... 1.0 is created automatically for that
|
|
263
|
+
* constraint).
|
|
264
|
+
*
|
|
265
|
+
* @param hue
|
|
266
|
+
* min/max hue range
|
|
267
|
+
* @param sat
|
|
268
|
+
* min/max saturation range
|
|
269
|
+
* @param bri
|
|
270
|
+
* min/max brightness range
|
|
271
|
+
* @param alpha
|
|
272
|
+
* min/max alpha range (if null, initialized to 100% only)
|
|
273
|
+
* @param name
|
|
274
|
+
*/
|
|
275
|
+
public ColorRange(FloatRange hue, FloatRange sat, FloatRange bri,
|
|
276
|
+
FloatRange alpha, String name) {
|
|
277
|
+
this(hue, sat, bri, alpha, null, null, name);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Constructs a new range with the supplied constraints (if an argument is
|
|
282
|
+
* null, a range of 0.0 ... 1.0 is created automatically for that
|
|
283
|
+
* constraint). Alpha constraint will be set to 100%.
|
|
284
|
+
*
|
|
285
|
+
* @param hue
|
|
286
|
+
* min/max hue range
|
|
287
|
+
* @param sat
|
|
288
|
+
* min/max saturation range
|
|
289
|
+
* @param bri
|
|
290
|
+
* min/max brightness range
|
|
291
|
+
* @param name
|
|
292
|
+
*/
|
|
293
|
+
public ColorRange(FloatRange hue, FloatRange sat, FloatRange bri,
|
|
294
|
+
String name) {
|
|
295
|
+
this(hue, sat, bri, null, null, null, name);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Constructs a new range using the given hue as constraint, but saturation
|
|
300
|
+
* and brightness are fully flexible. The resulting range will produce any
|
|
301
|
+
* shade of the given hue.
|
|
302
|
+
*
|
|
303
|
+
* @param hue
|
|
304
|
+
* base hue
|
|
305
|
+
*/
|
|
306
|
+
public ColorRange(Hue hue) {
|
|
307
|
+
this(new FloatRange(hue.getHue(), hue.getHue()), null, null, null,
|
|
308
|
+
null, null, null);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Constructs a new range using the hue of the given color as hue
|
|
313
|
+
* constraint, but saturation and brightness are fully flexible. The
|
|
314
|
+
* resulting range will produce any shade of the given color.
|
|
315
|
+
*
|
|
316
|
+
* @param c
|
|
317
|
+
* base color
|
|
318
|
+
*/
|
|
319
|
+
public ColorRange(ReadonlyTColor c) {
|
|
320
|
+
this(new FloatRange(c.hue(), c.hue()), null, null, null, null, null,
|
|
321
|
+
null);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Adds the contraints of the given range to this range and forms unions for
|
|
326
|
+
* the black and white point ranges.
|
|
327
|
+
*
|
|
328
|
+
* @param range
|
|
329
|
+
* color range to add
|
|
330
|
+
* @return itself
|
|
331
|
+
*/
|
|
332
|
+
public ColorRange add(ColorRange range) {
|
|
333
|
+
hueConstraint.addAll(range.hueConstraint.getItems());
|
|
334
|
+
saturationConstraint.addAll(range.saturationConstraint.getItems());
|
|
335
|
+
brightnessConstraint.addAll(range.brightnessConstraint.getItems());
|
|
336
|
+
alphaConstraint.addAll(range.alphaConstraint.getItems());
|
|
337
|
+
black.min = MathUtils.min(black.min, range.black.min);
|
|
338
|
+
black.max = MathUtils.max(black.max, range.black.max);
|
|
339
|
+
white.min = MathUtils.min(white.min, range.white.min);
|
|
340
|
+
white.max = MathUtils.max(white.max, range.white.max);
|
|
341
|
+
return this;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Adds the HSV color components as constraints.
|
|
346
|
+
*
|
|
347
|
+
* @param c
|
|
348
|
+
* color to use as constraint
|
|
349
|
+
* @return itself
|
|
350
|
+
*/
|
|
351
|
+
public final ColorRange add(ReadonlyTColor c) {
|
|
352
|
+
hueConstraint.add(new FloatRange(c.hue(), c.hue()));
|
|
353
|
+
saturationConstraint
|
|
354
|
+
.add(new FloatRange(c.saturation(), c.saturation()));
|
|
355
|
+
brightnessConstraint
|
|
356
|
+
.add(new FloatRange(c.brightness(), c.brightness()));
|
|
357
|
+
alphaConstraint.add(new FloatRange(c.alpha(), c.alpha()));
|
|
358
|
+
return this;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Adds the range between min-max as possible alpha values for this range.
|
|
363
|
+
*
|
|
364
|
+
* @param min
|
|
365
|
+
* @param max
|
|
366
|
+
* @return itself
|
|
367
|
+
*/
|
|
368
|
+
public ColorRange addAlphaRange(float min, float max) {
|
|
369
|
+
return addAlphaRange(new FloatRange(min, max));
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Adds an additional alpha constraint.
|
|
374
|
+
*
|
|
375
|
+
* @param alpha
|
|
376
|
+
* min/max alpha values
|
|
377
|
+
* @return itself
|
|
378
|
+
*/
|
|
379
|
+
public ColorRange addAlphaRange(FloatRange alpha) {
|
|
380
|
+
alphaConstraint.add(alpha);
|
|
381
|
+
return this;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Adds the range between min-max as possible brightness values for this
|
|
386
|
+
* range.
|
|
387
|
+
*
|
|
388
|
+
* @param min
|
|
389
|
+
* @param max
|
|
390
|
+
* @return itself
|
|
391
|
+
*/
|
|
392
|
+
public ColorRange addBrightnessRange(float min, float max) {
|
|
393
|
+
return addBrightnessRange(new FloatRange(min, max));
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Adds an additional brightness constraint.
|
|
398
|
+
*
|
|
399
|
+
* @param bri
|
|
400
|
+
* min/max brightness values
|
|
401
|
+
* @return itself
|
|
402
|
+
*/
|
|
403
|
+
public ColorRange addBrightnessRange(FloatRange bri) {
|
|
404
|
+
brightnessConstraint.add(bri);
|
|
405
|
+
return this;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Add the given hue as hue constraint.
|
|
410
|
+
*
|
|
411
|
+
* @param hue
|
|
412
|
+
* @return itself
|
|
413
|
+
*/
|
|
414
|
+
public ColorRange addHue(Hue hue) {
|
|
415
|
+
hueConstraint.add(new FloatRange(hue.getHue(), hue.getHue()));
|
|
416
|
+
return this;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Adds the range between min-max as possible hue values for this range. If
|
|
421
|
+
* max < min then two intervals are added: {min ... 1.0} and {0.0 ... max}
|
|
422
|
+
*
|
|
423
|
+
* @param min
|
|
424
|
+
* @param max
|
|
425
|
+
* @return itself
|
|
426
|
+
*/
|
|
427
|
+
public ColorRange addHueRange(float min, float max) {
|
|
428
|
+
if (max >= min) {
|
|
429
|
+
addHueRange(new FloatRange(min, max));
|
|
430
|
+
} else {
|
|
431
|
+
addHueRange(new FloatRange(min, 1));
|
|
432
|
+
addHueRange(new FloatRange(0, max));
|
|
433
|
+
}
|
|
434
|
+
return this;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Adds an additional hue constraint.
|
|
439
|
+
*
|
|
440
|
+
* @param hue
|
|
441
|
+
* min/max hue values
|
|
442
|
+
* @return itself
|
|
443
|
+
*/
|
|
444
|
+
public ColorRange addHueRange(FloatRange hue) {
|
|
445
|
+
hueConstraint.add(hue);
|
|
446
|
+
return this;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* Adds the range between min-max as possible saturation values for this
|
|
451
|
+
* range.
|
|
452
|
+
*
|
|
453
|
+
* @param min
|
|
454
|
+
* @param max
|
|
455
|
+
* @return itself
|
|
456
|
+
*/
|
|
457
|
+
public ColorRange addSaturationRange(float min, float max) {
|
|
458
|
+
return addAlphaRange(new FloatRange(min, max));
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Adds an additional saturation constraint.
|
|
463
|
+
*
|
|
464
|
+
* @param sat
|
|
465
|
+
* min/max saturation values
|
|
466
|
+
* @return itself
|
|
467
|
+
*/
|
|
468
|
+
public ColorRange addSaturationRange(FloatRange sat) {
|
|
469
|
+
saturationConstraint.add(sat);
|
|
470
|
+
return this;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Checks if all HSVA components of the given color are within the
|
|
475
|
+
* constraints defined for this range.
|
|
476
|
+
*
|
|
477
|
+
* @param c
|
|
478
|
+
* color to check
|
|
479
|
+
* @return true, if color is contained
|
|
480
|
+
*/
|
|
481
|
+
public boolean contains(ReadonlyTColor c) {
|
|
482
|
+
boolean isInRange = isValueInConstraint(c.hue(), hueConstraint);
|
|
483
|
+
isInRange &= isValueInConstraint(c.saturation(), saturationConstraint);
|
|
484
|
+
isInRange &= isValueInConstraint(c.brightness(), brightnessConstraint);
|
|
485
|
+
isInRange &= isValueInConstraint(c.alpha(), alphaConstraint);
|
|
486
|
+
return isInRange;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* Creates a shallow copy of the range.
|
|
491
|
+
*
|
|
492
|
+
* @return copy
|
|
493
|
+
*/
|
|
494
|
+
public ColorRange copy() {
|
|
495
|
+
return copy(null, 0);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Creates a copy of the range but overrides the hue and alpha constraints
|
|
500
|
+
* taken from the given color (if specified).
|
|
501
|
+
*
|
|
502
|
+
* @param c
|
|
503
|
+
* color, if the new range is to be used to create specific
|
|
504
|
+
* shades of that color only
|
|
505
|
+
* @param variance
|
|
506
|
+
* hue variance (use {@link #DEFAULT_VARIANCE} for default)
|
|
507
|
+
* @return copy
|
|
508
|
+
*/
|
|
509
|
+
public ColorRange copy(ReadonlyTColor c, float variance) {
|
|
510
|
+
ColorRange range = new ColorRange();
|
|
511
|
+
range.name = name;
|
|
512
|
+
|
|
513
|
+
if (c != null) {
|
|
514
|
+
float hue = c.hue() + variance * MathUtils.normalizedRandom();
|
|
515
|
+
range.hueConstraint = new GenericSet<>(new FloatRange(
|
|
516
|
+
hue, hue));
|
|
517
|
+
range.alphaConstraint = new GenericSet<>(new FloatRange(
|
|
518
|
+
c.alpha(), c.alpha()));
|
|
519
|
+
} else {
|
|
520
|
+
range.hueConstraint = hueConstraint.copy();
|
|
521
|
+
range.alphaConstraint = alphaConstraint.copy();
|
|
522
|
+
}
|
|
523
|
+
range.saturationConstraint = saturationConstraint.copy();
|
|
524
|
+
range.brightnessConstraint = brightnessConstraint.copy();
|
|
525
|
+
|
|
526
|
+
range.black = black.copy();
|
|
527
|
+
range.white = white.copy();
|
|
528
|
+
return range;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Creates a new color based on the flexible constraints of the range.
|
|
533
|
+
*
|
|
534
|
+
* @return color
|
|
535
|
+
*/
|
|
536
|
+
public TColor getColor() {
|
|
537
|
+
return getColor(null, 0);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Creates a new shade of the given hue based on the other constraints of
|
|
542
|
+
* the range.
|
|
543
|
+
*
|
|
544
|
+
* @param hue
|
|
545
|
+
* @return color
|
|
546
|
+
*/
|
|
547
|
+
public TColor getColor(Hue hue) {
|
|
548
|
+
return TColor.newHSVA(hue.getHue(), saturationConstraint.pickRandom()
|
|
549
|
+
.pickRandom(), brightnessConstraint.pickRandom().pickRandom(),
|
|
550
|
+
alphaConstraint.pickRandom().pickRandom());
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/**
|
|
554
|
+
* Creates a new color based on the constraints defined in the range. If an
|
|
555
|
+
* input color is specified, the method will use the hue of that color and
|
|
556
|
+
* the given variance to create a shade of a hue within the tolerance.
|
|
557
|
+
*
|
|
558
|
+
* @param c
|
|
559
|
+
* @param variance
|
|
560
|
+
* @return color
|
|
561
|
+
*/
|
|
562
|
+
public TColor getColor(ReadonlyTColor c, float variance) {
|
|
563
|
+
float h, s, b, a;
|
|
564
|
+
if (c != null) {
|
|
565
|
+
if (c.isBlack()) {
|
|
566
|
+
return TColor
|
|
567
|
+
.newHSVA(c.hue(), 0, black.pickRandom(), c.alpha());
|
|
568
|
+
} else if (c.isWhite()) {
|
|
569
|
+
return TColor
|
|
570
|
+
.newHSVA(c.hue(), 0, white.pickRandom(), c.alpha());
|
|
571
|
+
}
|
|
572
|
+
if (c.isGrey()) {
|
|
573
|
+
return TColor.newHSVA(
|
|
574
|
+
c.hue(),
|
|
575
|
+
0,
|
|
576
|
+
MathUtils.flipCoin() ? black.pickRandom() : white
|
|
577
|
+
.pickRandom(), c.alpha());
|
|
578
|
+
}
|
|
579
|
+
h = c.hue() + variance * MathUtils.normalizedRandom();
|
|
580
|
+
a = c.alpha();
|
|
581
|
+
} else {
|
|
582
|
+
h = hueConstraint.pickRandom().pickRandom();
|
|
583
|
+
a = alphaConstraint.pickRandom().pickRandom();
|
|
584
|
+
}
|
|
585
|
+
s = saturationConstraint.pickRandom().pickRandom();
|
|
586
|
+
b = brightnessConstraint.pickRandom().pickRandom();
|
|
587
|
+
return TColor.newHSVA(h, s, b, a);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Creates a new {@link ColorList} of colors based on the constraints of
|
|
592
|
+
* this range.
|
|
593
|
+
*
|
|
594
|
+
* @see #getColor()
|
|
595
|
+
* @param num
|
|
596
|
+
* number of colors to create
|
|
597
|
+
* @return color list
|
|
598
|
+
*/
|
|
599
|
+
public ColorList getColors(int num) {
|
|
600
|
+
return getColors(null, num, DEFAULT_VARIANCE);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Creates a new {@link ColorList} of shades of the given {@link TColor}
|
|
605
|
+
* based on the other constraints of the range.
|
|
606
|
+
*
|
|
607
|
+
* @see #getColor(ReadonlyTColor, float)
|
|
608
|
+
* @param c
|
|
609
|
+
* base color
|
|
610
|
+
* @param num
|
|
611
|
+
* number of colors to create
|
|
612
|
+
* @param variance
|
|
613
|
+
* hue variance
|
|
614
|
+
* @return color list
|
|
615
|
+
*/
|
|
616
|
+
public ColorList getColors(ReadonlyTColor c, int num, float variance) {
|
|
617
|
+
ColorList list = new ColorList();
|
|
618
|
+
for (int i = 0; i < num; i++) {
|
|
619
|
+
list.add(getColor(c, variance));
|
|
620
|
+
}
|
|
621
|
+
return list;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Creates a new shade of gray based on the input brightness and the black
|
|
626
|
+
* and white constraints of the range.
|
|
627
|
+
*
|
|
628
|
+
* @param brightness
|
|
629
|
+
* input brightness
|
|
630
|
+
* @param variance
|
|
631
|
+
* hue variance (this might seem irrevelant, but might be
|
|
632
|
+
* important if the created color is being saturated later on)
|
|
633
|
+
* @return color/shade of gray
|
|
634
|
+
*/
|
|
635
|
+
public TColor getGrayscale(float brightness, float variance) {
|
|
636
|
+
return getColor(TColor.newGray(brightness), variance);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
/**
|
|
640
|
+
* @return name of the range
|
|
641
|
+
*/
|
|
642
|
+
public String getName() {
|
|
643
|
+
return name;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Creates a copy of the current range and adds the given one to it.
|
|
648
|
+
*
|
|
649
|
+
* @see #add(ColorRange)
|
|
650
|
+
* @param range
|
|
651
|
+
* range to add
|
|
652
|
+
* @return summed copy
|
|
653
|
+
*/
|
|
654
|
+
public ColorRange getSum(ColorRange range) {
|
|
655
|
+
return copy().add(range);
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* @param val
|
|
660
|
+
* @param rangeSet
|
|
661
|
+
* @return true, if value is within range
|
|
662
|
+
*/
|
|
663
|
+
protected boolean isValueInConstraint(float val,
|
|
664
|
+
GenericSet<FloatRange> rangeSet) {
|
|
665
|
+
boolean isValid = false;
|
|
666
|
+
for (FloatRange r : rangeSet) {
|
|
667
|
+
isValid |= r.isValueInRange(val);
|
|
668
|
+
}
|
|
669
|
+
return isValid;
|
|
670
|
+
}
|
|
671
|
+
}
|