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,101 @@
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.data.feeds.util;
29
+
30
+ import java.text.ParseException;
31
+ import java.text.SimpleDateFormat;
32
+ import java.util.Date;
33
+ import java.util.GregorianCalendar;
34
+
35
+ import javax.xml.bind.annotation.adapters.XmlAdapter;
36
+ import javax.xml.datatype.DatatypeFactory;
37
+ import javax.xml.datatype.XMLGregorianCalendar;
38
+
39
+ import com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl;
40
+
41
+ /**
42
+ *
43
+ * @author tux
44
+ */
45
+ public class Iso8601DateAdapter extends
46
+ XmlAdapter<String, XMLGregorianCalendar> {
47
+
48
+ /**
49
+ *
50
+ */
51
+ public static final SimpleDateFormat[] ISO8601_FORMATS = new SimpleDateFormat[] {
52
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"),
53
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") };
54
+
55
+ /**
56
+ *
57
+ * @param date
58
+ * @return
59
+ * @throws Exception
60
+ */
61
+ @Override
62
+ public String marshal(XMLGregorianCalendar date) throws Exception {
63
+ return ISO8601_FORMATS[0].format(date);
64
+ }
65
+
66
+ /**
67
+ *
68
+ * @param dateString
69
+ * @return
70
+ * @throws Exception
71
+ */
72
+ @Override
73
+ public XMLGregorianCalendar unmarshal(String dateString) throws Exception {
74
+ XMLGregorianCalendar calendar = null;
75
+ GregorianCalendar cal = new GregorianCalendar();
76
+ DatatypeFactory dataType = DatatypeFactoryImpl.newInstance();
77
+ for (SimpleDateFormat f : ISO8601_FORMATS) {
78
+ try {
79
+ Date d = f.parse(dateString);
80
+ cal.setTime(d);
81
+ calendar = dataType.newXMLGregorianCalendar(cal);
82
+ break;
83
+ } catch (ParseException e) {
84
+ }
85
+ }
86
+ if (calendar == null) {
87
+ String timeZone = dateString.substring(dateString.length() - 6);
88
+ dateString = dateString.substring(0, dateString.length() - 6);
89
+ try {
90
+ Date d = ISO8601_FORMATS[0]
91
+ .parse(dateString + "GMT" + timeZone);
92
+ cal.setTime(d);
93
+ calendar = dataType.newXMLGregorianCalendar(cal);
94
+ } catch (ParseException e) {
95
+ cal.setTimeInMillis(0);
96
+ calendar = dataType.newXMLGregorianCalendar(cal);
97
+ }
98
+ }
99
+ return calendar;
100
+ }
101
+ }
@@ -0,0 +1,93 @@
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.data.feeds.util;
29
+
30
+ import java.text.ParseException;
31
+ import java.text.SimpleDateFormat;
32
+ import java.util.Date;
33
+ import java.util.GregorianCalendar;
34
+
35
+ import javax.xml.bind.annotation.adapters.XmlAdapter;
36
+ import javax.xml.datatype.DatatypeFactory;
37
+ import javax.xml.datatype.XMLGregorianCalendar;
38
+
39
+ import com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl;
40
+
41
+ /**
42
+ *
43
+ * @author tux
44
+ */
45
+ public class Rfc822DateAdapter extends XmlAdapter<String, XMLGregorianCalendar> {
46
+
47
+ /**
48
+ *
49
+ */
50
+ public static final SimpleDateFormat[] RFC822_FORMATS = new SimpleDateFormat[] {
51
+ new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z"),
52
+ new SimpleDateFormat("EEE, d MMM yy HH:mm z"),
53
+ new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z"),
54
+ new SimpleDateFormat("EEE, d MMM yyyy HH:mm z"),
55
+ new SimpleDateFormat("d MMM yy HH:mm z"),
56
+ new SimpleDateFormat("d MMM yy HH:mm:ss z"),
57
+ new SimpleDateFormat("d MMM yyyy HH:mm z"),
58
+ new SimpleDateFormat("d MMM yyyy HH:mm:ss z"), };
59
+
60
+ /**
61
+ *
62
+ * @param date
63
+ * @return
64
+ * @throws Exception
65
+ */
66
+ @Override
67
+ public String marshal(XMLGregorianCalendar date) throws Exception {
68
+ return RFC822_FORMATS[0].format(date);
69
+ }
70
+
71
+ /**
72
+ *
73
+ * @param dateString
74
+ * @return
75
+ * @throws Exception
76
+ */
77
+ @Override
78
+ public XMLGregorianCalendar unmarshal(String dateString) throws Exception {
79
+ XMLGregorianCalendar calendar = null;
80
+ GregorianCalendar cal = new GregorianCalendar();
81
+ for (SimpleDateFormat f : RFC822_FORMATS) {
82
+ try {
83
+ Date d = f.parse(dateString);
84
+ cal.setTime(d);
85
+ DatatypeFactory dataType = DatatypeFactoryImpl.newInstance();
86
+ calendar = dataType.newXMLGregorianCalendar(cal);
87
+ break;
88
+ } catch (ParseException e) {
89
+ }
90
+ }
91
+ return calendar;
92
+ }
93
+ }
@@ -0,0 +1,658 @@
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.List;
31
+
32
+ import javax.xml.bind.annotation.XmlAccessType;
33
+ import javax.xml.bind.annotation.XmlAccessorType;
34
+ import javax.xml.bind.annotation.XmlElement;
35
+ import javax.xml.bind.annotation.XmlTransient;
36
+
37
+ import toxi.geom.mesh.Mesh3D;
38
+ import toxi.geom.mesh.TriangleMesh;
39
+ import toxi.math.MathUtils;
40
+
41
+ /**
42
+ * Axis-aligned bounding box with basic intersection features for Ray, AABB and
43
+ * Sphere classes.
44
+ */
45
+ @XmlAccessorType(XmlAccessType.FIELD)
46
+ public class AABB extends Vec3D implements Shape3D {
47
+
48
+ /**
49
+ * Creates a new instance from two vectors specifying opposite corners of
50
+ * the box
51
+ *
52
+ * @param min
53
+ * first corner point
54
+ * @param max
55
+ * second corner point
56
+ * @return new AABB with centre at the half point between the 2 input
57
+ * vectors
58
+ */
59
+ public static final AABB fromMinMax(Vec3D min, Vec3D max) {
60
+ Vec3D a = Vec3D.min(min, max);
61
+ Vec3D b = Vec3D.max(min, max);
62
+ return new AABB(a.interpolateTo(b, 0.5f), b.sub(a).scaleSelf(0.5f));
63
+ }
64
+
65
+ /**
66
+ * Factory method, computes & returns the bounding box for the given list of
67
+ * points.
68
+ *
69
+ * @param points
70
+ * @return bounding rect
71
+ */
72
+ public static final AABB getBoundingBox(List<? extends Vec3D> points) {
73
+ if (points == null || points.isEmpty()) {
74
+ return null;
75
+ }
76
+ Vec3D first = points.get(0);
77
+ Vec3D min = first.copy();
78
+ Vec3D max = first.copy();
79
+ for (Vec3D p : points) {
80
+ min.minSelf(p);
81
+ max.maxSelf(p);
82
+ }
83
+ return fromMinMax(min, max);
84
+ }
85
+
86
+ /**
87
+ *
88
+ */
89
+ @XmlElement(required = true)
90
+ protected Vec3D extent;
91
+
92
+ @XmlTransient
93
+ protected Vec3D min,
94
+
95
+ /**
96
+ *
97
+ */
98
+
99
+ /**
100
+ *
101
+ */
102
+ max;
103
+
104
+ /**
105
+ *
106
+ */
107
+ public AABB() {
108
+ super();
109
+ setExtent(new Vec3D());
110
+ }
111
+
112
+ /**
113
+ * Creates an independent copy of the passed in box
114
+ *
115
+ * @param box
116
+ */
117
+ public AABB(AABB box) {
118
+ this(box, box.getExtent());
119
+ }
120
+
121
+ /**
122
+ * Creates a new box of the given size at the world origin.
123
+ *
124
+ * @param extent
125
+ */
126
+ public AABB(float extent) {
127
+ this(new Vec3D(), extent);
128
+ }
129
+
130
+ /**
131
+ * Creates a new instance from centre point and uniform extent in all
132
+ * directions.
133
+ *
134
+ * @param pos
135
+ * @param extent
136
+ */
137
+ public AABB(ReadonlyVec3D pos, float extent) {
138
+ super(pos);
139
+ setExtent(new Vec3D(extent, extent, extent));
140
+ }
141
+
142
+ /**
143
+ * Creates a new instance from centre point and extent
144
+ *
145
+ * @param pos
146
+ * @param extent
147
+ * box dimensions (the box will be double the size in each
148
+ * direction)
149
+ */
150
+ public AABB(ReadonlyVec3D pos, ReadonlyVec3D extent) {
151
+ super(pos);
152
+ setExtent(extent);
153
+ }
154
+
155
+ @Override
156
+ public boolean containsPoint(ReadonlyVec3D p) {
157
+ return p.isInAABB(this);
158
+ }
159
+
160
+ @Override
161
+ public AABB copy() {
162
+ return new AABB(this);
163
+ }
164
+
165
+ /**
166
+ *
167
+ * @return
168
+ */
169
+ public Sphere getBoundingSphere() {
170
+ return new Sphere(this, extent.magnitude());
171
+ }
172
+
173
+ /**
174
+ * Returns the current box size as new Vec3D instance (updating this vector
175
+ * will NOT update the box size! Use {@link #setExtent(ReadonlyVec3D)} for
176
+ * those purposes)
177
+ *
178
+ * @return box size
179
+ */
180
+ public final Vec3D getExtent() {
181
+ return extent.copy();
182
+ }
183
+
184
+ /**
185
+ *
186
+ * @return
187
+ */
188
+ public final Vec3D getMax() {
189
+ // return this.add(extent);
190
+ return max.copy();
191
+ }
192
+
193
+ /**
194
+ *
195
+ * @return
196
+ */
197
+ public final Vec3D getMin() {
198
+ return min.copy();
199
+ }
200
+
201
+ /**
202
+ *
203
+ * @param p
204
+ * @return
205
+ */
206
+ public Vec3D getNormalForPoint(ReadonlyVec3D p) {
207
+ p = p.sub(this);
208
+ Vec3D pabs = extent.sub(p.getAbs());
209
+ Vec3D psign = p.getSignum();
210
+ Vec3D normal = Vec3D.X_AXIS.scale(psign.x);
211
+ float minDist = pabs.x;
212
+ if (pabs.y < minDist) {
213
+ minDist = pabs.y;
214
+ normal = Vec3D.Y_AXIS.scale(psign.y);
215
+ }
216
+ if (pabs.z < minDist) {
217
+ normal = Vec3D.Z_AXIS.scale(psign.z);
218
+ }
219
+ return normal;
220
+ }
221
+
222
+ /**
223
+ * Adjusts the box size and position such that it includes the given point.
224
+ *
225
+ * @param p
226
+ * point to include
227
+ * @return itself
228
+ */
229
+ public AABB growToContainPoint(ReadonlyVec3D p) {
230
+ min.minSelf(p);
231
+ max.maxSelf(p);
232
+ set(min.interpolateTo(max, 0.5f));
233
+ extent.set(max.sub(min).scaleSelf(0.5f));
234
+ return this;
235
+ }
236
+
237
+ /**
238
+ * Checks if the box intersects the passed in one.
239
+ *
240
+ * @param box
241
+ * box to check
242
+ * @return true, if boxes overlap
243
+ */
244
+ public boolean intersectsBox(AABB box) {
245
+ Vec3D t = box.sub(this);
246
+ return MathUtils.abs(t.x) <= (extent.x + box.extent.x)
247
+ && MathUtils.abs(t.y) <= (extent.y + box.extent.y)
248
+ && MathUtils.abs(t.z) <= (extent.z + box.extent.z);
249
+ }
250
+
251
+ /**
252
+ * Calculates intersection with the given ray between a certain distance
253
+ * interval.
254
+ *
255
+ * Ray-box intersection is using IEEE numerical properties to ensure the
256
+ * test is both robust and efficient, as described in:
257
+ *
258
+ * Amy Williams, Steve Barrus, R. Keith Morley, and Peter Shirley: "An
259
+ * Efficient and Robust Ray-Box Intersection Algorithm" Journal of graphics
260
+ * tools, 10(1):49-54, 2005
261
+ *
262
+ * @param ray
263
+ * incident ray
264
+ * @param minDist
265
+ * @param maxDist
266
+ * @return intersection point on the bounding box (only the first is
267
+ * returned) or null if no intersection
268
+ */
269
+ public Vec3D intersectsRay(Ray3D ray, float minDist, float maxDist) {
270
+ Vec3D invDir = ray.getDirection().reciprocal();
271
+ boolean signDirX = invDir.x < 0;
272
+ boolean signDirY = invDir.y < 0;
273
+ boolean signDirZ = invDir.z < 0;
274
+ Vec3D bbox = signDirX ? max : min;
275
+ float tmin = (bbox.x - ray.x) * invDir.x;
276
+ bbox = signDirX ? min : max;
277
+ float tmax = (bbox.x - ray.x) * invDir.x;
278
+ bbox = signDirY ? max : min;
279
+ float tymin = (bbox.y - ray.y) * invDir.y;
280
+ bbox = signDirY ? min : max;
281
+ float tymax = (bbox.y - ray.y) * invDir.y;
282
+ if ((tmin > tymax) || (tymin > tmax)) {
283
+ return null;
284
+ }
285
+ if (tymin > tmin) {
286
+ tmin = tymin;
287
+ }
288
+ if (tymax < tmax) {
289
+ tmax = tymax;
290
+ }
291
+ bbox = signDirZ ? max : min;
292
+ float tzmin = (bbox.z - ray.z) * invDir.z;
293
+ bbox = signDirZ ? min : max;
294
+ float tzmax = (bbox.z - ray.z) * invDir.z;
295
+ if ((tmin > tzmax) || (tzmin > tmax)) {
296
+ return null;
297
+ }
298
+ if (tzmin > tmin) {
299
+ tmin = tzmin;
300
+ }
301
+ if (tzmax < tmax) {
302
+ tmax = tzmax;
303
+ }
304
+ if ((tmin < maxDist) && (tmax > minDist)) {
305
+ return ray.getPointAtDistance(tmin);
306
+ }
307
+ return null;
308
+ }
309
+
310
+ /**
311
+ *
312
+ * @param s
313
+ * @return
314
+ */
315
+ public boolean intersectsSphere(Sphere s) {
316
+ return intersectsSphere(s, s.radius);
317
+ }
318
+
319
+ /**
320
+ * @param c
321
+ * sphere centre
322
+ * @param r
323
+ * sphere radius
324
+ * @return true, if AABB intersects with sphere
325
+ */
326
+ public boolean intersectsSphere(Vec3D c, float r) {
327
+ float s, d = 0;
328
+ // find the square of the distance
329
+ // from the sphere to the box
330
+ if (c.x < min.x) {
331
+ s = c.x - min.x;
332
+ d = s * s;
333
+ } else if (c.x > max.x) {
334
+ s = c.x - max.x;
335
+ d += s * s;
336
+ }
337
+
338
+ if (c.y < min.y) {
339
+ s = c.y - min.y;
340
+ d += s * s;
341
+ } else if (c.y > max.y) {
342
+ s = c.y - max.y;
343
+ d += s * s;
344
+ }
345
+
346
+ if (c.z < min.z) {
347
+ s = c.z - min.z;
348
+ d += s * s;
349
+ } else if (c.z > max.z) {
350
+ s = c.z - max.z;
351
+ d += s * s;
352
+ }
353
+
354
+ return d <= r * r;
355
+ }
356
+
357
+ /**
358
+ *
359
+ * @param tri
360
+ * @return
361
+ */
362
+ public boolean intersectsTriangle(Triangle3D tri) {
363
+ // use separating axis theorem to test overlap between triangle and box
364
+ // need to test for overlap in these directions:
365
+ //
366
+ // 1) the {x,y,z}-directions (actually, since we use the AABB of the
367
+ // triangle
368
+ // we do not even need to test these)
369
+ // 2) normal of the triangle
370
+ // 3) crossproduct(edge from tri, {x,y,z}-directin)
371
+ // this gives 3x3=9 more tests
372
+ Vec3D v0, v1, v2;
373
+ Vec3D normal, e0, e1, e2, f;
374
+
375
+ // move everything so that the boxcenter is in (0,0,0)
376
+ v0 = tri.a.sub(this);
377
+ v1 = tri.b.sub(this);
378
+ v2 = tri.c.sub(this);
379
+
380
+ // compute triangle edges
381
+ e0 = v1.sub(v0);
382
+ e1 = v2.sub(v1);
383
+ e2 = v0.sub(v2);
384
+
385
+ // test the 9 tests first (this was faster)
386
+ f = e0.getAbs();
387
+ if (testAxis(e0.z, -e0.y, f.z, f.y, v0.y, v0.z, v2.y, v2.z, extent.y,
388
+ extent.z)) {
389
+ return false;
390
+ }
391
+ if (testAxis(-e0.z, e0.x, f.z, f.x, v0.x, v0.z, v2.x, v2.z, extent.x,
392
+ extent.z)) {
393
+ return false;
394
+ }
395
+ if (testAxis(e0.y, -e0.x, f.y, f.x, v1.x, v1.y, v2.x, v2.y, extent.x,
396
+ extent.y)) {
397
+ return false;
398
+ }
399
+
400
+ f = e1.getAbs();
401
+ if (testAxis(e1.z, -e1.y, f.z, f.y, v0.y, v0.z, v2.y, v2.z, extent.y,
402
+ extent.z)) {
403
+ return false;
404
+ }
405
+ if (testAxis(-e1.z, e1.x, f.z, f.x, v0.x, v0.z, v2.x, v2.z, extent.x,
406
+ extent.z)) {
407
+ return false;
408
+ }
409
+ if (testAxis(e1.y, -e1.x, f.y, f.x, v0.x, v0.y, v1.x, v1.y, extent.x,
410
+ extent.y)) {
411
+ return false;
412
+ }
413
+
414
+ f = e2.getAbs();
415
+ if (testAxis(e2.z, -e2.y, f.z, f.y, v0.y, v0.z, v1.y, v1.z, extent.y,
416
+ extent.z)) {
417
+ return false;
418
+ }
419
+ if (testAxis(-e2.z, e2.x, f.z, f.x, v0.x, v0.z, v1.x, v1.z, extent.x,
420
+ extent.z)) {
421
+ return false;
422
+ }
423
+ if (testAxis(e2.y, -e2.x, f.y, f.x, v1.x, v1.y, v2.x, v2.y, extent.x,
424
+ extent.y)) {
425
+ return false;
426
+ }
427
+
428
+ // first test overlap in the {x,y,z}-directions
429
+ // find min, max of the triangle each direction, and test for overlap in
430
+ // that direction -- this is equivalent to testing a minimal AABB around
431
+ // the triangle against the AABB
432
+
433
+ // test in X-direction
434
+ if (MathUtils.min(v0.x, v1.x, v2.x) > extent.x
435
+ || MathUtils.max(v0.x, v1.x, v2.x) < -extent.x) {
436
+ return false;
437
+ }
438
+
439
+ // test in Y-direction
440
+ if (MathUtils.min(v0.y, v1.y, v2.y) > extent.y
441
+ || MathUtils.max(v0.y, v1.y, v2.y) < -extent.y) {
442
+ return false;
443
+ }
444
+
445
+ // test in Z-direction
446
+ if (MathUtils.min(v0.z, v1.z, v2.z) > extent.z
447
+ || MathUtils.max(v0.z, v1.z, v2.z) < -extent.z) {
448
+ return false;
449
+ }
450
+
451
+ // test if the box intersects the plane of the triangle
452
+ // compute plane equation of triangle: normal*x+d=0
453
+ normal = e0.cross(e1);
454
+ float d = -normal.dot(v0);
455
+ return planeBoxOverlap(normal, d, extent);
456
+ }
457
+
458
+ private boolean planeBoxOverlap(Vec3D normal, float d, Vec3D maxbox) {
459
+ Vec3D vmin = new Vec3D();
460
+ Vec3D vmax = new Vec3D();
461
+
462
+ if (normal.x > 0.0f) {
463
+ vmin.x = -maxbox.x;
464
+ vmax.x = maxbox.x;
465
+ } else {
466
+ vmin.x = maxbox.x;
467
+ vmax.x = -maxbox.x;
468
+ }
469
+
470
+ if (normal.y > 0.0f) {
471
+ vmin.y = -maxbox.y;
472
+ vmax.y = maxbox.y;
473
+ } else {
474
+ vmin.y = maxbox.y;
475
+ vmax.y = -maxbox.y;
476
+ }
477
+
478
+ if (normal.z > 0.0f) {
479
+ vmin.z = -maxbox.z;
480
+ vmax.z = maxbox.z;
481
+ } else {
482
+ vmin.z = maxbox.z;
483
+ vmax.z = -maxbox.z;
484
+ }
485
+ if (normal.dot(vmin) + d > 0.0f) {
486
+ return false;
487
+ }
488
+ return (normal.dot(vmax) + d >= 0.0f); // returns true or false
489
+ }
490
+
491
+ /**
492
+ *
493
+ * @param box
494
+ * @return
495
+ */
496
+ public AABB set(AABB box) {
497
+ extent.set(box.extent);
498
+ return set((ReadonlyVec3D) box);
499
+ }
500
+
501
+ /**
502
+ * Updates the position of the box in space and calls
503
+ * {@link #updateBounds()} immediately
504
+ *
505
+ * @return
506
+ * @see toxi.geom.Vec3D#set(float, float, float)
507
+ */
508
+ @Override
509
+ public Vec3D set(float x, float y, float z) {
510
+ this.x = x;
511
+ this.y = y;
512
+ this.z = z;
513
+ updateBounds();
514
+ return this;
515
+ }
516
+
517
+ /**
518
+ * Updates the position of the box in space and calls
519
+ * {@link #updateBounds()} immediately
520
+ *
521
+ * @param v
522
+ * @return
523
+ * @see toxi.geom.Vec3D#set(toxi.geom.Vec3D)
524
+ */
525
+ @Override
526
+ public AABB set(ReadonlyVec3D v) {
527
+ x = v.x();
528
+ y = v.y();
529
+ z = v.z();
530
+ updateBounds();
531
+ return this;
532
+ }
533
+
534
+ /**
535
+ * Updates the size of the box and calls {@link #updateBounds()} immediately
536
+ *
537
+ * @param extent
538
+ * new box size
539
+ * @return itself, for method chaining
540
+ */
541
+ public final AABB setExtent(ReadonlyVec3D extent) {
542
+ this.extent = extent.copy();
543
+ return updateBounds();
544
+ }
545
+
546
+ private boolean testAxis(float a, float b, float fa, float fb, float va,
547
+ float vb, float wa, float wb, float ea, float eb) {
548
+ float p0 = a * va + b * vb;
549
+ float p2 = a * wa + b * wb;
550
+ float amin, amax;
551
+ if (p0 < p2) {
552
+ amin = p0;
553
+ amax = p2;
554
+ } else {
555
+ amin = p2;
556
+ amax = p0;
557
+ }
558
+ float rad = fa * ea + fb * eb;
559
+ return (amin > rad || amax < -rad);
560
+ }
561
+
562
+ /**
563
+ *
564
+ * @return
565
+ */
566
+ public Mesh3D toMesh() {
567
+ return toMesh(null);
568
+ }
569
+
570
+ /**
571
+ *
572
+ * @param mesh
573
+ * @return
574
+ */
575
+ public Mesh3D toMesh(Mesh3D mesh) {
576
+ if (mesh == null) {
577
+ mesh = new TriangleMesh("aabb", 8, 12);
578
+ }
579
+ Vec3D a = min;
580
+ Vec3D g = max;
581
+ Vec3D b = new Vec3D(a.x, a.y, g.z);
582
+ Vec3D c = new Vec3D(g.x, a.y, g.z);
583
+ Vec3D d = new Vec3D(g.x, a.y, a.z);
584
+ Vec3D e = new Vec3D(a.x, g.y, a.z);
585
+ Vec3D f = new Vec3D(a.x, g.y, g.z);
586
+ Vec3D h = new Vec3D(g.x, g.y, a.z);
587
+ Vec2D ua = new Vec2D(0, 0);
588
+ Vec2D ub = new Vec2D(1, 0);
589
+ Vec2D uc = new Vec2D(1, 1);
590
+ Vec2D ud = new Vec2D(0, 1);
591
+ // left
592
+ mesh.addFace(a, b, f, ud, uc, ub);
593
+ mesh.addFace(a, f, e, ud, ub, ua);
594
+ // front
595
+ mesh.addFace(b, c, g, ud, uc, ub);
596
+ mesh.addFace(b, g, f, ud, ub, ua);
597
+ // right
598
+ mesh.addFace(c, d, h, ud, uc, ub);
599
+ mesh.addFace(c, h, g, ud, ub, ua);
600
+ // back
601
+ mesh.addFace(d, a, e, ud, uc, ub);
602
+ mesh.addFace(d, e, h, ud, ub, ua);
603
+ // top
604
+ mesh.addFace(e, f, h, ua, ud, ub);
605
+ mesh.addFace(f, g, h, ud, uc, ub);
606
+ // bottom
607
+ mesh.addFace(a, d, b, ud, uc, ua);
608
+ mesh.addFace(b, d, c, ua, uc, ub);
609
+ return mesh;
610
+ }
611
+
612
+ /*
613
+ * (non-Javadoc)
614
+ *
615
+ * @see toxi.geom.Vec3D#toString()
616
+ */
617
+
618
+ /**
619
+ *
620
+ * @return
621
+ */
622
+
623
+ @Override
624
+ public String toString() {
625
+ StringBuilder sb = new StringBuilder();
626
+ sb.append("<aabb> pos: ").append(super.toString()).append(" ext: ")
627
+ .append(extent);
628
+ return sb.toString();
629
+ }
630
+
631
+ /**
632
+ *
633
+ * @param box
634
+ * @return
635
+ */
636
+ public AABB union(AABB box) {
637
+ min.minSelf(box.getMin());
638
+ max.maxSelf(box.getMax());
639
+ set(min.interpolateTo(max, 0.5f));
640
+ extent.set(max.sub(min).scaleSelf(0.5f));
641
+ return this;
642
+ }
643
+
644
+ /**
645
+ * Updates the min/max corner points of the box. MUST be called after moving
646
+ * the box in space by manipulating the public x,y,z coordinates directly.
647
+ *
648
+ * @return itself
649
+ */
650
+ public final AABB updateBounds() {
651
+ // this is check is necessary for the constructor
652
+ if (extent != null) {
653
+ this.min = this.sub(extent);
654
+ this.max = this.add(extent);
655
+ }
656
+ return this;
657
+ }
658
+ }