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.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +16 -0
  3. data/CHANGELOG.md +4 -0
  4. data/LICENSE +675 -0
  5. data/README.md +12 -5
  6. data/Rakefile +25 -82
  7. data/examples/attract_repel/attract_repel.rb +30 -0
  8. data/examples/attract_repel/attractor.rb +23 -0
  9. data/examples/attract_repel/particle.rb +27 -0
  10. data/examples/data/ti_yong.png +0 -0
  11. data/examples/force_directed/cluster.rb +76 -0
  12. data/examples/force_directed/force_directed_graph.rb +92 -0
  13. data/examples/force_directed/node.rb +26 -0
  14. data/examples/gray_scott_image.rb +75 -0
  15. data/examples/gray_scott_tone_map.rb +77 -0
  16. data/examples/implicit.rb +139 -0
  17. data/examples/inflate_mesh.rb +89 -0
  18. data/examples/model_align.rb +44 -0
  19. data/examples/povmesh/ftest.rb +46 -0
  20. data/examples/povmesh/tentacle.rb +73 -0
  21. data/examples/simple_cluster/cluster.rb +47 -0
  22. data/examples/simple_cluster/node.rb +27 -0
  23. data/examples/simple_cluster/simple_cluster.rb +60 -0
  24. data/examples/soft_body/blanket.rb +45 -0
  25. data/examples/soft_body/connection.rb +16 -0
  26. data/examples/soft_body/particle.rb +22 -0
  27. data/examples/soft_body/soft_body_square_adapted.rb +55 -0
  28. data/lib/toxiclibs.jar +0 -0
  29. data/lib/toxiclibs.rb +91 -32
  30. data/lib/toxiclibs/version.rb +1 -1
  31. data/pom.xml +122 -0
  32. data/src/com/toxi/net/ClientListener.java +41 -0
  33. data/src/com/toxi/net/ServerListener.java +70 -0
  34. data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
  35. data/src/com/toxi/net/ServerState.java +18 -0
  36. data/src/com/toxi/net/UDPConnection.java +66 -0
  37. data/src/com/toxi/net/UDPSyncClient.java +81 -0
  38. data/src/com/toxi/net/UDPSyncServer.java +450 -0
  39. data/src/com/toxi/nio/UDPClient.java +121 -0
  40. data/src/com/toxi/nio/UDPClientState.java +32 -0
  41. data/src/com/toxi/nio/UDPServer.java +129 -0
  42. data/src/toxi/color/AccessCriteria.java +114 -0
  43. data/src/toxi/color/AlphaAccessor.java +67 -0
  44. data/src/toxi/color/CMYKAccessor.java +122 -0
  45. data/src/toxi/color/CMYKDistanceProxy.java +40 -0
  46. data/src/toxi/color/ColorGradient.java +260 -0
  47. data/src/toxi/color/ColorList.java +699 -0
  48. data/src/toxi/color/ColorRange.java +671 -0
  49. data/src/toxi/color/ColorTheme.java +163 -0
  50. data/src/toxi/color/DistanceProxy.java +44 -0
  51. data/src/toxi/color/HSVAccessor.java +113 -0
  52. data/src/toxi/color/HSVDistanceProxy.java +40 -0
  53. data/src/toxi/color/HistEntry.java +85 -0
  54. data/src/toxi/color/Histogram.java +185 -0
  55. data/src/toxi/color/Hue.java +249 -0
  56. data/src/toxi/color/LuminanceAccessor.java +78 -0
  57. data/src/toxi/color/NamedColor.java +935 -0
  58. data/src/toxi/color/ProximityComparator.java +70 -0
  59. data/src/toxi/color/RGBAccessor.java +113 -0
  60. data/src/toxi/color/RGBDistanceProxy.java +41 -0
  61. data/src/toxi/color/ReadonlyTColor.java +296 -0
  62. data/src/toxi/color/TColor.java +1677 -0
  63. data/src/toxi/color/TColorAdapter.java +68 -0
  64. data/src/toxi/color/ToneMap.java +218 -0
  65. data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
  66. data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
  67. data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
  68. data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
  69. data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
  70. data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
  71. data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
  72. data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
  73. data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
  74. data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
  75. data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
  76. data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
  77. data/src/toxi/data/csv/CSVAdapter.java +74 -0
  78. data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
  79. data/src/toxi/data/csv/CSVListener.java +61 -0
  80. data/src/toxi/data/csv/CSVParser.java +202 -0
  81. data/src/toxi/data/feeds/AtomAuthor.java +49 -0
  82. data/src/toxi/data/feeds/AtomContent.java +50 -0
  83. data/src/toxi/data/feeds/AtomEntry.java +111 -0
  84. data/src/toxi/data/feeds/AtomFeed.java +129 -0
  85. data/src/toxi/data/feeds/AtomLink.java +62 -0
  86. data/src/toxi/data/feeds/RSSChannel.java +88 -0
  87. data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
  88. data/src/toxi/data/feeds/RSSFeed.java +99 -0
  89. data/src/toxi/data/feeds/RSSItem.java +104 -0
  90. data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
  91. data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
  92. data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
  93. data/src/toxi/geom/AABB.java +658 -0
  94. data/src/toxi/geom/Axis3D.java +116 -0
  95. data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
  96. data/src/toxi/geom/BernsteinPolynomial.java +94 -0
  97. data/src/toxi/geom/BezierCurve2D.java +159 -0
  98. data/src/toxi/geom/BezierCurve3D.java +148 -0
  99. data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
  100. data/src/toxi/geom/BoxIntersector.java +52 -0
  101. data/src/toxi/geom/Circle.java +230 -0
  102. data/src/toxi/geom/CircleIntersector.java +85 -0
  103. data/src/toxi/geom/Cone.java +150 -0
  104. data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
  105. data/src/toxi/geom/CoordinateExtractor.java +16 -0
  106. data/src/toxi/geom/Ellipse.java +250 -0
  107. data/src/toxi/geom/GMatrix.java +2599 -0
  108. data/src/toxi/geom/GVector.java +833 -0
  109. data/src/toxi/geom/GlobalGridTesselator.java +54 -0
  110. data/src/toxi/geom/GridTesselator.java +108 -0
  111. data/src/toxi/geom/Intersector2D.java +49 -0
  112. data/src/toxi/geom/Intersector3D.java +51 -0
  113. data/src/toxi/geom/IsectData2D.java +103 -0
  114. data/src/toxi/geom/IsectData3D.java +103 -0
  115. data/src/toxi/geom/Line2D.java +534 -0
  116. data/src/toxi/geom/Line3D.java +471 -0
  117. data/src/toxi/geom/LineStrip2D.java +430 -0
  118. data/src/toxi/geom/LineStrip3D.java +230 -0
  119. data/src/toxi/geom/LocalGridTesselator.java +57 -0
  120. data/src/toxi/geom/Matrix3d.java +3048 -0
  121. data/src/toxi/geom/Matrix4f.java +3446 -0
  122. data/src/toxi/geom/Matrix4x4.java +1076 -0
  123. data/src/toxi/geom/MatrixSizeException.java +58 -0
  124. data/src/toxi/geom/OctreeVisitor.java +44 -0
  125. data/src/toxi/geom/Origin3D.java +148 -0
  126. data/src/toxi/geom/Plane.java +293 -0
  127. data/src/toxi/geom/PlaneIntersector.java +57 -0
  128. data/src/toxi/geom/PointCloud3D.java +253 -0
  129. data/src/toxi/geom/PointOctree.java +502 -0
  130. data/src/toxi/geom/PointQuadtree.java +375 -0
  131. data/src/toxi/geom/Polygon2D.java +1038 -0
  132. data/src/toxi/geom/PolygonClipper2D.java +45 -0
  133. data/src/toxi/geom/PolygonTesselator.java +20 -0
  134. data/src/toxi/geom/QuadtreeVisitor.java +44 -0
  135. data/src/toxi/geom/Quaternion.java +641 -0
  136. data/src/toxi/geom/Ray2D.java +146 -0
  137. data/src/toxi/geom/Ray3D.java +150 -0
  138. data/src/toxi/geom/Ray3DIntersector.java +75 -0
  139. data/src/toxi/geom/ReadonlyVec2D.java +575 -0
  140. data/src/toxi/geom/ReadonlyVec3D.java +628 -0
  141. data/src/toxi/geom/ReadonlyVec4D.java +431 -0
  142. data/src/toxi/geom/Rect.java +720 -0
  143. data/src/toxi/geom/Reflector3D.java +58 -0
  144. data/src/toxi/geom/Shape2D.java +94 -0
  145. data/src/toxi/geom/Shape3D.java +42 -0
  146. data/src/toxi/geom/SingularMatrixException.java +57 -0
  147. data/src/toxi/geom/SpatialBins.java +182 -0
  148. data/src/toxi/geom/SpatialIndex.java +61 -0
  149. data/src/toxi/geom/Sphere.java +224 -0
  150. data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
  151. data/src/toxi/geom/Spline2D.java +349 -0
  152. data/src/toxi/geom/Spline3D.java +351 -0
  153. data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
  154. data/src/toxi/geom/Triangle2D.java +422 -0
  155. data/src/toxi/geom/Triangle3D.java +456 -0
  156. data/src/toxi/geom/TriangleIntersector.java +105 -0
  157. data/src/toxi/geom/Vec2D.java +1328 -0
  158. data/src/toxi/geom/Vec3D.java +1832 -0
  159. data/src/toxi/geom/Vec4D.java +985 -0
  160. data/src/toxi/geom/VecMathUtil.java +100 -0
  161. data/src/toxi/geom/XAxisCylinder.java +64 -0
  162. data/src/toxi/geom/YAxisCylinder.java +65 -0
  163. data/src/toxi/geom/ZAxisCylinder.java +64 -0
  164. data/src/toxi/geom/mesh/BezierPatch.java +200 -0
  165. data/src/toxi/geom/mesh/BoxSelector.java +62 -0
  166. data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
  167. data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
  168. data/src/toxi/geom/mesh/Face.java +176 -0
  169. data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
  170. data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
  171. data/src/toxi/geom/mesh/Mesh3D.java +224 -0
  172. data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
  173. data/src/toxi/geom/mesh/OBJWriter.java +194 -0
  174. data/src/toxi/geom/mesh/PLYWriter.java +167 -0
  175. data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
  176. data/src/toxi/geom/mesh/STLColorModel.java +54 -0
  177. data/src/toxi/geom/mesh/STLReader.java +185 -0
  178. data/src/toxi/geom/mesh/STLWriter.java +323 -0
  179. data/src/toxi/geom/mesh/SphereFunction.java +156 -0
  180. data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
  181. data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
  182. data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
  183. data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
  184. data/src/toxi/geom/mesh/Terrain.java +451 -0
  185. data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
  186. data/src/toxi/geom/mesh/Vertex.java +78 -0
  187. data/src/toxi/geom/mesh/VertexSelector.java +193 -0
  188. data/src/toxi/geom/mesh/WEFace.java +100 -0
  189. data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
  190. data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
  191. data/src/toxi/geom/mesh/WEVertex.java +134 -0
  192. data/src/toxi/geom/mesh/WingedEdge.java +115 -0
  193. data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
  194. data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
  195. data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
  196. data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
  197. data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
  198. data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
  199. data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
  200. data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
  201. data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
  202. data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
  203. data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
  204. data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
  205. data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
  206. data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
  207. data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
  208. data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
  209. data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
  210. data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
  211. data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
  212. data/src/toxi/geom/nurbs/ControlNet.java +148 -0
  213. data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
  214. data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
  215. data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
  216. data/src/toxi/geom/nurbs/KnotVector.java +333 -0
  217. data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
  218. data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
  219. data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
  220. data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
  221. data/src/toxi/image/util/Filter8bit.java +331 -0
  222. data/src/toxi/image/util/TiledFrameExporter.java +162 -0
  223. data/src/toxi/math/BezierInterpolation.java +102 -0
  224. data/src/toxi/math/CircularInterpolation.java +88 -0
  225. data/src/toxi/math/CosineInterpolation.java +51 -0
  226. data/src/toxi/math/DecimatedInterpolation.java +77 -0
  227. data/src/toxi/math/ExponentialInterpolation.java +68 -0
  228. data/src/toxi/math/InterpolateStrategy.java +60 -0
  229. data/src/toxi/math/Interpolation2D.java +93 -0
  230. data/src/toxi/math/LinearInterpolation.java +46 -0
  231. data/src/toxi/math/MathUtils.java +990 -0
  232. data/src/toxi/math/NonLinearScaleMap.java +101 -0
  233. data/src/toxi/math/ScaleMap.java +183 -0
  234. data/src/toxi/math/SigmoidInterpolation.java +78 -0
  235. data/src/toxi/math/SinCosLUT.java +141 -0
  236. data/src/toxi/math/ThresholdInterpolation.java +58 -0
  237. data/src/toxi/math/ZoomLensInterpolation.java +126 -0
  238. data/src/toxi/math/conversion/UnitTranslator.java +161 -0
  239. data/src/toxi/math/noise/PerlinNoise.java +281 -0
  240. data/src/toxi/math/noise/SimplexNoise.java +542 -0
  241. data/src/toxi/math/waves/AMFMSineWave.java +143 -0
  242. data/src/toxi/math/waves/AbstractWave.java +248 -0
  243. data/src/toxi/math/waves/ConstantWave.java +48 -0
  244. data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
  245. data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
  246. data/src/toxi/math/waves/FMSineWave.java +142 -0
  247. data/src/toxi/math/waves/FMSquareWave.java +143 -0
  248. data/src/toxi/math/waves/FMTriangleWave.java +126 -0
  249. data/src/toxi/math/waves/SineWave.java +81 -0
  250. data/src/toxi/math/waves/Wave2D.java +68 -0
  251. data/src/toxi/math/waves/WaveState.java +69 -0
  252. data/src/toxi/music/scale/AbstractScale.java +117 -0
  253. data/src/toxi/music/scale/GenericScale.java +66 -0
  254. data/src/toxi/music/scale/MajorScale.java +41 -0
  255. data/src/toxi/newmesh/AttributedEdge.java +106 -0
  256. data/src/toxi/newmesh/AttributedFace.java +63 -0
  257. data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
  258. data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
  259. data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
  260. data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
  261. data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
  262. data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
  263. data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
  264. data/src/toxi/newmesh/SpatialIndex.java +78 -0
  265. data/src/toxi/physics2d/ParticlePath2D.java +100 -0
  266. data/src/toxi/physics2d/ParticleString2D.java +184 -0
  267. data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
  268. data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
  269. data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
  270. data/src/toxi/physics2d/VerletParticle2D.java +457 -0
  271. data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
  272. data/src/toxi/physics2d/VerletSpring2D.java +181 -0
  273. data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
  274. data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
  275. data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
  276. data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
  277. data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
  278. data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
  279. data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
  280. data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
  281. data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
  282. data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
  283. data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
  284. data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
  285. data/src/toxi/physics3d/ParticlePath3D.java +100 -0
  286. data/src/toxi/physics3d/ParticleString3D.java +184 -0
  287. data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
  288. data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
  289. data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
  290. data/src/toxi/physics3d/VerletParticle3D.java +385 -0
  291. data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
  292. data/src/toxi/physics3d/VerletSpring3D.java +180 -0
  293. data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
  294. data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
  295. data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
  296. data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
  297. data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
  298. data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
  299. data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
  300. data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
  301. data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
  302. data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
  303. data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
  304. data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
  305. data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
  306. data/src/toxi/processing/ArrowModifier.java +116 -0
  307. data/src/toxi/processing/DashedLineModifier.java +48 -0
  308. data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
  309. data/src/toxi/processing/Line2DRenderModifier.java +18 -0
  310. data/src/toxi/processing/MeshToVBO.java +94 -0
  311. data/src/toxi/processing/NormalMapper.java +18 -0
  312. data/src/toxi/processing/POVInterface.java +121 -0
  313. data/src/toxi/processing/POVMesh.java +219 -0
  314. data/src/toxi/processing/POVWriter.java +460 -0
  315. data/src/toxi/processing/RCOpaque.java +77 -0
  316. data/src/toxi/processing/RCTransp.java +78 -0
  317. data/src/toxi/processing/TextureBuilder.java +232 -0
  318. data/src/toxi/processing/Textures.java +110 -0
  319. data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
  320. data/src/toxi/processing/Tracing.java +25 -0
  321. data/src/toxi/processing/XYZNormalMapper.java +30 -0
  322. data/src/toxi/sim/automata/CAMatrix.java +297 -0
  323. data/src/toxi/sim/automata/CARule.java +76 -0
  324. data/src/toxi/sim/automata/CARule2D.java +354 -0
  325. data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
  326. data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
  327. data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
  328. data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
  329. data/src/toxi/sim/dla/DLA.java +497 -0
  330. data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
  331. data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
  332. data/src/toxi/sim/dla/DLAEventListener.java +57 -0
  333. data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
  334. data/src/toxi/sim/dla/DLAParticle.java +102 -0
  335. data/src/toxi/sim/dla/DLASegment.java +88 -0
  336. data/src/toxi/sim/dla/PipelineOrder.java +50 -0
  337. data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
  338. data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
  339. data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
  340. data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
  341. data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
  342. data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
  343. data/src/toxi/sim/grayscott/GrayScott.java +469 -0
  344. data/src/toxi/util/DateUtils.java +141 -0
  345. data/src/toxi/util/FileSequenceDescriptor.java +181 -0
  346. data/src/toxi/util/FileUtils.java +467 -0
  347. data/src/toxi/util/datatypes/ArraySet.java +128 -0
  348. data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
  349. data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
  350. data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
  351. data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
  352. data/src/toxi/util/datatypes/DoubleRange.java +251 -0
  353. data/src/toxi/util/datatypes/FloatRange.java +251 -0
  354. data/src/toxi/util/datatypes/GenericSet.java +215 -0
  355. data/src/toxi/util/datatypes/IntegerRange.java +247 -0
  356. data/src/toxi/util/datatypes/IntegerSet.java +149 -0
  357. data/src/toxi/util/datatypes/ItemIndex.java +72 -0
  358. data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
  359. data/src/toxi/util/datatypes/TypedProperties.java +291 -0
  360. data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
  361. data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
  362. data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
  363. data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
  364. data/src/toxi/util/events/EventDispatcher.java +86 -0
  365. data/src/toxi/volume/AdditiveBrush.java +19 -0
  366. data/src/toxi/volume/ArrayIsoSurface.java +297 -0
  367. data/src/toxi/volume/BoxBrush.java +100 -0
  368. data/src/toxi/volume/BrushMode.java +16 -0
  369. data/src/toxi/volume/HashIsoSurface.java +354 -0
  370. data/src/toxi/volume/IsoSurface.java +59 -0
  371. data/src/toxi/volume/MarchingCubesIndex.java +312 -0
  372. data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
  373. data/src/toxi/volume/MeshVoxelizer.java +216 -0
  374. data/src/toxi/volume/MultiplyBrush.java +20 -0
  375. data/src/toxi/volume/PeakBrush.java +21 -0
  376. data/src/toxi/volume/ReplaceBrush.java +19 -0
  377. data/src/toxi/volume/RoundBrush.java +113 -0
  378. data/src/toxi/volume/VolumetricBrush.java +160 -0
  379. data/src/toxi/volume/VolumetricHashMap.java +179 -0
  380. data/src/toxi/volume/VolumetricSpace.java +195 -0
  381. data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
  382. data/toxiclibs.gemspec +34 -0
  383. 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
+ }