toxiclibs 1.0.0 → 2.0.0

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 (368) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/extensions.xml +1 -1
  3. data/.travis.yml +3 -4
  4. data/CHANGELOG.md +3 -0
  5. data/README.md +2 -2
  6. data/Rakefile +0 -1
  7. data/examples/attract_repel/attractor.rb +1 -1
  8. data/examples/attract_repel/particle.rb +1 -1
  9. data/examples/boolean_shapes.rb +9 -5
  10. data/examples/force_directed/node.rb +1 -1
  11. data/examples/inflate_mesh.rb +1 -1
  12. data/examples/model_align.rb +1 -1
  13. data/examples/physics_type.rb +1 -1
  14. data/examples/povmesh/ftest.rb +3 -3
  15. data/examples/toxiclibs_color_theme.rb +91 -0
  16. data/lib/toxiclibs.rb +52 -37
  17. data/lib/toxiclibs/version.rb +1 -1
  18. data/pom.rb +22 -26
  19. data/pom.xml +42 -64
  20. data/src/{toxi → main/java/toxi}/color/AccessCriteria.java +0 -0
  21. data/src/{toxi → main/java/toxi}/color/AlphaAccessor.java +0 -0
  22. data/src/{toxi → main/java/toxi}/color/CMYKAccessor.java +0 -0
  23. data/src/{toxi → main/java/toxi}/color/CMYKDistanceProxy.java +0 -0
  24. data/src/{toxi → main/java/toxi}/color/ColorGradient.java +0 -0
  25. data/src/{toxi → main/java/toxi}/color/ColorList.java +2 -4
  26. data/src/{toxi → main/java/toxi}/color/ColorRange.java +0 -0
  27. data/src/{toxi → main/java/toxi}/color/ColorTheme.java +0 -0
  28. data/src/{toxi → main/java/toxi}/color/DistanceProxy.java +0 -0
  29. data/src/{toxi → main/java/toxi}/color/HSVAccessor.java +0 -0
  30. data/src/{toxi → main/java/toxi}/color/HSVDistanceProxy.java +0 -0
  31. data/src/{toxi → main/java/toxi}/color/HistEntry.java +0 -0
  32. data/src/{toxi → main/java/toxi}/color/Histogram.java +0 -0
  33. data/src/{toxi → main/java/toxi}/color/Hue.java +0 -0
  34. data/src/{toxi → main/java/toxi}/color/LuminanceAccessor.java +0 -0
  35. data/src/{toxi → main/java/toxi}/color/NamedColor.java +0 -0
  36. data/src/{toxi → main/java/toxi}/color/ProximityComparator.java +0 -0
  37. data/src/{toxi → main/java/toxi}/color/RGBAccessor.java +0 -0
  38. data/src/{toxi → main/java/toxi}/color/RGBDistanceProxy.java +0 -0
  39. data/src/{toxi → main/java/toxi}/color/ReadonlyTColor.java +0 -0
  40. data/src/{toxi → main/java/toxi}/color/TColor.java +0 -0
  41. data/src/{toxi → main/java/toxi}/color/TColorAdapter.java +4 -4
  42. data/src/{toxi → main/java/toxi}/color/ToneMap.java +0 -0
  43. data/src/{toxi → main/java/toxi}/color/theory/AnalogousStrategy.java +0 -0
  44. data/src/{toxi → main/java/toxi}/color/theory/ColorTheoryRegistry.java +0 -0
  45. data/src/{toxi → main/java/toxi}/color/theory/ColorTheoryStrategy.java +0 -0
  46. data/src/{toxi → main/java/toxi}/color/theory/ComplementaryStrategy.java +0 -0
  47. data/src/{toxi → main/java/toxi}/color/theory/CompoundTheoryStrategy.java +0 -0
  48. data/src/{toxi → main/java/toxi}/color/theory/LeftSplitComplementaryStrategy.java +0 -0
  49. data/src/{toxi → main/java/toxi}/color/theory/MonochromeTheoryStrategy.java +0 -0
  50. data/src/{toxi → main/java/toxi}/color/theory/RightSplitComplementaryStrategy.java +0 -0
  51. data/src/{toxi → main/java/toxi}/color/theory/SingleComplementStrategy.java +0 -0
  52. data/src/{toxi → main/java/toxi}/color/theory/SplitComplementaryStrategy.java +0 -0
  53. data/src/{toxi → main/java/toxi}/color/theory/TetradTheoryStrategy.java +0 -0
  54. data/src/{toxi → main/java/toxi}/color/theory/TriadTheoryStrategy.java +0 -0
  55. data/src/{toxi → main/java/toxi}/data/csv/CSVAdapter.java +0 -0
  56. data/src/{toxi → main/java/toxi}/data/csv/CSVFieldMapper.java +0 -0
  57. data/src/{toxi → main/java/toxi}/data/csv/CSVListener.java +0 -0
  58. data/src/{toxi → main/java/toxi}/data/csv/CSVParser.java +0 -0
  59. data/src/{toxi → main/java/toxi}/data/feeds/AtomAuthor.java +2 -2
  60. data/src/{toxi → main/java/toxi}/data/feeds/AtomContent.java +3 -4
  61. data/src/{toxi → main/java/toxi}/data/feeds/AtomEntry.java +9 -13
  62. data/src/main/java/toxi/data/feeds/AtomFeed.java +91 -0
  63. data/src/{toxi → main/java/toxi}/data/feeds/AtomLink.java +3 -2
  64. data/src/{toxi → main/java/toxi}/data/feeds/RSSChannel.java +10 -11
  65. data/src/{toxi → main/java/toxi}/data/feeds/RSSEnclosure.java +3 -3
  66. data/src/{toxi → main/java/toxi}/data/feeds/RSSItem.java +11 -13
  67. data/src/{toxi → main/java/toxi}/data/feeds/util/EntityStripper.java +0 -0
  68. data/src/{toxi → main/java/toxi}/data/feeds/util/Iso8601DateAdapter.java +6 -7
  69. data/src/{toxi → main/java/toxi}/data/feeds/util/Rfc822DateAdapter.java +5 -6
  70. data/src/{toxi → main/java/toxi}/geom/AABB.java +8 -9
  71. data/src/{toxi → main/java/toxi}/geom/Axis3D.java +0 -0
  72. data/src/{toxi → main/java/toxi}/geom/AxisAlignedCylinder.java +0 -0
  73. data/src/{toxi → main/java/toxi}/geom/BernsteinPolynomial.java +0 -0
  74. data/src/{toxi → main/java/toxi}/geom/BezierCurve2D.java +0 -0
  75. data/src/{toxi → main/java/toxi}/geom/BezierCurve3D.java +0 -0
  76. data/src/{toxi → main/java/toxi}/geom/BooleanShapeBuilder.java +0 -0
  77. data/src/{toxi → main/java/toxi}/geom/BoxIntersector.java +0 -0
  78. data/src/{toxi → main/java/toxi}/geom/Circle.java +2 -2
  79. data/src/{toxi → main/java/toxi}/geom/CircleIntersector.java +0 -0
  80. data/src/{toxi → main/java/toxi}/geom/Cone.java +0 -0
  81. data/src/{toxi → main/java/toxi}/geom/ConvexPolygonClipper.java +0 -0
  82. data/src/{toxi → main/java/toxi}/geom/CoordinateExtractor.java +0 -0
  83. data/src/{toxi → main/java/toxi}/geom/Ellipse.java +0 -0
  84. data/src/{toxi → main/java/toxi}/geom/GMatrix.java +0 -0
  85. data/src/{toxi → main/java/toxi}/geom/GVector.java +0 -0
  86. data/src/{toxi → main/java/toxi}/geom/GlobalGridTesselator.java +0 -0
  87. data/src/{toxi → main/java/toxi}/geom/GridTesselator.java +0 -0
  88. data/src/{toxi → main/java/toxi}/geom/Intersector2D.java +0 -0
  89. data/src/{toxi → main/java/toxi}/geom/Intersector3D.java +0 -0
  90. data/src/{toxi → main/java/toxi}/geom/IsectData2D.java +0 -0
  91. data/src/{toxi → main/java/toxi}/geom/IsectData3D.java +0 -0
  92. data/src/{toxi → main/java/toxi}/geom/Line2D.java +1 -2
  93. data/src/{toxi → main/java/toxi}/geom/Line3D.java +1 -2
  94. data/src/{toxi → main/java/toxi}/geom/LineStrip2D.java +2 -2
  95. data/src/{toxi → main/java/toxi}/geom/LineStrip3D.java +2 -2
  96. data/src/{toxi → main/java/toxi}/geom/LocalGridTesselator.java +0 -0
  97. data/src/{toxi → main/java/toxi}/geom/Matrix3d.java +0 -0
  98. data/src/{toxi → main/java/toxi}/geom/Matrix4f.java +0 -0
  99. data/src/{toxi → main/java/toxi}/geom/Matrix4x4.java +0 -0
  100. data/src/{toxi → main/java/toxi}/geom/MatrixSizeException.java +0 -0
  101. data/src/{toxi → main/java/toxi}/geom/OctreeVisitor.java +0 -0
  102. data/src/{toxi → main/java/toxi}/geom/Origin3D.java +12 -6
  103. data/src/{toxi → main/java/toxi}/geom/Plane.java +3 -5
  104. data/src/{toxi → main/java/toxi}/geom/PlaneIntersector.java +0 -0
  105. data/src/{toxi → main/java/toxi}/geom/PointCloud3D.java +15 -12
  106. data/src/{toxi → main/java/toxi}/geom/PointOctree.java +0 -0
  107. data/src/{toxi → main/java/toxi}/geom/PointQuadtree.java +0 -0
  108. data/src/{toxi → main/java/toxi}/geom/Polygon2D.java +34 -45
  109. data/src/{toxi → main/java/toxi}/geom/PolygonClipper2D.java +0 -0
  110. data/src/{toxi → main/java/toxi}/geom/PolygonTesselator.java +0 -0
  111. data/src/{toxi → main/java/toxi}/geom/QuadtreeVisitor.java +0 -0
  112. data/src/{toxi → main/java/toxi}/geom/Quaternion.java +3 -5
  113. data/src/{toxi → main/java/toxi}/geom/Ray2D.java +4 -5
  114. data/src/{toxi → main/java/toxi}/geom/Ray3D.java +3 -5
  115. data/src/{toxi → main/java/toxi}/geom/Ray3DIntersector.java +0 -0
  116. data/src/{toxi → main/java/toxi}/geom/ReadonlyVec2D.java +0 -0
  117. data/src/{toxi → main/java/toxi}/geom/ReadonlyVec3D.java +0 -0
  118. data/src/{toxi → main/java/toxi}/geom/ReadonlyVec4D.java +0 -0
  119. data/src/{toxi → main/java/toxi}/geom/Rect.java +3 -5
  120. data/src/{toxi → main/java/toxi}/geom/Reflector3D.java +0 -0
  121. data/src/{toxi → main/java/toxi}/geom/Shape2D.java +0 -0
  122. data/src/{toxi → main/java/toxi}/geom/Shape3D.java +0 -0
  123. data/src/{toxi → main/java/toxi}/geom/SingularMatrixException.java +0 -0
  124. data/src/{toxi → main/java/toxi}/geom/SpatialBins.java +0 -0
  125. data/src/{toxi → main/java/toxi}/geom/SpatialIndex.java +0 -0
  126. data/src/{toxi → main/java/toxi}/geom/Sphere.java +3 -5
  127. data/src/{toxi → main/java/toxi}/geom/SphereIntersectorReflector.java +0 -0
  128. data/src/{toxi → main/java/toxi}/geom/Spline2D.java +12 -16
  129. data/src/{toxi → main/java/toxi}/geom/Spline3D.java +12 -16
  130. data/src/{toxi → main/java/toxi}/geom/SutherlandHodgemanClipper.java +0 -0
  131. data/src/{toxi → main/java/toxi}/geom/Triangle2D.java +4 -7
  132. data/src/{toxi → main/java/toxi}/geom/Triangle3D.java +5 -8
  133. data/src/{toxi → main/java/toxi}/geom/TriangleIntersector.java +0 -0
  134. data/src/{toxi → main/java/toxi}/geom/Vec2D.java +3 -3
  135. data/src/{toxi → main/java/toxi}/geom/Vec3D.java +4 -4
  136. data/src/{toxi → main/java/toxi}/geom/Vec4D.java +5 -5
  137. data/src/{toxi → main/java/toxi}/geom/VecMathUtil.java +0 -0
  138. data/src/{toxi → main/java/toxi}/geom/XAxisCylinder.java +0 -0
  139. data/src/{toxi → main/java/toxi}/geom/YAxisCylinder.java +0 -0
  140. data/src/{toxi → main/java/toxi}/geom/ZAxisCylinder.java +0 -0
  141. data/src/{toxi → main/java/toxi}/geom/mesh/BezierPatch.java +0 -0
  142. data/src/{toxi → main/java/toxi}/geom/mesh/BoxSelector.java +0 -0
  143. data/src/{toxi → main/java/toxi}/geom/mesh/DefaultSTLColorModel.java +0 -0
  144. data/src/{toxi → main/java/toxi}/geom/mesh/DefaultSelector.java +0 -0
  145. data/src/{toxi → main/java/toxi}/geom/mesh/Face.java +0 -0
  146. data/src/{toxi → main/java/toxi}/geom/mesh/LaplacianSmooth.java +0 -0
  147. data/src/{toxi → main/java/toxi}/geom/mesh/MaterialiseSTLColorModel.java +0 -0
  148. data/src/{toxi → main/java/toxi}/geom/mesh/Mesh3D.java +0 -0
  149. data/src/{toxi → main/java/toxi}/geom/mesh/MeshIntersector.java +0 -0
  150. data/src/{toxi → main/java/toxi}/geom/mesh/OBJWriter.java +0 -0
  151. data/src/{toxi → main/java/toxi}/geom/mesh/PLYWriter.java +0 -0
  152. data/src/{toxi → main/java/toxi}/geom/mesh/PlaneSelector.java +0 -0
  153. data/src/{toxi → main/java/toxi}/geom/mesh/STLColorModel.java +0 -0
  154. data/src/{toxi → main/java/toxi}/geom/mesh/STLReader.java +0 -0
  155. data/src/{toxi → main/java/toxi}/geom/mesh/STLWriter.java +0 -0
  156. data/src/{toxi → main/java/toxi}/geom/mesh/SphereFunction.java +0 -0
  157. data/src/{toxi → main/java/toxi}/geom/mesh/SphericalHarmonics.java +0 -0
  158. data/src/{toxi → main/java/toxi}/geom/mesh/SuperEllipsoid.java +0 -0
  159. data/src/{toxi → main/java/toxi}/geom/mesh/SurfaceFunction.java +0 -0
  160. data/src/{toxi → main/java/toxi}/geom/mesh/SurfaceMeshBuilder.java +0 -0
  161. data/src/{toxi → main/java/toxi}/geom/mesh/Terrain.java +0 -0
  162. data/src/{toxi → main/java/toxi}/geom/mesh/TriangleMesh.java +0 -0
  163. data/src/{toxi → main/java/toxi}/geom/mesh/Vertex.java +0 -0
  164. data/src/{toxi → main/java/toxi}/geom/mesh/VertexSelector.java +0 -0
  165. data/src/{toxi → main/java/toxi}/geom/mesh/WEFace.java +0 -0
  166. data/src/{toxi → main/java/toxi}/geom/mesh/WEMeshFilterStrategy.java +0 -0
  167. data/src/{toxi → main/java/toxi}/geom/mesh/WETriangleMesh.java +0 -0
  168. data/src/{toxi → main/java/toxi}/geom/mesh/WEVertex.java +0 -0
  169. data/src/{toxi → main/java/toxi}/geom/mesh/WingedEdge.java +2 -2
  170. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/CentroidSubdiv.java +0 -0
  171. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/DisplacementSubdivision.java +0 -0
  172. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/DualDisplacementSubdivision.java +0 -0
  173. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/DualSubdivision.java +0 -0
  174. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/EdgeLengthComparator.java +0 -0
  175. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/FaceCountComparator.java +0 -0
  176. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +0 -0
  177. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/MidpointSubdiv.java +0 -0
  178. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/MidpointSubdivision.java +0 -0
  179. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/NewSubdivStrategy.java +0 -0
  180. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/NormalDisplacementSubdivision.java +0 -0
  181. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/SubdivisionStrategy.java +0 -0
  182. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/TriSubdivision.java +0 -0
  183. data/src/{toxi → main/java/toxi}/geom/mesh2d/DelaunayTriangle.java +0 -0
  184. data/src/{toxi → main/java/toxi}/geom/mesh2d/DelaunayTriangulation.java +5 -7
  185. data/src/{toxi → main/java/toxi}/geom/mesh2d/DelaunayVertex.java +0 -0
  186. data/src/{toxi → main/java/toxi}/geom/mesh2d/Voronoi.java +0 -0
  187. data/src/{toxi → main/java/toxi}/geom/nurbs/BasicNurbsCurve.java +0 -0
  188. data/src/{toxi → main/java/toxi}/geom/nurbs/BasicNurbsSurface.java +0 -0
  189. data/src/{toxi → main/java/toxi}/geom/nurbs/ControlNet.java +0 -0
  190. data/src/{toxi → main/java/toxi}/geom/nurbs/CurveCreator.java +0 -0
  191. data/src/{toxi → main/java/toxi}/geom/nurbs/CurveUtils.java +0 -0
  192. data/src/{toxi → main/java/toxi}/geom/nurbs/InterpolationException.java +0 -0
  193. data/src/{toxi → main/java/toxi}/geom/nurbs/KnotVector.java +0 -0
  194. data/src/{toxi → main/java/toxi}/geom/nurbs/NurbsCreator.java +2 -2
  195. data/src/{toxi → main/java/toxi}/geom/nurbs/NurbsCurve.java +0 -0
  196. data/src/{toxi → main/java/toxi}/geom/nurbs/NurbsMeshCreator.java +0 -0
  197. data/src/{toxi → main/java/toxi}/geom/nurbs/NurbsSurface.java +0 -0
  198. data/src/{toxi → main/java/toxi}/image/util/Filter8bit.java +0 -0
  199. data/src/{toxi → main/java/toxi}/image/util/TiledFrameExporter.java +0 -0
  200. data/src/{toxi → main/java/toxi}/math/BezierInterpolation.java +0 -0
  201. data/src/{toxi → main/java/toxi}/math/CircularInterpolation.java +0 -0
  202. data/src/{toxi → main/java/toxi}/math/CosineInterpolation.java +0 -0
  203. data/src/{toxi → main/java/toxi}/math/DecimatedInterpolation.java +0 -0
  204. data/src/{toxi → main/java/toxi}/math/ExponentialInterpolation.java +0 -0
  205. data/src/{toxi → main/java/toxi}/math/InterpolateStrategy.java +0 -0
  206. data/src/{toxi → main/java/toxi}/math/Interpolation2D.java +0 -0
  207. data/src/{toxi → main/java/toxi}/math/LinearInterpolation.java +0 -0
  208. data/src/{toxi → main/java/toxi}/math/MathUtils.java +0 -0
  209. data/src/{toxi → main/java/toxi}/math/NonLinearScaleMap.java +0 -0
  210. data/src/{toxi → main/java/toxi}/math/ScaleMap.java +0 -0
  211. data/src/{toxi → main/java/toxi}/math/SigmoidInterpolation.java +0 -0
  212. data/src/{toxi → main/java/toxi}/math/SinCosLUT.java +0 -0
  213. data/src/{toxi → main/java/toxi}/math/ThresholdInterpolation.java +0 -0
  214. data/src/{toxi → main/java/toxi}/math/ZoomLensInterpolation.java +0 -0
  215. data/src/{toxi → main/java/toxi}/math/conversion/UnitTranslator.java +0 -0
  216. data/src/{toxi → main/java/toxi}/math/noise/PerlinNoise.java +0 -0
  217. data/src/{toxi → main/java/toxi}/math/noise/SimplexNoise.java +0 -0
  218. data/src/{toxi → main/java/toxi}/math/waves/AMFMSineWave.java +0 -0
  219. data/src/{toxi → main/java/toxi}/math/waves/AbstractWave.java +0 -0
  220. data/src/{toxi → main/java/toxi}/math/waves/ConstantWave.java +0 -0
  221. data/src/{toxi → main/java/toxi}/math/waves/FMHarmonicSquareWave.java +0 -0
  222. data/src/{toxi → main/java/toxi}/math/waves/FMSawtoothWave.java +0 -0
  223. data/src/{toxi → main/java/toxi}/math/waves/FMSineWave.java +0 -0
  224. data/src/{toxi → main/java/toxi}/math/waves/FMSquareWave.java +0 -0
  225. data/src/{toxi → main/java/toxi}/math/waves/FMTriangleWave.java +0 -0
  226. data/src/{toxi → main/java/toxi}/math/waves/SineWave.java +2 -2
  227. data/src/{toxi → main/java/toxi}/math/waves/Wave2D.java +0 -0
  228. data/src/{toxi → main/java/toxi}/math/waves/WaveState.java +0 -0
  229. data/src/{toxi → main/java/toxi}/music/scale/AbstractScale.java +0 -0
  230. data/src/{toxi → main/java/toxi}/music/scale/GenericScale.java +0 -0
  231. data/src/{toxi → main/java/toxi}/music/scale/MajorScale.java +0 -0
  232. data/src/{toxi → main/java/toxi}/newmesh/AttributedEdge.java +0 -0
  233. data/src/{toxi → main/java/toxi}/newmesh/AttributedFace.java +0 -0
  234. data/src/{toxi → main/java/toxi}/newmesh/IndexedTriangleMesh.java +70 -69
  235. data/src/{toxi → main/java/toxi}/newmesh/MeshAttributeCompiler.java +0 -0
  236. data/src/{toxi → main/java/toxi}/newmesh/MeshFaceNormalCompiler.java +0 -0
  237. data/src/{toxi → main/java/toxi}/newmesh/MeshUVCompiler.java +0 -0
  238. data/src/{toxi → main/java/toxi}/newmesh/MeshVertexColorCompiler.java +0 -0
  239. data/src/{toxi → main/java/toxi}/newmesh/MeshVertexCompiler.java +0 -0
  240. data/src/{toxi → main/java/toxi}/newmesh/MeshVertexNormalCompiler.java +0 -0
  241. data/src/{toxi → main/java/toxi}/newmesh/SpatialIndex.java +0 -0
  242. data/src/{toxi → main/java/toxi}/physics2d/ParticlePath2D.java +4 -3
  243. data/src/{toxi → main/java/toxi}/physics2d/ParticleString2D.java +2 -2
  244. data/src/{toxi → main/java/toxi}/physics2d/PullBackSpring2D.java +0 -0
  245. data/src/{toxi → main/java/toxi}/physics2d/VerletConstrainedSpring2D.java +0 -0
  246. data/src/{toxi → main/java/toxi}/physics2d/VerletMinDistanceSpring2D.java +0 -0
  247. data/src/main/java/toxi/physics2d/VerletParticle2D.java +449 -0
  248. data/src/main/java/toxi/physics2d/VerletPhysics2D.java +440 -0
  249. data/src/{toxi → main/java/toxi}/physics2d/VerletSpring2D.java +0 -0
  250. data/src/main/java/toxi/physics2d/behaviors/AttractionBehavior2D.java +211 -0
  251. data/src/{toxi → main/java/toxi}/physics2d/behaviors/ConstantForceBehavior2D.java +0 -0
  252. data/src/{toxi → main/java/toxi}/physics2d/behaviors/GravityBehavior2D.java +0 -0
  253. data/src/{toxi → main/java/toxi}/physics2d/behaviors/ParticleBehavior2D.java +0 -0
  254. data/src/{toxi → main/java/toxi}/physics2d/constraints/AngularConstraint.java +0 -0
  255. data/src/{toxi → main/java/toxi}/physics2d/constraints/AxisConstraint.java +0 -0
  256. data/src/{toxi → main/java/toxi}/physics2d/constraints/CircularConstraint.java +0 -0
  257. data/src/{toxi → main/java/toxi}/physics2d/constraints/MaxConstraint.java +0 -0
  258. data/src/{toxi → main/java/toxi}/physics2d/constraints/MinConstraint.java +0 -0
  259. data/src/{toxi → main/java/toxi}/physics2d/constraints/ParticleConstraint2D.java +0 -0
  260. data/src/{toxi → main/java/toxi}/physics2d/constraints/PolygonConstraint.java +0 -0
  261. data/src/{toxi → main/java/toxi}/physics2d/constraints/RectConstraint.java +0 -0
  262. data/src/{toxi → main/java/toxi}/physics3d/ParticlePath3D.java +4 -3
  263. data/src/{toxi → main/java/toxi}/physics3d/ParticleString3D.java +2 -2
  264. data/src/{toxi → main/java/toxi}/physics3d/PullBackSpring3D.java +0 -0
  265. data/src/{toxi → main/java/toxi}/physics3d/VerletConstrainedSpring3D.java +0 -0
  266. data/src/{toxi → main/java/toxi}/physics3d/VerletMinDistanceSpring3D.java +0 -0
  267. data/src/main/java/toxi/physics3d/VerletParticle3D.java +377 -0
  268. data/src/{toxi → main/java/toxi}/physics3d/VerletPhysics3D.java +0 -0
  269. data/src/{toxi → main/java/toxi}/physics3d/VerletSpring3D.java +0 -0
  270. data/src/{toxi → main/java/toxi}/physics3d/behaviors/AttractionBehavior3D.java +0 -0
  271. data/src/{toxi → main/java/toxi}/physics3d/behaviors/ConstantForceBehavior3D.java +0 -0
  272. data/src/{toxi → main/java/toxi}/physics3d/behaviors/GravityBehavior3D.java +0 -0
  273. data/src/{toxi → main/java/toxi}/physics3d/behaviors/ParticleBehavior3D.java +0 -0
  274. data/src/{toxi → main/java/toxi}/physics3d/constraints/AxisConstraint.java +1 -0
  275. data/src/{toxi → main/java/toxi}/physics3d/constraints/BoxConstraint.java +0 -0
  276. data/src/{toxi → main/java/toxi}/physics3d/constraints/CylinderConstraint.java +1 -0
  277. data/src/{toxi → main/java/toxi}/physics3d/constraints/MaxConstraint.java +1 -0
  278. data/src/{toxi → main/java/toxi}/physics3d/constraints/MinConstraint.java +1 -0
  279. data/src/{toxi → main/java/toxi}/physics3d/constraints/ParticleConstraint3D.java +0 -0
  280. data/src/{toxi → main/java/toxi}/physics3d/constraints/PlaneConstraint.java +0 -0
  281. data/src/{toxi → main/java/toxi}/physics3d/constraints/SoftBoxConstraint.java +38 -38
  282. data/src/{toxi → main/java/toxi}/physics3d/constraints/SphereConstraint.java +1 -0
  283. data/src/{toxi → main/java/toxi}/processing/ArrowModifier.java +0 -0
  284. data/src/{toxi → main/java/toxi}/processing/DashedLineModifier.java +0 -0
  285. data/src/{toxi → main/java/toxi}/processing/DeltaOrientationMapper.java +0 -0
  286. data/src/{toxi → main/java/toxi}/processing/Line2DRenderModifier.java +0 -0
  287. data/src/{toxi → main/java/toxi}/processing/MeshToVBO.java +0 -0
  288. data/src/{toxi → main/java/toxi}/processing/NormalMapper.java +0 -0
  289. data/src/{toxi → main/java/toxi}/processing/POVInterface.java +0 -0
  290. data/src/{toxi → main/java/toxi}/processing/POVMesh.java +0 -0
  291. data/src/{toxi → main/java/toxi}/processing/POVWriter.java +0 -0
  292. data/src/{toxi → main/java/toxi}/processing/RCOpaque.java +0 -0
  293. data/src/{toxi → main/java/toxi}/processing/RCTransp.java +0 -0
  294. data/src/{toxi → main/java/toxi}/processing/TextureBuilder.java +0 -0
  295. data/src/{toxi → main/java/toxi}/processing/Textures.java +0 -0
  296. data/src/{toxi → main/java/toxi}/processing/ToxiclibsSupport.java +0 -0
  297. data/src/{toxi → main/java/toxi}/processing/Tracing.java +0 -0
  298. data/src/{toxi → main/java/toxi}/processing/XYZNormalMapper.java +0 -0
  299. data/src/{toxi → main/java/toxi}/sim/automata/CAMatrix.java +0 -0
  300. data/src/{toxi → main/java/toxi}/sim/automata/CARule.java +0 -0
  301. data/src/{toxi → main/java/toxi}/sim/automata/CARule2D.java +0 -0
  302. data/src/{toxi → main/java/toxi}/sim/automata/CAWolfram1D.java +0 -0
  303. data/src/{toxi → main/java/toxi}/sim/automata/EvolvableMatrix.java +0 -0
  304. data/src/{toxi → main/java/toxi}/sim/automata/MatrixEvolver.java +0 -0
  305. data/src/{toxi → main/java/toxi}/sim/dla/BottomUpOrder.java +0 -0
  306. data/src/{toxi → main/java/toxi}/sim/dla/DLA.java +0 -0
  307. data/src/{toxi → main/java/toxi}/sim/dla/DLAConfiguration.java +0 -0
  308. data/src/{toxi → main/java/toxi}/sim/dla/DLAEventAdapter.java +0 -0
  309. data/src/{toxi → main/java/toxi}/sim/dla/DLAEventListener.java +0 -0
  310. data/src/{toxi → main/java/toxi}/sim/dla/DLAGuideLines.java +0 -0
  311. data/src/{toxi → main/java/toxi}/sim/dla/DLAParticle.java +0 -0
  312. data/src/{toxi → main/java/toxi}/sim/dla/DLASegment.java +0 -0
  313. data/src/{toxi → main/java/toxi}/sim/dla/PipelineOrder.java +0 -0
  314. data/src/{toxi → main/java/toxi}/sim/dla/RadialDistanceOrder.java +0 -0
  315. data/src/{toxi → main/java/toxi}/sim/erosion/ErosionFunction.java +0 -0
  316. data/src/{toxi → main/java/toxi}/sim/erosion/TalusAngleErosion.java +0 -0
  317. data/src/{toxi → main/java/toxi}/sim/erosion/ThermalErosion.java +0 -0
  318. data/src/{toxi → main/java/toxi}/sim/fluids/FluidSolver2D.java +0 -0
  319. data/src/{toxi → main/java/toxi}/sim/fluids/FluidSolver3D.java +0 -0
  320. data/src/{toxi → main/java/toxi}/sim/grayscott/GrayScott.java +0 -0
  321. data/src/{toxi → main/java/toxi}/util/DateUtils.java +0 -0
  322. data/src/{toxi → main/java/toxi}/util/FileSequenceDescriptor.java +0 -0
  323. data/src/main/java/toxi/util/FileUtils.java +443 -0
  324. data/src/{toxi → main/java/toxi}/util/datatypes/ArraySet.java +0 -0
  325. data/src/{toxi → main/java/toxi}/util/datatypes/ArrayUtil.java +0 -0
  326. data/src/{toxi → main/java/toxi}/util/datatypes/BiasedDoubleRange.java +3 -3
  327. data/src/{toxi → main/java/toxi}/util/datatypes/BiasedFloatRange.java +2 -3
  328. data/src/{toxi → main/java/toxi}/util/datatypes/BiasedIntegerRange.java +3 -3
  329. data/src/{toxi → main/java/toxi}/util/datatypes/DoubleRange.java +3 -3
  330. data/src/{toxi → main/java/toxi}/util/datatypes/FloatRange.java +3 -3
  331. data/src/{toxi → main/java/toxi}/util/datatypes/GenericSet.java +0 -0
  332. data/src/{toxi → main/java/toxi}/util/datatypes/IntegerRange.java +3 -3
  333. data/src/{toxi → main/java/toxi}/util/datatypes/IntegerSet.java +0 -0
  334. data/src/{toxi → main/java/toxi}/util/datatypes/ItemIndex.java +0 -0
  335. data/src/{toxi → main/java/toxi}/util/datatypes/SingletonRegistry.java +0 -0
  336. data/src/{toxi → main/java/toxi}/util/datatypes/TypedProperties.java +0 -0
  337. data/src/{toxi → main/java/toxi}/util/datatypes/UndirectedGraph.java +0 -0
  338. data/src/{toxi → main/java/toxi}/util/datatypes/UniqueItemIndex.java +0 -0
  339. data/src/{toxi → main/java/toxi}/util/datatypes/WeightedRandomEntry.java +0 -0
  340. data/src/{toxi → main/java/toxi}/util/datatypes/WeightedRandomSet.java +0 -0
  341. data/src/{toxi → main/java/toxi}/util/events/EventDispatcher.java +0 -0
  342. data/src/{toxi → main/java/toxi}/volume/AdditiveBrush.java +0 -0
  343. data/src/{toxi → main/java/toxi}/volume/ArrayIsoSurface.java +0 -0
  344. data/src/{toxi → main/java/toxi}/volume/BoxBrush.java +0 -0
  345. data/src/{toxi → main/java/toxi}/volume/BrushMode.java +0 -0
  346. data/src/{toxi → main/java/toxi}/volume/HashIsoSurface.java +0 -0
  347. data/src/{toxi → main/java/toxi}/volume/IsoSurface.java +0 -0
  348. data/src/{toxi → main/java/toxi}/volume/MarchingCubesIndex.java +0 -0
  349. data/src/{toxi → main/java/toxi}/volume/MeshLatticeBuilder.java +0 -0
  350. data/src/{toxi → main/java/toxi}/volume/MeshVoxelizer.java +0 -0
  351. data/src/{toxi → main/java/toxi}/volume/MultiplyBrush.java +0 -0
  352. data/src/{toxi → main/java/toxi}/volume/PeakBrush.java +0 -0
  353. data/src/{toxi → main/java/toxi}/volume/ReplaceBrush.java +0 -0
  354. data/src/{toxi → main/java/toxi}/volume/RoundBrush.java +0 -0
  355. data/src/{toxi → main/java/toxi}/volume/VolumetricBrush.java +0 -0
  356. data/src/{toxi → main/java/toxi}/volume/VolumetricHashMap.java +0 -0
  357. data/src/{toxi → main/java/toxi}/volume/VolumetricSpace.java +0 -0
  358. data/src/{toxi → main/java/toxi}/volume/VolumetricSpaceArray.java +0 -0
  359. data/src/{BooleanShapes.java → test/java/BooleanShapes.java} +0 -0
  360. data/toxiclibs.gemspec +6 -7
  361. metadata +345 -347
  362. data/src/toxi/data/feeds/AtomFeed.java +0 -129
  363. data/src/toxi/data/feeds/RSSFeed.java +0 -99
  364. data/src/toxi/physics2d/VerletParticle2D.java +0 -457
  365. data/src/toxi/physics2d/VerletPhysics2D.java +0 -448
  366. data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +0 -212
  367. data/src/toxi/physics3d/VerletParticle3D.java +0 -385
  368. data/src/toxi/util/FileUtils.java +0 -467
