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,497 @@
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.dla;
29
+
30
+ import java.io.BufferedWriter;
31
+ import java.io.FileNotFoundException;
32
+ import java.io.FileWriter;
33
+ import java.io.IOException;
34
+ import java.io.RandomAccessFile;
35
+ import java.nio.MappedByteBuffer;
36
+ import java.nio.channels.FileChannel;
37
+ import java.util.ArrayList;
38
+ import java.util.List;
39
+ import java.util.logging.Level;
40
+ import java.util.logging.Logger;
41
+
42
+ import toxi.geom.PointOctree;
43
+ import toxi.geom.Vec3D;
44
+ import toxi.math.MathUtils;
45
+
46
+ /**
47
+ *
48
+ * @author tux
49
+ */
50
+ public class DLA {
51
+
52
+ /**
53
+ *
54
+ */
55
+ protected static final Logger logger = Logger
56
+ .getLogger(DLA.class.getName());
57
+
58
+ /**
59
+ *
60
+ */
61
+ protected int numParticles;
62
+
63
+ /**
64
+ *
65
+ */
66
+ protected DLAParticle currParticle;
67
+ protected PointOctree octree,
68
+
69
+ /**
70
+ *
71
+ */
72
+
73
+ /**
74
+ *
75
+ */
76
+ octreeGuides;
77
+
78
+ /**
79
+ *
80
+ */
81
+ protected Vec3D currCurvePoint;
82
+
83
+ /**
84
+ *
85
+ */
86
+ protected Vec3D dirCurvePoint;
87
+ protected Vec3D minBounds,
88
+
89
+ /**
90
+ *
91
+ */
92
+
93
+ /**
94
+ *
95
+ */
96
+ maxBounds;
97
+
98
+ /**
99
+ *
100
+ */
101
+ protected DLAGuideLines guidelines;
102
+
103
+ /**
104
+ *
105
+ */
106
+ protected ArrayList<DLASegment> activeSegments = new ArrayList<>();
107
+
108
+ /**
109
+ *
110
+ */
111
+ protected List<DLAEventListener> listeners = new ArrayList<>();
112
+
113
+ /**
114
+ *
115
+ */
116
+ protected int numActiveSegments = 0;
117
+
118
+ /**
119
+ *
120
+ */
121
+ protected DLAConfiguration config;
122
+
123
+ /**
124
+ *
125
+ * @param size
126
+ */
127
+ public DLA(float size) {
128
+ octree = createOctree(new Vec3D(-0.5f, -0.5f, -0.5f).scale(size), size);
129
+ octreeGuides = createOctree(new Vec3D(-0.5f, -0.5f, -0.5f).scale(size),
130
+ size);
131
+ minBounds = Vec3D.MAX_VALUE.copy();
132
+ maxBounds = Vec3D.NEG_MAX_VALUE.copy();
133
+ }
134
+
135
+ /**
136
+ *
137
+ * @param size
138
+ * @param config
139
+ * @param guides
140
+ */
141
+ public DLA(float size, DLAConfiguration config, DLAGuideLines guides) {
142
+ this(size);
143
+ this.config = config;
144
+ if (guides != null) {
145
+ this.guidelines = guides;
146
+ parseGuidelines();
147
+ updateCurvePoint();
148
+ }
149
+ }
150
+
151
+ /**
152
+ *
153
+ * @param l
154
+ * @return
155
+ */
156
+ public DLA addListener(DLAEventListener l) {
157
+ listeners.add(l);
158
+ logger.log(Level.INFO, "adding listener: {0}", l);
159
+ return this;
160
+ }
161
+
162
+ /**
163
+ *
164
+ * @param p
165
+ */
166
+ public void addParticle(Vec3D p) {
167
+ if (octree.addPoint(p.copy())) {
168
+ numParticles++;
169
+ minBounds.minSelf(p);
170
+ maxBounds.maxSelf(p);
171
+ if (listeners != null) {
172
+ for (DLAEventListener l : listeners) {
173
+ l.dlaNewParticleAdded(this, p);
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ /**
180
+ *
181
+ * @param p
182
+ * @param target
183
+ */
184
+ protected void alignAttachedParticle(DLAParticle p, Vec3D target) {
185
+ Vec3D d = p.sub(target).normalize();
186
+ d.interpolateToSelf(dirCurvePoint, config.getCurveAlign());
187
+ d.scaleSelf(config.getGrowthScale());
188
+ d.normalizeTo(config.getParticleRadius());
189
+ p.set(target).addSelf(d);
190
+ }
191
+
192
+ /**
193
+ * Checks if the given particle is close to an existing one or a curve. If
194
+ * so, the particle is attached based on the current DLA parameters and the
195
+ * method return true.
196
+ *
197
+ * @param p
198
+ * @return true, if particle attached.
199
+ */
200
+ protected boolean checkParticle(DLAParticle p) {
201
+ List<Vec3D> parts = octree
202
+ .getPointsWithinSphere(p, config.snapDistance);
203
+ float stickiness = config.getStickiness();
204
+ if (parts != null) {
205
+ float minDist = Integer.MAX_VALUE;
206
+ Vec3D found = null;
207
+ for (Vec3D pp : parts) {
208
+ float d = pp.distanceToSquared(p);
209
+ if (d < minDist) {
210
+ minDist = d;
211
+ found = pp;
212
+ }
213
+ }
214
+ if (minDist < config.getSnapDistanceSquared()
215
+ && Math.random() < stickiness) {
216
+ alignAttachedParticle(p, found);
217
+ addParticle(p);
218
+ return true;
219
+ }
220
+ }
221
+ if (p.sub(currCurvePoint).magSquared() < config
222
+ .getCurveAttachDistanceSquared()) {
223
+ parts = octreeGuides.getPointsWithinSphere(p,
224
+ config.getCurveAttachDistance());
225
+ if (parts != null) {
226
+ for (int i = parts.size(); i > 0; i--) {
227
+ if (Math.random() < stickiness) {
228
+ addParticle(p);
229
+ return true;
230
+ }
231
+ }
232
+ }
233
+ }
234
+ return false;
235
+ }
236
+
237
+ /**
238
+ *
239
+ */
240
+ public void clear() {
241
+ octree.empty();
242
+ octreeGuides.empty();
243
+ reset();
244
+ }
245
+
246
+ /**
247
+ *
248
+ * @param origin
249
+ * @param size
250
+ * @return
251
+ */
252
+ protected final PointOctree createOctree(Vec3D origin, float size) {
253
+ return new PointOctree(origin, size);
254
+ }
255
+
256
+ /**
257
+ * @return the config
258
+ */
259
+ public DLAConfiguration getConfig() {
260
+ return config;
261
+ }
262
+
263
+ /**
264
+ * @return the currCurvePoint
265
+ */
266
+ public Vec3D getCurrentCurvePoint() {
267
+ return currCurvePoint;
268
+ }
269
+
270
+ /**
271
+ * @return the currParticle
272
+ */
273
+ public DLAParticle getCurrentParticle() {
274
+ return currParticle;
275
+ }
276
+
277
+ /**
278
+ * @return the guidelines
279
+ */
280
+ public DLAGuideLines getGuidelines() {
281
+ return guidelines;
282
+ }
283
+
284
+ /**
285
+ * @return the octreeGuides
286
+ */
287
+ public PointOctree getGuideOctree() {
288
+ return octreeGuides;
289
+ }
290
+
291
+ /**
292
+ * @return the numActiveSegments
293
+ */
294
+ public int getNumActiveSegments() {
295
+ return numActiveSegments;
296
+ }
297
+
298
+ /**
299
+ * @return the numParticles
300
+ */
301
+ public int getNumParticles() {
302
+ return numParticles;
303
+ }
304
+
305
+ /**
306
+ *
307
+ * @return
308
+ */
309
+ public PointOctree getParticleOctree() {
310
+ return octree;
311
+ }
312
+
313
+ /**
314
+ * @return the octree
315
+ */
316
+ public List<Vec3D> getParticles() {
317
+ return octree.getPoints();
318
+ }
319
+
320
+ /**
321
+ *
322
+ */
323
+ protected final void parseGuidelines() {
324
+ guidelines.reset();
325
+ octreeGuides.empty();
326
+ while (!guidelines.isComplete()) {
327
+ double density = config.getGuideLineDensity();
328
+ guidelines.updatePoint(density);
329
+ Vec3D p = guidelines.getPoint();
330
+ octreeGuides.addPoint(p);
331
+ }
332
+ guidelines.reset();
333
+ }
334
+
335
+ /**
336
+ *
337
+ * @param l
338
+ * @return
339
+ */
340
+ public DLA removeListener(DLAEventListener l) {
341
+ listeners.remove(l);
342
+ logger.log(Level.INFO, "removing listener: {0}", l);
343
+ return this;
344
+ }
345
+
346
+ /**
347
+ *
348
+ */
349
+ public void reset() {
350
+ guidelines.reset();
351
+ updateCurvePoint();
352
+ }
353
+
354
+ /**
355
+ *
356
+ * @param fname
357
+ * @param isCentered
358
+ */
359
+ public void save(String fname, boolean isCentered) {
360
+ List<Vec3D> parts = octree.getPoints();
361
+ if (parts != null) {
362
+ Vec3D origin = minBounds.add(maxBounds).scaleSelf(0.5f);
363
+ logger.log(Level.INFO, "bounds: {0} -> {1} offset origin: {2}", new Object[]{minBounds, maxBounds, origin});
364
+ try (RandomAccessFile file = new RandomAccessFile(fname, "rw"); FileChannel channel = file.getChannel()) {
365
+ int size = parts.size() * 4 * 3;
366
+ MappedByteBuffer buffer = channel.map(
367
+ FileChannel.MapMode.READ_WRITE, 0, size);
368
+ if (isCentered) {
369
+ for (Vec3D p : parts) {
370
+ p = p.sub(origin);
371
+ buffer.putFloat(p.x);
372
+ buffer.putFloat(p.y);
373
+ buffer.putFloat(p.z);
374
+ }
375
+ } else {
376
+ for (Vec3D p : parts) {
377
+ buffer.putFloat(p.x);
378
+ buffer.putFloat(p.y);
379
+ buffer.putFloat(p.z);
380
+ }
381
+ }
382
+ buffer.force();
383
+ } catch (FileNotFoundException ex) {
384
+ Logger.getLogger(DLA.class.getName()).log(Level.SEVERE, null, ex);
385
+ } catch (IOException ex) {
386
+ Logger.getLogger(DLA.class.getName()).log(Level.SEVERE, null, ex);
387
+ }
388
+ logger.log(Level.INFO, "written {0} particles to {1}", new Object[]{parts.size(), fname});
389
+ }
390
+ }
391
+
392
+ /**
393
+ *
394
+ * @param fname
395
+ * @param isCentered
396
+ */
397
+ public void saveAsText(String fname, boolean isCentered) {
398
+ List<Vec3D> particles = octree.getPoints();
399
+ if (particles != null) {
400
+ Vec3D origin = minBounds.add(maxBounds).scaleSelf(0.5f);
401
+ logger.log(Level.INFO, "bounds: {0} -> {1} offset origin: {2}", new Object[]{minBounds, maxBounds, origin});
402
+ try (BufferedWriter out = new BufferedWriter(new FileWriter(fname))) {
403
+ for (Vec3D p : octree.getPoints()) {
404
+ StringBuilder sb = new StringBuilder(36);
405
+ sb.append(p.x).append(',').append(p.y).append(',')
406
+ .append(p.z).append("\n");
407
+ out.write(sb.toString());
408
+ }
409
+ } catch (IOException ex) {
410
+ Logger.getLogger(DLA.class.getName()).log(Level.SEVERE, null, ex);
411
+ }
412
+ logger.log(Level.INFO, "written {0} particles to {1}", new Object[]{particles.size(), fname});
413
+ }
414
+ }
415
+
416
+ /**
417
+ * @param config
418
+ * the config to set
419
+ */
420
+ public void setConfig(DLAConfiguration config) {
421
+ this.config = config;
422
+ }
423
+
424
+ /**
425
+ * @param guidelines
426
+ * the guidelines to set
427
+ */
428
+ public void setGuidelines(DLAGuideLines guidelines) {
429
+ this.guidelines = guidelines;
430
+ parseGuidelines();
431
+ updateCurvePoint();
432
+ }
433
+
434
+ /**
435
+ *
436
+ */
437
+ public void update() {
438
+ if (currParticle == null) {
439
+ Vec3D spawnPos = Vec3D.randomVector();
440
+ spawnPos = currCurvePoint.add(spawnPos.scale(MathUtils
441
+ .random(config.getSpawnRadius())));
442
+ currParticle = new DLAParticle(spawnPos, config.getEscapeRadius(),
443
+ config.getParticleSpeed(), config.getSearchSpeed());
444
+ }
445
+ currParticle.update(currCurvePoint);
446
+ if (checkParticle(currParticle)) {
447
+ currParticle = null;
448
+ updateCurvePoint();
449
+ }
450
+ }
451
+
452
+ /**
453
+ *
454
+ * @param numIterations
455
+ */
456
+ public void update(int numIterations) {
457
+ for (int i = 0; i < numIterations; i++) {
458
+ update();
459
+ }
460
+ }
461
+
462
+ /**
463
+ *
464
+ */
465
+ protected final void updateCurvePoint() {
466
+ if (Math.random() < config.getContinuousGrowthRatio()
467
+ && numActiveSegments > 0) {
468
+ DLASegment segment = activeSegments.get((int) (config
469
+ .getContinuousGrowthCoeff() * (numActiveSegments - 1)));
470
+ float currT = MathUtils.random(1f);
471
+ dirCurvePoint = segment.getDirectionAt(currT);
472
+ currCurvePoint = segment.a.add(dirCurvePoint.scale(segment
473
+ .getLength() * currT));
474
+ } else {
475
+ DLASegment s = guidelines.updatePoint(config.getCurveSpeed());
476
+ if (!activeSegments.contains(s)) {
477
+ activeSegments.add(s);
478
+ numActiveSegments++;
479
+ if (listeners != null) {
480
+ for (DLAEventListener l : listeners) {
481
+ l.dlaSegmentSwitched(this, s);
482
+ }
483
+ }
484
+ }
485
+ currCurvePoint = guidelines.getPoint();
486
+ dirCurvePoint = guidelines.getDirection();
487
+ }
488
+ if (guidelines.isComplete()) {
489
+ guidelines.reset();
490
+ if (listeners != null) {
491
+ for (DLAEventListener l : listeners) {
492
+ l.dlaAllSegmentsProcessed(this);
493
+ }
494
+ }
495
+ }
496
+ }
497
+ }