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,57 @@
1
+ package toxi.geom;
2
+
3
+ import toxi.math.MathUtils;
4
+
5
+ /**
6
+ *
7
+ * @author tux
8
+ */
9
+ public class PlaneIntersector implements Intersector3D {
10
+
11
+ private Plane plane;
12
+ private final IsectData3D isec;
13
+
14
+ /**
15
+ *
16
+ * @param p
17
+ */
18
+ public PlaneIntersector(Plane p) {
19
+ this.plane = p;
20
+ this.isec = new IsectData3D();
21
+ }
22
+
23
+ @Override
24
+ public IsectData3D getIntersectionData() {
25
+ return isec;
26
+ }
27
+
28
+ /**
29
+ * @return the box
30
+ */
31
+ public Plane getPlane() {
32
+ return plane;
33
+ }
34
+
35
+ @Override
36
+ public boolean intersectsRay(Ray3D ray) {
37
+ float d = -plane.normal.dot(plane);
38
+ float numer = plane.normal.dot(ray) + d;
39
+ float denom = plane.normal.dot(ray.dir);
40
+
41
+ // normal is orthogonal to vector, can't intersect
42
+ if (isec.isIntersection = (MathUtils.abs(denom) >= MathUtils.EPS)) {
43
+ isec.dist = -(numer / denom);
44
+ isec.pos = ray.getPointAtDistance(isec.dist);
45
+ isec.normal = plane.normal;
46
+ }
47
+ return isec.isIntersection;
48
+ }
49
+
50
+ /**
51
+ * @param p
52
+ * the plane to set
53
+ */
54
+ public void setPlane(Plane p) {
55
+ this.plane = p;
56
+ }
57
+ }
@@ -0,0 +1,253 @@
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.geom;
29
+
30
+ import java.util.ArrayList;
31
+ import java.util.Iterator;
32
+ import java.util.List;
33
+
34
+ import toxi.math.MathUtils;
35
+
36
+ /**
37
+ *
38
+ * @author tux
39
+ */
40
+ public class PointCloud3D implements Iterable<Vec3D> {
41
+
42
+ /**
43
+ *
44
+ */
45
+ protected List<Vec3D> points;
46
+
47
+ protected Vec3D min,
48
+
49
+ /**
50
+ *
51
+ */
52
+
53
+ /**
54
+ *
55
+ */
56
+ max;
57
+
58
+ /**
59
+ *
60
+ */
61
+ protected Vec3D centroid;
62
+
63
+ /**
64
+ *
65
+ */
66
+ protected float radiusSquared;
67
+
68
+ /**
69
+ *
70
+ */
71
+ public PointCloud3D() {
72
+ this(100);
73
+ }
74
+
75
+ /**
76
+ *
77
+ * @param numPoints
78
+ */
79
+ public PointCloud3D(int numPoints) {
80
+ points = new ArrayList<>(numPoints);
81
+ clear();
82
+ }
83
+
84
+ /**
85
+ *
86
+ * @param plist
87
+ * @return
88
+ */
89
+ public PointCloud3D addAll(List<? extends Vec3D> plist) {
90
+ for (Vec3D p : plist) {
91
+ addPoint(p);
92
+ }
93
+ return this;
94
+ }
95
+
96
+ /**
97
+ *
98
+ * @param p
99
+ * @return
100
+ */
101
+ public PointCloud3D addPoint(Vec3D p) {
102
+ points.add(p);
103
+ min.minSelf(p);
104
+ max.maxSelf(p);
105
+ centroid.set(min.add(max).scaleSelf(0.5f));
106
+ radiusSquared = MathUtils.max(radiusSquared,
107
+ p.distanceToSquared(centroid));
108
+ return this;
109
+ }
110
+
111
+ /**
112
+ * Applies the given transformation matrix to all points in the cloud.
113
+ *
114
+ * @param m
115
+ * transformation matrix
116
+ * @return itself
117
+ */
118
+ public PointCloud3D applyMatrix(Matrix4x4 m) {
119
+ for (Vec3D p : points) {
120
+ p.set(m.applyTo(p));
121
+ }
122
+ updateBounds();
123
+ return this;
124
+ }
125
+
126
+ /**
127
+ * Updates all points in the cloud so that their new centroid is at the
128
+ * origin.
129
+ *
130
+ * @return itself
131
+ */
132
+ public PointCloud3D center() {
133
+ return center(null);
134
+ }
135
+
136
+ /**
137
+ * Updates all points in the cloud so that their new centroid is at the
138
+ * given point.
139
+ *
140
+ * @param origin
141
+ * new centroid
142
+ * @return itself
143
+ */
144
+ public PointCloud3D center(ReadonlyVec3D origin) {
145
+ getCentroid();
146
+ Vec3D delta = origin != null ? origin.sub(centroid) : centroid
147
+ .getInverted();
148
+ for (Vec3D p : points) {
149
+ p.addSelf(delta);
150
+ }
151
+ min.addSelf(delta);
152
+ max.addSelf(delta);
153
+ centroid.addSelf(delta);
154
+ return this;
155
+ }
156
+
157
+ /**
158
+ * Removes all points from the cloud and resets the bounds and centroid.
159
+ *
160
+ * @return itself
161
+ */
162
+ public final PointCloud3D clear() {
163
+ points.clear();
164
+ min = Vec3D.MAX_VALUE.copy();
165
+ max = Vec3D.NEG_MAX_VALUE.copy();
166
+ centroid = new Vec3D();
167
+ return this;
168
+ }
169
+
170
+ /**
171
+ * Creates a deep copy of the cloud
172
+ *
173
+ * @return copied instance
174
+ */
175
+ public PointCloud3D copy() {
176
+ PointCloud3D c = new PointCloud3D(points.size());
177
+ for (ReadonlyVec3D p : points) {
178
+ c.addPoint(p.copy());
179
+ }
180
+ return c;
181
+ }
182
+
183
+ /**
184
+ *
185
+ * @return
186
+ */
187
+ public AABB getBoundingBox() {
188
+ return AABB.fromMinMax(min, max);
189
+ }
190
+
191
+ /**
192
+ *
193
+ * @return
194
+ */
195
+ public Sphere getBoundingSphere() {
196
+ return new Sphere(getCentroid(), (float) Math.sqrt(radiusSquared));
197
+ }
198
+
199
+ /**
200
+ * @return the cloud centroid
201
+ */
202
+ public Vec3D getCentroid() {
203
+ return centroid;
204
+ }
205
+
206
+ /**
207
+ * @return an iterator for the backing point collection.
208
+ *
209
+ * @see java.lang.Iterable#iterator()
210
+ */
211
+ public Iterator<Vec3D> iterator() {
212
+ return points.iterator();
213
+ }
214
+
215
+ /**
216
+ * Removes the point from the cloud, but doesn't update the bounds
217
+ * automatically.
218
+ *
219
+ * @param p
220
+ * @return true, if point has been removed.
221
+ */
222
+ public boolean removePoint(ReadonlyVec3D p) {
223
+ return points.remove(p);
224
+ }
225
+
226
+ /**
227
+ * @return the current number of points in the cloud
228
+ */
229
+ public int size() {
230
+ return points.size();
231
+ }
232
+
233
+ /**
234
+ * Recalculates the bounding box, bounding sphere and centroid of the cloud.
235
+ *
236
+ * @return itself
237
+ */
238
+ public PointCloud3D updateBounds() {
239
+ min = Vec3D.MAX_VALUE.copy();
240
+ max = Vec3D.NEG_MAX_VALUE.copy();
241
+ for (Vec3D p : points) {
242
+ min.minSelf(p);
243
+ max.maxSelf(p);
244
+ }
245
+ centroid.set(min.add(max).scaleSelf(0.5f));
246
+ radiusSquared = 0;
247
+ for (ReadonlyVec3D p : points) {
248
+ radiusSquared = MathUtils.max(radiusSquared,
249
+ p.distanceToSquared(centroid));
250
+ }
251
+ return this;
252
+ }
253
+ }
@@ -0,0 +1,502 @@
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.geom;
29
+
30
+ import java.util.ArrayList;
31
+ import java.util.Collection;
32
+ import java.util.List;
33
+
34
+ /**
35
+ * Implements a spatial subdivision tree to work efficiently with large numbers
36
+ * of 3D particles. This octree can only be used for particle type objects and
37
+ * does NOT support 3D mesh geometry as other forms of Octrees do.
38
+ *
39
+ * For further reference also see the OctreeDemo in the /examples folder.
40
+ *
41
+ */
42
+ public class PointOctree extends AABB implements Shape3D {
43
+
44
+ /**
45
+ * alternative tree recursion limit, number of world units when cells are
46
+ * not subdivided any further
47
+ */
48
+ protected float minNodeSize = 4;
49
+
50
+ /**
51
+ *
52
+ */
53
+ protected PointOctree parent;
54
+
55
+ /**
56
+ *
57
+ */
58
+ protected PointOctree[] children;
59
+
60
+ /**
61
+ *
62
+ */
63
+ protected byte numChildren;
64
+
65
+ /**
66
+ *
67
+ */
68
+ protected ArrayList<Vec3D> points;
69
+
70
+ protected float size,
71
+
72
+ /**
73
+ *
74
+ */
75
+
76
+ /**
77
+ *
78
+ */
79
+ halfSize;
80
+
81
+ /**
82
+ *
83
+ */
84
+ protected Vec3D offset;
85
+
86
+ private int depth = 0;
87
+
88
+ private boolean isAutoReducing = false;
89
+
90
+ /**
91
+ * Constructs a new PointOctree node within the AABB cube volume: {o.x, o.y,
92
+ * o.z} ... {o.x+size, o.y+size, o.z+size}
93
+ *
94
+ * @param p
95
+ * parent node
96
+ * @param o
97
+ * tree origin
98
+ * @param halfSize
99
+ * half length of the tree volume along a single axis
100
+ */
101
+ private PointOctree(PointOctree p, Vec3D o, float halfSize) {
102
+ super(o.add(halfSize, halfSize, halfSize), new Vec3D(halfSize,
103
+ halfSize, halfSize));
104
+ this.parent = p;
105
+ this.halfSize = halfSize;
106
+ this.size = halfSize * 2;
107
+ this.offset = o;
108
+ this.numChildren = 0;
109
+ if (parent != null) {
110
+ depth = parent.depth + 1;
111
+ minNodeSize = parent.minNodeSize;
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Constructs a new PointOctree node within the AABB cube volume: {o.x, o.y,
117
+ * o.z} ... {o.x+size, o.y+size, o.z+size}
118
+ *
119
+ * @param o
120
+ * tree origin
121
+ * @param size
122
+ * size of the tree volume along a single axis
123
+ */
124
+ public PointOctree(Vec3D o, float size) {
125
+ this(null, o, size / 2);
126
+ }
127
+
128
+ /**
129
+ * Adds all points of the collection to the octree. IMPORTANT: Points need
130
+ * be of type Vec3D or have subclassed it.
131
+ *
132
+ * @param points
133
+ * point collection
134
+ * @return true, if all points have been added successfully.
135
+ */
136
+ public boolean addAll(Collection<Vec3D> points) {
137
+ boolean addedAll = true;
138
+ for (Vec3D p : points) {
139
+ addedAll &= addPoint(p);
140
+ }
141
+ return addedAll;
142
+ }
143
+
144
+ /**
145
+ * Adds a new point/particle to the tree structure. All points are stored
146
+ * within leaf nodes only. The tree implementation is using lazy
147
+ * instantiation for all intermediate tree levels.
148
+ *
149
+ * @param p
150
+ * @return true, if point has been added successfully
151
+ */
152
+ public boolean addPoint(Vec3D p) {
153
+ // check if point is inside cube
154
+ if (containsPoint(p)) {
155
+ // only add points to leaves for now
156
+ if (halfSize <= minNodeSize) {
157
+ if (points == null) {
158
+ points = new ArrayList<>();
159
+ }
160
+ points.add(p);
161
+ return true;
162
+ } else {
163
+ Vec3D plocal = p.sub(offset);
164
+ if (children == null) {
165
+ children = new PointOctree[8];
166
+ }
167
+ int octant = getOctantID(plocal);
168
+ if (children[octant] == null) {
169
+ Vec3D off = offset.add(new Vec3D(
170
+ (octant & 1) != 0 ? halfSize : 0,
171
+ (octant & 2) != 0 ? halfSize : 0,
172
+ (octant & 4) != 0 ? halfSize : 0));
173
+ children[octant] = new PointOctree(this, off,
174
+ halfSize * 0.5f);
175
+ numChildren++;
176
+ }
177
+ return children[octant].addPoint(p);
178
+ }
179
+ }
180
+ return false;
181
+ }
182
+
183
+ /**
184
+ * Applies the given {@link OctreeVisitor} implementation to this node and
185
+ * all of its children.
186
+ * @param visitor
187
+ */
188
+ public void applyVisitor(OctreeVisitor visitor) {
189
+ visitor.visitNode(this);
190
+ if (numChildren > 0) {
191
+ for (PointOctree c : children) {
192
+ if (c != null) {
193
+ c.applyVisitor(visitor);
194
+ }
195
+ }
196
+ }
197
+ }
198
+
199
+ @Override
200
+ public boolean containsPoint(ReadonlyVec3D p) {
201
+ return p.isInAABB(this);
202
+ }
203
+
204
+ /**
205
+ *
206
+ */
207
+ public void empty() {
208
+ numChildren = 0;
209
+ children = null;
210
+ points = null;
211
+ }
212
+
213
+ /**
214
+ * @return a copy of the child nodes array
215
+ */
216
+ public PointOctree[] getChildren() {
217
+ if (children != null) {
218
+ PointOctree[] clones = new PointOctree[8];
219
+ System.arraycopy(children, 0, clones, 0, 8);
220
+ return clones;
221
+ }
222
+ return null;
223
+ }
224
+
225
+ /**
226
+ * @return the depth
227
+ */
228
+ public int getDepth() {
229
+ return depth;
230
+ }
231
+
232
+ /**
233
+ * Finds the leaf node which spatially relates to the given point
234
+ *
235
+ * @param p
236
+ * point to check
237
+ * @return leaf node or null if point is outside the tree dimensions
238
+ */
239
+ public PointOctree getLeafForPoint(ReadonlyVec3D p) {
240
+ // if not a leaf node...
241
+ if (p.isInAABB(this)) {
242
+ if (numChildren > 0) {
243
+ int octant = getOctantID(p.sub(offset));
244
+ if (children[octant] != null) {
245
+ return children[octant].getLeafForPoint(p);
246
+ }
247
+ } else if (points != null) {
248
+ return this;
249
+ }
250
+ }
251
+ return null;
252
+ }
253
+
254
+ /**
255
+ * Returns the minimum size of nodes (in world units). This value acts as
256
+ * tree recursion limit since nodes smaller than this size are not
257
+ * subdivided further. Leaf node are always smaller or equal to this size.
258
+ *
259
+ * @return the minimum size of tree nodes
260
+ */
261
+ public float getMinNodeSize() {
262
+ return minNodeSize;
263
+ }
264
+
265
+ /**
266
+ *
267
+ * @return
268
+ */
269
+ public float getNodeSize() {
270
+ return size;
271
+ }
272
+
273
+ /**
274
+ * @return the number of child nodes (max. 8)
275
+ */
276
+ public int getNumChildren() {
277
+ return numChildren;
278
+ }
279
+
280
+ /**
281
+ * Computes the local child octant/cube index for the given point
282
+ *
283
+ * @param plocal
284
+ * point in the node-local coordinate system
285
+ * @return octant index
286
+ */
287
+ protected final int getOctantID(Vec3D plocal) {
288
+ return (plocal.x >= halfSize ? 1 : 0) + (plocal.y >= halfSize ? 2 : 0)
289
+ + (plocal.z >= halfSize ? 4 : 0);
290
+ }
291
+
292
+ /**
293
+ * @return the offset
294
+ */
295
+ public ReadonlyVec3D getOffset() {
296
+ return offset;
297
+ }
298
+
299
+ /**
300
+ * @return the parent
301
+ */
302
+ public PointOctree getParent() {
303
+ return parent;
304
+ }
305
+
306
+ /**
307
+ * @return the points
308
+ */
309
+ public List<Vec3D> getPoints() {
310
+ List<Vec3D> results = null;
311
+ if (points != null) {
312
+ results = new ArrayList<>(points);
313
+ } else if (numChildren > 0) {
314
+ for (int i = 0; i < 8; i++) {
315
+ if (children[i] != null) {
316
+ List<Vec3D> childPoints = children[i].getPoints();
317
+ if (childPoints != null) {
318
+ if (results == null) {
319
+ results = new ArrayList<>();
320
+ }
321
+ results.addAll(childPoints);
322
+ }
323
+ }
324
+ }
325
+ }
326
+ return results;
327
+ }
328
+
329
+ /**
330
+ * Selects all stored points within the given axis-aligned bounding box.
331
+ *
332
+ * @param b
333
+ * AABB
334
+ * @return all points with the box volume
335
+ */
336
+ public List<Vec3D> getPointsWithinBox(AABB b) {
337
+ ArrayList<Vec3D> results = null;
338
+ if (this.intersectsBox(b)) {
339
+ if (points != null) {
340
+ for (Vec3D q : points) {
341
+ if (q.isInAABB(b)) {
342
+ if (results == null) {
343
+ results = new ArrayList<>();
344
+ }
345
+ results.add(q);
346
+ }
347
+ }
348
+ } else if (numChildren > 0) {
349
+ for (int i = 0; i < 8; i++) {
350
+ if (children[i] != null) {
351
+ List<Vec3D> pts = children[i].getPointsWithinBox(b);
352
+ if (pts != null) {
353
+ if (results == null) {
354
+ results = new ArrayList<>();
355
+ }
356
+ results.addAll(pts);
357
+ }
358
+ }
359
+ }
360
+ }
361
+ }
362
+ return results;
363
+ }
364
+
365
+ /**
366
+ * Selects all stored points within the given sphere volume
367
+ *
368
+ * @param s
369
+ * sphere
370
+ * @return selected points
371
+ */
372
+ public List<Vec3D> getPointsWithinSphere(Sphere s) {
373
+ ArrayList<Vec3D> results = null;
374
+ if (this.intersectsSphere(s)) {
375
+ if (points != null) {
376
+ for (Vec3D q : points) {
377
+ if (s.containsPoint(q)) {
378
+ if (results == null) {
379
+ results = new ArrayList<>();
380
+ }
381
+ results.add(q);
382
+ }
383
+ }
384
+ } else if (numChildren > 0) {
385
+ for (int i = 0; i < 8; i++) {
386
+ if (children[i] != null) {
387
+ List<Vec3D> pts = children[i]
388
+ .getPointsWithinSphere(s);
389
+ if (pts != null) {
390
+ if (results == null) {
391
+ results = new ArrayList<>();
392
+ }
393
+ results.addAll(pts);
394
+ }
395
+ }
396
+ }
397
+ }
398
+ }
399
+ return results;
400
+ }
401
+
402
+ /**
403
+ * Selects all stored points within the given sphere volume
404
+ *
405
+ * @param sphereOrigin
406
+ * @param clipRadius
407
+ * @return selected points
408
+ */
409
+ public List<Vec3D> getPointsWithinSphere(Vec3D sphereOrigin,
410
+ float clipRadius) {
411
+ return getPointsWithinSphere(new Sphere(sphereOrigin, clipRadius));
412
+ }
413
+
414
+ /**
415
+ * @return the size
416
+ */
417
+ public float getSize() {
418
+ return size;
419
+ }
420
+
421
+ private void reduceBranch() {
422
+ if (points != null && points.isEmpty()) {
423
+ points = null;
424
+ }
425
+ if (numChildren > 0) {
426
+ for (int i = 0; i < 8; i++) {
427
+ if (children[i] != null && children[i].points == null) {
428
+ children[i] = null;
429
+ }
430
+ }
431
+ }
432
+ if (parent != null) {
433
+ parent.reduceBranch();
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Removes a point from the tree and (optionally) tries to release memory by
439
+ * reducing now empty sub-branches.
440
+ *
441
+ * @param p
442
+ * point to delete
443
+ * @return true, if the point was found & removed
444
+ */
445
+ public boolean remove(Vec3D p) {
446
+ boolean found = false;
447
+ PointOctree leaf = getLeafForPoint(p);
448
+ if (leaf != null) {
449
+ if (leaf.points.remove(p)) {
450
+ found = true;
451
+ if (isAutoReducing && leaf.points.isEmpty()) {
452
+ leaf.reduceBranch();
453
+ }
454
+ }
455
+ }
456
+ return found;
457
+ }
458
+
459
+ /**
460
+ *
461
+ * @param points
462
+ */
463
+ public void removeAll(Collection<Vec3D> points) {
464
+ for (Vec3D p : points) {
465
+ remove(p);
466
+ }
467
+ }
468
+
469
+ /**
470
+ * @param minNodeSize
471
+ */
472
+ public void setMinNodeSize(float minNodeSize) {
473
+ this.minNodeSize = minNodeSize * 0.5f;
474
+ }
475
+
476
+ /**
477
+ * Enables/disables auto reduction of branches after points have been
478
+ * deleted from the tree. Turned off by default.
479
+ *
480
+ * @param state
481
+ * true, to enable feature
482
+ */
483
+ public void setTreeAutoReduction(boolean state) {
484
+ isAutoReducing = state;
485
+ }
486
+
487
+ /*
488
+ * (non-Javadoc)
489
+ *
490
+ * @see toxi.geom.AABB#toString()
491
+ */
492
+
493
+ /**
494
+ *
495
+ * @return
496
+ */
497
+
498
+ @Override
499
+ public String toString() {
500
+ return "<octree> offset: " + super.toString() + " size: " + size;
501
+ }
502
+ }