@@ -0,0 +1,440 @@
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
+ package toxi.physics2d;
28
+
29
+ import java.util.ArrayList;
30
+ import java.util.List;
31
+
32
+ import toxi.geom.Rect;
33
+ import toxi.geom.SpatialIndex;
34
+ import toxi.geom.Vec2D;
35
+ import toxi.physics2d.behaviors.GravityBehavior2D;
36
+ import toxi.physics2d.behaviors.ParticleBehavior2D;
37
+ import toxi.physics2d.constraints.ParticleConstraint2D;
38
+
39
+ /**
40
+ * 3D particle physics engine using Verlet integration based on:
41
+ * http://en.wikipedia.org/wiki/Verlet_integration
42
+ * http://www.teknikus.dk/tj/gdc2001.htm
43
+ *
44
+ */
45
+ public class VerletPhysics2D {
46
+
47
+ /**
48
+ *
49
+ * @param c
50
+ * @param list
51
+ */
52
+ public static void addConstraintToAll(ParticleConstraint2D c,
53
+ List<VerletParticle2D> list) {
54
+ list.forEach((p) -> {
55
+ p.addConstraint(c);
56
+ });
57
+ }
58
+
59
+ /**
60
+ *
61
+ * @param c
62
+ * @param list
63
+ */
64
+ public static void removeConstraintFromAll(ParticleConstraint2D c,
65
+ List<VerletParticle2D> list) {
66
+ list.forEach((p) -> {
67
+ p.removeConstraint(c);
68
+ });
69
+ }
70
+
71
+ /**
72
+ * List of particles
73
+ */
74
+ public ArrayList<VerletParticle2D> particles;
75
+
76
+ /**
77
+ * List of spring/stick connectors
78
+ */
79
+ public ArrayList<VerletSpring2D> springs;
80
+
81
+ /**
82
+ * Default time step = 1.0
83
+ */
84
+ protected float timeStep;
85
+
86
+ /**
87
+ * Default iterations for verlet solver = 50
88
+ */
89
+ protected int numIterations;
90
+
91
+ /**
92
+ * Optional bounding rect to constrain particles too
93
+ */
94
+ protected Rect worldBounds;
95
+
96
+ /**
97
+ *
98
+ */
99
+ public final List<ParticleBehavior2D> behaviors = new ArrayList<>(
100
+ 1);
101
+
102
+ /**
103
+ *
104
+ */
105
+ public final List<ParticleConstraint2D> constraints = new ArrayList<>(
106
+ 1);
107
+
108
+ /**
109
+ *
110
+ */
111
+ protected float drag;
112
+
113
+ /**
114
+ *
115
+ */
116
+ protected SpatialIndex<Vec2D> index;
117
+
118
+ /**
119
+ * Initializes a Verlet engine instance using the default values.
120
+ */
121
+ public VerletPhysics2D() {
122
+ this(null, 50, 0, 1);
123
+ }
124
+
125
+ /**
126
+ * Initializes an Verlet engine instance with the passed in configuration.
127
+ *
128
+ * @param gravity 3D gravity vector
129
+ * @param numIterations iterations per time step for verlet solver
130
+ * @param drag drag value 0...1
131
+ * @param timeStep time step for calculating forces
132
+ */
133
+ public VerletPhysics2D(Vec2D gravity, int numIterations, float drag,
134
+ float timeStep) {
135
+ particles = new ArrayList<>();
136
+ springs = new ArrayList<>();
137
+ this.numIterations = numIterations;
138
+ this.timeStep = timeStep;
139
+ setDrag(drag);
140
+ if (gravity != null) {
141
+ addBehavior(new GravityBehavior2D(gravity));
142
+ }
143
+ }
144
+
145
+ /**
146
+ *
147
+ * @param behavior
148
+ */
149
+ public final void addBehavior(ParticleBehavior2D behavior) {
150
+ behavior.configure(timeStep);
151
+ behaviors.add(behavior);
152
+ }
153
+
154
+ /**
155
+ *
156
+ * @param constraint
157
+ */
158
+ public void addConstraint(ParticleConstraint2D constraint) {
159
+ constraints.add(constraint);
160
+ }
161
+
162
+ /**
163
+ * Adds a particle to the list
164
+ *
165
+ * @param p
166
+ * @return itself
167
+ */
168
+ public VerletPhysics2D addParticle(VerletParticle2D p) {
169
+ particles.add(p);
170
+ return this;
171
+ }
172
+
173
+ /**
174
+ * Adds a spring connector
175
+ *
176
+ * @param s
177
+ * @return itself
178
+ */
179
+ public VerletPhysics2D addSpring(VerletSpring2D s) {
180
+ if (getSpring(s.a, s.b) == null) {
181
+ springs.add(s);
182
+ }
183
+ return this;
184
+ }
185
+
186
+ /**
187
+ * Applies all global constraints and constrains all particle positions to the
188
+ * world bounding rect set.
189
+ */
190
+ protected void applyConstaints() {
191
+ boolean hasGlobalConstraints = constraints.size() > 0;
192
+ particles.stream().map((p) -> {
193
+ if (hasGlobalConstraints) {
194
+ constraints.forEach((c) -> {
195
+ c.apply(p);
196
+ });
197
+ }
198
+ return p;
199
+ }).map((p) -> {
200
+ if (p.bounds != null) {
201
+ p.constrain(p.bounds);
202
+ }
203
+ return p;
204
+ }).filter((p) -> (worldBounds != null)).forEachOrdered((p) -> {
205
+ p.constrain(worldBounds);
206
+ });
207
+ }
208
+
209
+ /**
210
+ *
211
+ * @return
212
+ */
213
+ public VerletPhysics2D clear() {
214
+ behaviors.clear();
215
+ constraints.clear();
216
+ particles.clear();
217
+ springs.clear();
218
+ return this;
219
+ }
220
+
221
+ /**
222
+ *
223
+ * @return
224
+ */
225
+ public Rect getCurrentBounds() {
226
+ Vec2D min = new Vec2D(Float.MAX_VALUE, Float.MAX_VALUE);
227
+ Vec2D max = new Vec2D(Float.MIN_VALUE, Float.MIN_VALUE);
228
+ particles.stream().map((p) -> {
229
+ min.minSelf(p);
230
+ return p;
231
+ }).forEachOrdered((p) -> {
232
+ max.maxSelf(p);
233
+ });
234
+ return new Rect(min, max);
235
+ }
236
+
237
+ /**
238
+ *
239
+ * @return
240
+ */
241
+ public float getDrag() {
242
+ return 1f - drag;
243
+ }
244
+
245
+ /**
246
+ * @return the index
247
+ */
248
+ public SpatialIndex<Vec2D> getIndex() {
249
+ return index;
250
+ }
251
+
252
+ /**
253
+ * @return the numIterations
254
+ */
255
+ public int getNumIterations() {
256
+ return numIterations;
257
+ }
258
+
259
+ /**
260
+ * Attempts to find the spring element between the 2 particles supplied
261
+ *
262
+ * @param a particle 1
263
+ * @param b particle 2
264
+ * @return spring instance, or null if not found
265
+ */
266
+ public VerletSpring2D getSpring(Vec2D a, Vec2D b) {
267
+ for (VerletSpring2D s : springs) {
268
+ if ((s.a == a && s.b == b) || (s.a == b && s.b == a)) {
269
+ return s;
270
+ }
271
+ }
272
+ return null;
273
+ }
274
+
275
+ /**
276
+ * @return the timeStep
277
+ */
278
+ public float getTimeStep() {
279
+ return timeStep;
280
+ }
281
+
282
+ /**
283
+ * @return the worldBounds
284
+ */
285
+ public Rect getWorldBounds() {
286
+ return worldBounds;
287
+ }
288
+
289
+ /**
290
+ *
291
+ * @param c
292
+ * @return
293
+ */
294
+ public boolean removeBehavior(ParticleBehavior2D c) {
295
+ return behaviors.remove(c);
296
+ }
297
+
298
+ /**
299
+ *
300
+ * @param c
301
+ * @return
302
+ */
303
+ public boolean removeConstraint(ParticleConstraint2D c) {
304
+ return constraints.remove(c);
305
+ }
306
+
307
+ /**
308
+ * Removes a particle from the simulation.
309
+ *
310
+ * @param p particle to remove
311
+ * @return true, if removed successfully
312
+ */
313
+ public boolean removeParticle(VerletParticle2D p) {
314
+ return particles.remove(p);
315
+ }
316
+
317
+ /**
318
+ * Removes a spring connector from the simulation instance.
319
+ *
320
+ * @param s spring to remove
321
+ * @return true, if the spring has been removed
322
+ */
323
+ public boolean removeSpring(VerletSpring2D s) {
324
+ return springs.remove(s);
325
+ }
326
+
327
+ /**
328
+ * Removes a spring connector and its both end point particles from the
329
+ * simulation
330
+ *
331
+ * @param s spring to remove
332
+ * @return true, only if spring AND particles have been removed successfully
333
+ */
334
+ public boolean removeSpringElements(VerletSpring2D s) {
335
+ if (removeSpring(s)) {
336
+ return (removeParticle(s.a) && removeParticle(s.b));
337
+ }
338
+ return false;
339
+ }
340
+
341
+ /**
342
+ *
343
+ * @param drag
344
+ */
345
+ public final void setDrag(float drag) {
346
+ this.drag = 1f - drag;
347
+ }
348
+
349
+ /**
350
+ * @param index the index to set
351
+ */
352
+ public void setIndex(SpatialIndex<Vec2D> index) {
353
+ this.index = index;
354
+ }
355
+
356
+ /**
357
+ * @param numIterations the numIterations to set
358
+ */
359
+ public void setNumIterations(int numIterations) {
360
+ this.numIterations = numIterations;
361
+ }
362
+
363
+ /**
364
+ * @param timeStep the timeStep to set
365
+ */
366
+ public void setTimeStep(float timeStep) {
367
+ this.timeStep = timeStep;
368
+ behaviors.forEach((b) -> {
369
+ b.configure(timeStep);
370
+ });
371
+ }
372
+
373
+ /**
374
+ * Sets bounding box
375
+ *
376
+ * @param world
377
+ * @return itself
378
+ */
379
+ public VerletPhysics2D setWorldBounds(Rect world) {
380
+ worldBounds = world;
381
+ return this;
382
+ }
383
+
384
+ /**
385
+ * Progresses the physics simulation by 1 time step and updates all forces and
386
+ * particle positions accordingly
387
+ *
388
+ * @return itself
389
+ */
390
+ public VerletPhysics2D update() {
391
+ updateParticles();
392
+ updateSprings();
393
+ applyConstaints();
394
+ updateIndex();
395
+ return this;
396
+ }
397
+
398
+ private void updateIndex() {
399
+ if (index != null) {
400
+ index.clear();
401
+ particles.forEach((p) -> {
402
+ index.index(p);
403
+ });
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Updates all particle positions
409
+ */
410
+ protected void updateParticles() {
411
+ behaviors.forEach((b) -> {
412
+ if (index != null && b.supportsSpatialIndex()) {
413
+ b.applyWithIndex(index);
414
+ } else {
415
+ particles.forEach((p) -> {
416
+ b.apply(p);
417
+ });
418
+ }
419
+ });
420
+ particles.stream().map((p) -> {
421
+ p.scaleVelocity(drag);
422
+ return p;
423
+ }).forEachOrdered((p) -> {
424
+ p.update();
425
+ });
426
+ }
427
+
428
+ /**
429
+ * Updates all spring connections based on new particle positions
430
+ */
431
+ protected void updateSprings() {
432
+ if (springs.size() > 0) {
433
+ for (int i = numIterations; i > 0; i--) {
434
+ for (VerletSpring2D s : springs) {
435
+ s.update(i == 1);
436
+ }
437
+ }
438
+ }
439
+ }
440
+ }
@@ -0,0 +1,211 @@
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
+ package toxi.physics2d.behaviors;
28
+
29
+ import java.util.List;
30
+
31
+ import toxi.geom.SpatialIndex;
32
+ import toxi.geom.Vec2D;
33
+ import toxi.physics2d.VerletParticle2D;
34
+
35
+ /**
36
+ *
37
+ * @author tux
38
+ */
39
+ public class AttractionBehavior2D implements ParticleBehavior2D {
40
+
41
+ /**
42
+ *
43
+ */
44
+ protected Vec2D attractor;
45
+
46
+ /**
47
+ *
48
+ */
49
+ protected float attrStrength;
50
+
51
+ protected float radius,
52
+ /**
53
+ *
54
+ */
55
+ /**
56
+ *
57
+ */
58
+ radiusSquared;
59
+
60
+ /**
61
+ *
62
+ */
63
+ protected float strength;
64
+
65
+ /**
66
+ *
67
+ */
68
+ protected float jitter;
69
+
70
+ /**
71
+ *
72
+ */
73
+ protected float timeStep;
74
+
75
+ /**
76
+ *
77
+ * @param attractor
78
+ * @param radius
79
+ * @param strength
80
+ */
81
+ public AttractionBehavior2D(Vec2D attractor, float radius, float strength) {
82
+ this(attractor, radius, strength, 0);
83
+ }
84
+
85
+ /**
86
+ *
87
+ * @param attractor
88
+ * @param radius
89
+ * @param strength
90
+ * @param jitter
91
+ */
92
+ public AttractionBehavior2D(Vec2D attractor, float radius, float strength,
93
+ float jitter) {
94
+ this.attractor = attractor;
95
+ this.strength = strength;
96
+ this.jitter = jitter;
97
+ setRadius(radius);
98
+ }
99
+
100
+ @Override
101
+ public void apply(VerletParticle2D p) {
102
+ Vec2D delta = attractor.sub(p);
103
+ float dist = delta.magSquared();
104
+ if (dist < radiusSquared) {
105
+ Vec2D f = delta.normalizeTo((1.0f - dist / radiusSquared))
106
+ .jitter(jitter).scaleSelf(attrStrength);
107
+ p.addForce(f);
108
+ }
109
+ }
110
+
111
+ /**
112
+ *
113
+ * @param spaceHash
114
+ */
115
+ @Override
116
+ public void applyWithIndex(SpatialIndex<Vec2D> spaceHash) {
117
+ List<Vec2D> selection = spaceHash.itemsWithinRadius(attractor, radius,
118
+ null);
119
+ final Vec2D temp = new Vec2D();
120
+ if (selection != null) {
121
+ selection.stream().map((p) -> {
122
+ temp.set(p);
123
+ return p;
124
+ }).map((p) -> {
125
+ apply((VerletParticle2D) p);
126
+ return p;
127
+ }).forEachOrdered((p) -> {
128
+ spaceHash.reindex(temp, p);
129
+ });
130
+ }
131
+ }
132
+
133
+ /**
134
+ *
135
+ * @param timeStep
136
+ */
137
+ @Override
138
+ public void configure(float timeStep) {
139
+ this.timeStep = timeStep;
140
+ setStrength(strength);
141
+ }
142
+
143
+ /**
144
+ * @return the attractor
145
+ */
146
+ public Vec2D getAttractor() {
147
+ return attractor;
148
+ }
149
+
150
+ /**
151
+ * @return the jitter
152
+ */
153
+ public float getJitter() {
154
+ return jitter;
155
+ }
156
+
157
+ /**
158
+ * @return the radius
159
+ */
160
+ public float getRadius() {
161
+ return radius;
162
+ }
163
+
164
+ /**
165
+ * @return the strength
166
+ */
167
+ public float getStrength() {
168
+ return strength;
169
+ }
170
+
171
+ /**
172
+ * @param attractor the attractor to set
173
+ */
174
+ public void setAttractor(Vec2D attractor) {
175
+ this.attractor = attractor;
176
+ }
177
+
178
+ /**
179
+ * @param jitter the jitter to set
180
+ */
181
+ public void setJitter(float jitter) {
182
+ this.jitter = jitter;
183
+ }
184
+
185
+ /**
186
+ *
187
+ * @param r
188
+ */
189
+ public final void setRadius(float r) {
190
+ this.radius = r;
191
+ this.radiusSquared = r * r;
192
+ }
193
+
194
+ /**
195
+ * @param strength the strength to set
196
+ */
197
+ public void setStrength(float strength) {
198
+ this.strength = strength;
199
+ this.attrStrength = strength * timeStep;
200
+ }
201
+
202
+ /**
203
+ *
204
+ * @return
205
+ */
206
+ @Override
207
+ public boolean supportsSpatialIndex() {
208
+ return true;
209
+ }
210
+
211
+ }