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,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
+ }