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,431 @@
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 toxi.math.InterpolateStrategy;
31
+ import toxi.math.MathUtils;
32
+ import toxi.math.ScaleMap;
33
+
34
+ /**
35
+ * Readonly, immutable interface wrapper for Vec3D instances. Used throughout
36
+ * the library for safety purposes.
37
+ */
38
+ public interface ReadonlyVec4D {
39
+
40
+ /**
41
+ * Add vector v and returns result as new vector.
42
+ *
43
+ * @param v
44
+ * vector to add
45
+ *
46
+ * @return result as new vector
47
+ */
48
+ public Vec4D add(ReadonlyVec4D v);
49
+
50
+ /**
51
+ *
52
+ * @param t
53
+ * @param s
54
+ * @return
55
+ */
56
+ public Vec4D addScaled(ReadonlyVec4D t, float s);
57
+
58
+ /**
59
+ * Adds vector {a,b,c} and returns result as new vector.
60
+ *
61
+ * @param a
62
+ * X coordinate
63
+ * @param b
64
+ * Y coordinate
65
+ * @param c
66
+ * Z coordinate
67
+ *
68
+ * @return result as new vector
69
+ */
70
+ public Vec4D addXYZ(float a, float b, float c);
71
+
72
+ /**
73
+ * Returns the (4-space) angle in radians between this vector and the vector
74
+ * parameter; the return value is constrained to the range [0,PI].
75
+ *
76
+ * @param v
77
+ * the other vector
78
+ * @return the angle in radians in the range [0,PI]
79
+ */
80
+ public float angleBetween(ReadonlyVec4D v);
81
+
82
+ /**
83
+ * Compares the length of the vector with another one.
84
+ *
85
+ * @param v
86
+ * vector to compare with
87
+ *
88
+ * @return -1 if other vector is longer, 0 if both are equal or else +1
89
+ */
90
+ public int compareTo(ReadonlyVec4D v);
91
+
92
+ /**
93
+ * Copy.
94
+ *
95
+ * @return a new independent instance/copy of a given vector
96
+ */
97
+ public Vec4D copy();
98
+
99
+ /**
100
+ * Calculates distance to another vector.
101
+ *
102
+ * @param v
103
+ * non-null vector
104
+ *
105
+ * @return distance or Float.NaN if v=null
106
+ */
107
+ public float distanceTo(ReadonlyVec4D v);
108
+
109
+ /**
110
+ * Calculates the squared distance to another vector.
111
+ *
112
+ * @param v
113
+ * non-null vector
114
+ *
115
+ * @return distance or NaN if v=null
116
+ *
117
+ * @see #magSquared()
118
+ */
119
+ public float distanceToSquared(ReadonlyVec4D v);
120
+
121
+ /**
122
+ * Computes the scalar product (dot product) with the given vector.
123
+ *
124
+ * @param v
125
+ * the v
126
+ *
127
+ * @return dot product
128
+ *
129
+ * @see <a href="http://en.wikipedia.org/wiki/Dot_product">Wikipedia
130
+ * entry</a>
131
+ */
132
+ public float dot(ReadonlyVec4D v);
133
+
134
+ /*
135
+ * (non-Javadoc)
136
+ *
137
+ * @see java.lang.Object#equals(java.lang.Object)
138
+ */
139
+
140
+ /**
141
+ *
142
+ * @param obj
143
+ * @return
144
+ */
145
+
146
+ @Override
147
+ public boolean equals(Object obj);
148
+
149
+ /**
150
+ * Compares this vector with the one given. The vectors are deemed equal if
151
+ * the individual differences of all component values are within the given
152
+ * tolerance.
153
+ *
154
+ * @param v
155
+ * the v
156
+ * @param tolerance
157
+ * the tolerance
158
+ *
159
+ * @return true, if equal
160
+ */
161
+ public boolean equalsWithTolerance(ReadonlyVec4D v, float tolerance);
162
+
163
+ /**
164
+ * Gets the abs.
165
+ *
166
+ * @return the abs
167
+ */
168
+ public Vec4D getAbs();
169
+
170
+ /**
171
+ * Scales vector uniformly by factor -1 ( v = -v ).
172
+ *
173
+ * @return result as new vector
174
+ */
175
+ public Vec4D getInvertedXYZ();
176
+
177
+ /**
178
+ * Produces a new vector with all of its coordinates passed through the
179
+ * given {@link ScaleMap}. This version also maps the w coordinate. For
180
+ * mapping only XYZ use the {@link #getMappedXYZ(ScaleMap)} version.
181
+ *
182
+ * @param map
183
+ * @return mapped vector
184
+ */
185
+ public Vec4D getMapped(ScaleMap map);
186
+
187
+ /**
188
+ * Produces a new vector with only its XYZ coordinates passed through the
189
+ * given {@link ScaleMap}. This version keeps the original w coordinate. For
190
+ * mapping all XYZW, use the {@link #getMapped(ScaleMap)} version.
191
+ *
192
+ * @param map
193
+ * @return mapped vector
194
+ */
195
+ public Vec4D getMappedXYZ(ScaleMap map);
196
+
197
+ /**
198
+ * Produces the normalized version as a new vector.
199
+ *
200
+ * @return new vector
201
+ */
202
+ public Vec4D getNormalized();
203
+
204
+ /**
205
+ * Produces a new vector normalized to the given length.
206
+ *
207
+ * @param len
208
+ * new desired length
209
+ *
210
+ * @return new vector
211
+ */
212
+ public Vec4D getNormalizedTo(float len);
213
+
214
+ /**
215
+ * Gets the rotated around axis.
216
+ *
217
+ * @param axis
218
+ * the axis
219
+ * @param theta
220
+ * the theta
221
+ *
222
+ * @return new result vector
223
+ */
224
+ public Vec4D getRotatedAroundAxis(ReadonlyVec3D axis, float theta);
225
+
226
+ /**
227
+ * Creates a new vector rotated by the given angle around the X axis.
228
+ *
229
+ * @param theta
230
+ * the theta
231
+ *
232
+ * @return rotated vector
233
+ */
234
+ public Vec4D getRotatedX(float theta);
235
+
236
+ /**
237
+ * Creates a new vector rotated by the given angle around the Y axis.
238
+ *
239
+ * @param theta
240
+ * the theta
241
+ *
242
+ * @return rotated vector
243
+ */
244
+ public Vec4D getRotatedY(float theta);
245
+
246
+ /**
247
+ * Creates a new vector rotated by the given angle around the Z axis.
248
+ *
249
+ * @param theta
250
+ * the theta
251
+ *
252
+ * @return rotated vector
253
+ */
254
+ public Vec4D getRotatedZ(float theta);
255
+
256
+ /**
257
+ * Creates a new vector with its XYZ coordinates rounded to the given
258
+ * precision (grid alignment). The weight component remains unmodified.
259
+ *
260
+ * @param prec
261
+ * @return grid aligned vector
262
+ */
263
+ public Vec4D getRoundedXYZTo(float prec);
264
+
265
+ /**
266
+ *
267
+ * @return
268
+ */
269
+ public Vec4D getUnweighted();
270
+
271
+ /**
272
+ *
273
+ * @return
274
+ */
275
+ public Vec4D getWeighted();
276
+
277
+ /**
278
+ * Interpolates the vector towards the given target vector, using linear
279
+ * interpolation.
280
+ *
281
+ * @param v
282
+ * target vector
283
+ * @param f
284
+ * interpolation factor (should be in the range 0..1)
285
+ *
286
+ * @return result as new vector
287
+ */
288
+ public Vec4D interpolateTo(ReadonlyVec4D v, float f);
289
+
290
+ /**
291
+ * Interpolates the vector towards the given target vector, using the given
292
+ * {@link InterpolateStrategy}.
293
+ *
294
+ * @param v
295
+ * target vector
296
+ * @param f
297
+ * interpolation factor (should be in the range 0..1)
298
+ * @param s
299
+ * InterpolateStrategy instance
300
+ *
301
+ * @return result as new vector
302
+ */
303
+ public Vec4D interpolateTo(ReadonlyVec4D v, float f, InterpolateStrategy s);
304
+
305
+ /**
306
+ * Checks if vector has a magnitude equals or close to zero (tolerance used
307
+ * is {@link MathUtils#EPS}).
308
+ *
309
+ * @return true, if zero vector
310
+ */
311
+ public boolean isZeroVector();
312
+
313
+ /**
314
+ * Calculates the magnitude/eucledian length of the vector.
315
+ *
316
+ * @return vector length
317
+ */
318
+ public float magnitude();
319
+
320
+ /**
321
+ * Calculates only the squared magnitude/length of the vector. Useful for
322
+ * inverse square law applications and/or for speed reasons or if the real
323
+ * eucledian distance is not required (e.g. sorting).
324
+ *
325
+ * @return squared magnitude (x^2 + y^2 + z^2)
326
+ */
327
+ public float magSquared();
328
+
329
+ /**
330
+ * Scales vector uniformly and returns result as new vector.
331
+ *
332
+ * @param s
333
+ * scale factor
334
+ *
335
+ * @return new vector
336
+ */
337
+ public Vec4D scale(float s);
338
+
339
+ /**
340
+ * Scales vector non-uniformly and returns result as new vector.
341
+ *
342
+ * @param x
343
+ * scale factor for X coordinate
344
+ * @param y
345
+ * scale factor for Y coordinate
346
+ * @param z
347
+ * scale factor for Z coordinate
348
+ * @param w
349
+ *
350
+ * @return new vector
351
+ */
352
+ public Vec4D scale(float x, float y, float z, float w);
353
+
354
+ /**
355
+ * Scales vector non-uniformly by vector v and returns result as new vector.
356
+ *
357
+ * @param s
358
+ * scale vector
359
+ *
360
+ * @return new vector
361
+ */
362
+ public Vec4D scale(ReadonlyVec4D s);
363
+
364
+ /**
365
+ * Subtracts vector v and returns result as new vector.
366
+ *
367
+ * @param v
368
+ * vector to be subtracted
369
+ *
370
+ * @return result as new vector
371
+ */
372
+ public Vec4D sub(ReadonlyVec4D v);
373
+
374
+ /**
375
+ * Subtracts vector {a,b,c} and returns result as new vector.
376
+ *
377
+ * @param a
378
+ * X coordinate
379
+ * @param b
380
+ * Y coordinate
381
+ * @param c
382
+ * Z coordinate
383
+ *
384
+ * @return result as new vector
385
+ */
386
+ public Vec4D subXYZ(float a, float b, float c);
387
+
388
+ /**
389
+ *
390
+ * @return
391
+ */
392
+ public float[] toArray();
393
+
394
+ /**
395
+ *
396
+ * @param out
397
+ * @return
398
+ */
399
+ public Vec3D unweightInto(Vec3D out);
400
+
401
+ /**
402
+ *
403
+ * @return
404
+ */
405
+ public float w();
406
+
407
+ /**
408
+ *
409
+ * @param out
410
+ * @return
411
+ */
412
+ public Vec3D weightInto(Vec3D out);
413
+
414
+ /**
415
+ *
416
+ * @return
417
+ */
418
+ public float x();
419
+
420
+ /**
421
+ *
422
+ * @return
423
+ */
424
+ public float y();
425
+
426
+ /**
427
+ *
428
+ * @return
429
+ */
430
+ public float z();
431
+ }
@@ -0,0 +1,720 @@
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.List;
32
+
33
+ import javax.xml.bind.annotation.XmlAccessType;
34
+ import javax.xml.bind.annotation.XmlAccessorType;
35
+ import javax.xml.bind.annotation.XmlAttribute;
36
+ import toxi.math.MathUtils;
37
+
38
+ /**
39
+ *
40
+ * @author tux
41
+ */
42
+ @XmlAccessorType(XmlAccessType.FIELD)
43
+ public class Rect implements Shape2D {
44
+
45
+ /**
46
+ * Factory method, constructs a new rectangle from a center point and extent
47
+ * vector.
48
+ *
49
+ * @param center
50
+ * @param extent
51
+ * @return new rect
52
+ */
53
+ public static final Rect fromCenterExtent(ReadonlyVec2D center, Vec2D extent) {
54
+ return new Rect(center.sub(extent), center.add(extent));
55
+ }
56
+
57
+ /**
58
+ * Factory method, computes & returns the bounding rect for the given list
59
+ * of points.
60
+ *
61
+ * @param points
62
+ * @return bounding rect
63
+ * @since 0021
64
+ */
65
+ public static final Rect getBoundingRect(List<? extends Vec2D> points) {
66
+ final Vec2D first = points.get(0);
67
+ final Rect bounds = new Rect(first.x, first.y, 0, 0);
68
+ for (int i = 1, num = points.size(); i < num; i++) {
69
+ bounds.growToContainPoint(points.get(i));
70
+ }
71
+ return bounds;
72
+ }
73
+
74
+ @XmlAttribute(required = true)
75
+ public float x,
76
+
77
+ /**
78
+ *
79
+ */
80
+ y,
81
+
82
+ /**
83
+ *
84
+ */
85
+ width,
86
+
87
+ /**
88
+ *
89
+ */
90
+
91
+ /**
92
+ *
93
+ */
94
+ height;
95
+
96
+ /**
97
+ * Constructs an empty rectangle at point 0,0 with no dimensions.
98
+ */
99
+ public Rect() {
100
+
101
+ }
102
+
103
+ /**
104
+ * Constructs a new rectangle using a point and dimensions
105
+ *
106
+ * @param x
107
+ * x of top left
108
+ * @param y
109
+ * y of top left
110
+ * @param width
111
+ * @param height
112
+ */
113
+ public Rect(float x, float y, float width, float height) {
114
+ this.x = x;
115
+ this.y = y;
116
+ this.width = width;
117
+ this.height = height;
118
+ }
119
+
120
+ /**
121
+ * Constructs a new rectangle defined by the two points given.
122
+ *
123
+ * @param p1
124
+ * @param p2
125
+ */
126
+ public Rect(ReadonlyVec2D p1, ReadonlyVec2D p2) {
127
+ Vec2D tl = Vec2D.min(p1, p2);
128
+ Vec2D br = Vec2D.max(p1, p2);
129
+ x = tl.x;
130
+ y = tl.y;
131
+ width = br.x - x;
132
+ height = br.y - y;
133
+ }
134
+
135
+ /**
136
+ * Checks if the given point is within the rectangle's bounds.
137
+ *
138
+ * @param p
139
+ * point to check
140
+ * @return true, if point is contained
141
+ */
142
+ @Override
143
+ public boolean containsPoint(ReadonlyVec2D p) {
144
+ float px = p.x();
145
+ float py = p.y();
146
+ if (px < x || px > x + width) {
147
+ return false;
148
+ }
149
+ return (py >= y || py <= y + height);
150
+ }
151
+
152
+ /**
153
+ * Creates a copy of this rectangle
154
+ *
155
+ * @return new instance
156
+ */
157
+ public Rect copy() {
158
+ return new Rect(x, y, width, height);
159
+ }
160
+
161
+ /**
162
+ * Returns true if the Object o is of type Rect and all of the data members
163
+ * of o are equal to the corresponding data members in this rectangle.
164
+ *
165
+ * @param o
166
+ * the Object with which the comparison is made
167
+ * @return true or false
168
+ */
169
+ @Override
170
+ public boolean equals(Object o) {
171
+ if (o instanceof Rect) {
172
+ Rect r = (Rect) o;
173
+ return (x == r.x && y == r.y && width == r.width && height == r.height);
174
+ }
175
+ return false;
176
+ }
177
+
178
+ @Override
179
+ public final float getArea() {
180
+ return width * height;
181
+ }
182
+
183
+ /**
184
+ * Computes the aspect ratio of the rect as width over height.
185
+ *
186
+ * @return aspect ratio
187
+ */
188
+ public final float getAspect() {
189
+ return width / height;
190
+ }
191
+
192
+ /**
193
+ *
194
+ * @return
195
+ */
196
+ public float getBottom() {
197
+ return y + height;
198
+ }
199
+
200
+ /**
201
+ *
202
+ * @return
203
+ */
204
+ public Vec2D getBottomLeft() {
205
+ return new Vec2D(x, y + height);
206
+ }
207
+
208
+ /**
209
+ *
210
+ * @return
211
+ */
212
+ public final Vec2D getBottomRight() {
213
+ return new Vec2D(x + width, y + height);
214
+ }
215
+
216
+ @Override
217
+ public Circle getBoundingCircle() {
218
+ return new Circle(getCentroid(),
219
+ new Vec2D(width, height).magnitude() / 2);
220
+ }
221
+
222
+ /**
223
+ * Only provided because the Rect class implements {@link Shape2D}. The
224
+ * bounding rect of a rectangle is itself.
225
+ *
226
+ * @return itself
227
+ *
228
+ * @see toxi.geom.Shape2D#getBounds()
229
+ */
230
+ @Override
231
+ public Rect getBounds() {
232
+ return this;
233
+ }
234
+
235
+ /**
236
+ * Returns the centroid of the rectangle.
237
+ *
238
+ * @return centroid vector
239
+ */
240
+ public final Vec2D getCentroid() {
241
+ return new Vec2D(x + width * 0.5f, y + height * 0.5f);
242
+ }
243
+
244
+ @Override
245
+ public final float getCircumference() {
246
+ return 2 * width + 2 * height;
247
+ }
248
+
249
+ /**
250
+ * Returns a vector containing the width and height of the rectangle.
251
+ *
252
+ * @return dimension vector
253
+ */
254
+ public final Vec2D getDimensions() {
255
+ return new Vec2D(width, height);
256
+ }
257
+
258
+ /**
259
+ * Returns one of the rectangles edges as {@link Line2D}. The edge IDs are:
260
+ * <ul>
261
+ * <li>0 - top</li>
262
+ * <li>1 - right</li>
263
+ * <li>2 - bottom</li>
264
+ * <li>3 - left</li>
265
+ * </ul>
266
+ *
267
+ * @param id
268
+ * edge ID
269
+ * @return edge as Line2D
270
+ */
271
+ public Line2D getEdge(int id) {
272
+ Line2D edge = null;
273
+ switch (id) {
274
+ // top
275
+ case 0:
276
+ edge = new Line2D(x, y, x + width, y);
277
+ break;
278
+ // right
279
+ case 1:
280
+ edge = new Line2D(x + width, y, x + width, y + height);
281
+ break;
282
+ // bottom
283
+ case 2:
284
+ edge = new Line2D(x, y + height, x + width, y + height);
285
+ break;
286
+ // left
287
+ case 3:
288
+ edge = new Line2D(x, y, x, y + height);
289
+ break;
290
+ default:
291
+ throw new IllegalArgumentException("edge ID needs to be 0...3");
292
+ }
293
+ return edge;
294
+ }
295
+
296
+ @Override
297
+ public List<Line2D> getEdges() {
298
+ List<Line2D> edges = new ArrayList<>();
299
+ for (int i = 0; i < 4; i++) {
300
+ edges.add(getEdge(i));
301
+ }
302
+ return edges;
303
+ }
304
+
305
+ /**
306
+ *
307
+ * @return
308
+ */
309
+ public float getLeft() {
310
+ return x;
311
+ }
312
+
313
+ /**
314
+ * Computes the normalized position of the given point within this
315
+ * rectangle, so that a point at the top-left corner becomes {0,0} and
316
+ * bottom-right {1,1}. The original point is not modified. Together with
317
+ * {@link #getUnmappedPointInRect(Vec2D)} this function can be used to map a
318
+ * point from one rectangle to another.
319
+ *
320
+ * @param p
321
+ * point to be mapped
322
+ * @return mapped Vec2D
323
+ */
324
+ public Vec2D getMappedPointInRect(Vec2D p) {
325
+ return new Vec2D((p.x - x) / width, (p.y - y) / height);
326
+ }
327
+
328
+ /**
329
+ * Creates a random point within the rectangle.
330
+ *
331
+ * @return Vec2D
332
+ */
333
+ @Override
334
+ public Vec2D getRandomPoint() {
335
+ return new Vec2D(MathUtils.random(x, x + width), MathUtils.random(y, y
336
+ + height));
337
+ }
338
+
339
+ /**
340
+ *
341
+ * @return
342
+ */
343
+ public float getRight() {
344
+ return x + width;
345
+ }
346
+
347
+ /**
348
+ *
349
+ * @return
350
+ */
351
+ public float getTop() {
352
+ return y;
353
+ }
354
+
355
+ /**
356
+ *
357
+ * @return
358
+ */
359
+ public final Vec2D getTopLeft() {
360
+ return new Vec2D(x, y);
361
+ }
362
+
363
+ /**
364
+ *
365
+ * @return
366
+ */
367
+ public Vec2D getTopRight() {
368
+ return new Vec2D(x + width, y);
369
+ }
370
+
371
+ /**
372
+ * Inverse operation of {@link #getMappedPointInRect(Vec2D)}. Given a
373
+ * normalized point it computes the position within this rectangle, so that
374
+ * a point at {0,0} becomes the top-left corner and {1,1} bottom-right. The
375
+ * original point is not modified. Together with
376
+ * {@link #getUnmappedPointInRect(Vec2D)} this function can be used to map a
377
+ * point from one rectangle to another.
378
+ *
379
+ * @param p
380
+ * point to be mapped
381
+ * @return mapped Vec2D
382
+ */
383
+ public Vec2D getUnmappedPointInRect(Vec2D p) {
384
+ return new Vec2D(p.x * width + x, p.y * height + y);
385
+ }
386
+
387
+ /**
388
+ *
389
+ * @param p
390
+ * @return
391
+ */
392
+ public Rect growToContainPoint(ReadonlyVec2D p) {
393
+ if (!containsPoint(p)) {
394
+ if (p.x() < x) {
395
+ width = getRight() - p.x();
396
+ x = p.x();
397
+ } else if (p.x() > getRight()) {
398
+ width = p.x() - x;
399
+ }
400
+ if (p.y() < y) {
401
+ height = getBottom() - p.y();
402
+ y = p.y();
403
+ } else if (p.y() > getBottom()) {
404
+ height = p.y() - y;
405
+ }
406
+ }
407
+ return this;
408
+ }
409
+
410
+ /**
411
+ * Returns a hash code value based on the data values in this object. Two
412
+ * different Rect objects with identical data values (i.e., Rect.equals
413
+ * returns true) will return the same hash code value. Two objects with
414
+ * different data members may return the same hash value, although this is
415
+ * not likely.
416
+ *
417
+ * @return the integer hash code value
418
+ */
419
+ @Override
420
+ public int hashCode() {
421
+ long bits = 1L;
422
+ bits = 31L * bits + VecMathUtil.floatToIntBits(x);
423
+ bits = 31L * bits + VecMathUtil.floatToIntBits(y);
424
+ bits = 31L * bits + VecMathUtil.floatToIntBits(width);
425
+ bits = 31L * bits + VecMathUtil.floatToIntBits(height);
426
+ return (int) (bits ^ (bits >> 32));
427
+ }
428
+
429
+ /**
430
+ * Creates a new rectangle by forming the intersection of this rectangle and
431
+ * the given other rect. The resulting bounds will be the rectangle of the
432
+ * overlay area or null if the rects do not intersect.
433
+ *
434
+ * @param r
435
+ * intersection partner rect
436
+ * @return new Rect or null
437
+ */
438
+ public final Rect intersectionRectWith(Rect r) {
439
+ Rect isec = null;
440
+ if (intersectsRect(r)) {
441
+ float x1 = MathUtils.max(x, r.x);
442
+ float y1 = MathUtils.max(y, r.y);
443
+ float x2 = MathUtils.min(getRight(), r.getRight());
444
+ float y2 = MathUtils.min(getBottom(), r.getBottom());
445
+ isec = new Rect(x1, y1, x2 - x1, y2 - y1);
446
+ }
447
+ return isec;
448
+ }
449
+
450
+ /**
451
+ *
452
+ * @param c
453
+ * @param r
454
+ * @return
455
+ */
456
+ public boolean intersectsCircle(Vec2D c, float r) {
457
+ float s, d = 0;
458
+ float x2 = x + width;
459
+ float y2 = y + height;
460
+ if (c.x < x) {
461
+ s = c.x - x;
462
+ d = s * s;
463
+ } else if (c.x > x2) {
464
+ s = c.x - x2;
465
+ d += s * s;
466
+ }
467
+ if (c.y < y) {
468
+ s = c.y - y;
469
+ d += s * s;
470
+ } else if (c.y > y2) {
471
+ s = c.y - y2;
472
+ d += s * s;
473
+ }
474
+ return d <= r * r;
475
+ }
476
+
477
+ /**
478
+ * Checks if the rectangle intersects with the given ray and if so computes
479
+ * the first intersection point. The method takes a min/max distance
480
+ * interval along the ray in which the intersection must occur.
481
+ *
482
+ * @param ray
483
+ * intersection ray
484
+ * @param minDist
485
+ * minimum distance
486
+ * @param maxDist
487
+ * max distance
488
+ * @return intersection point or null if no intersection in the given
489
+ * interval
490
+ */
491
+ public ReadonlyVec2D intersectsRay(Ray2D ray, float minDist, float maxDist) {
492
+ Vec2D invDir = ray.getDirection().reciprocal();
493
+ boolean signDirX = invDir.x < 0;
494
+ boolean signDirY = invDir.y < 0;
495
+ Vec2D min = getTopLeft();
496
+ Vec2D max = getBottomRight();
497
+ Vec2D bbox = signDirX ? max : min;
498
+ float tmin = (bbox.x - ray.x) * invDir.x;
499
+ bbox = signDirX ? min : max;
500
+ float tmax = (bbox.x - ray.x) * invDir.x;
501
+ bbox = signDirY ? max : min;
502
+ float tymin = (bbox.y - ray.y) * invDir.y;
503
+ bbox = signDirY ? min : max;
504
+ float tymax = (bbox.y - ray.y) * invDir.y;
505
+ if ((tmin > tymax) || (tymin > tmax)) {
506
+ return null;
507
+ }
508
+ if (tymin > tmin) {
509
+ tmin = tymin;
510
+ }
511
+ if (tymax < tmax) {
512
+ tmax = tymax;
513
+ }
514
+ if ((tmin < maxDist) && (tmax > minDist)) {
515
+ return ray.getPointAtDistance(tmin);
516
+ }
517
+ return null;
518
+ }
519
+
520
+ /**
521
+ * Checks if this rectangle intersects/overlaps the given one.
522
+ *
523
+ * @param r
524
+ * another rect
525
+ * @return true, if intersecting
526
+ */
527
+ public boolean intersectsRect(Rect r) {
528
+ return !(x > r.x + r.width || x + width < r.x || y > r.y + r.height || y
529
+ + height < r.y);
530
+ }
531
+
532
+ /**
533
+ *
534
+ * @param s
535
+ * @return
536
+ */
537
+ public Rect scale(float s) {
538
+ Vec2D c = getCentroid();
539
+ width *= s;
540
+ height *= s;
541
+ x = c.x - width * 0.5f;
542
+ y = c.y - height * 0.5f;
543
+ return this;
544
+ }
545
+
546
+ /**
547
+ * Sets new bounds for this rectangle.
548
+ *
549
+ * @param x
550
+ * x of top left
551
+ * @param y
552
+ * y of top right
553
+ * @param w
554
+ * width
555
+ * @param h
556
+ * height
557
+ * @return itself
558
+ */
559
+ public final Rect set(float x, float y, float w, float h) {
560
+ this.x = x;
561
+ this.y = y;
562
+ this.width = w;
563
+ this.height = h;
564
+ return this;
565
+ }
566
+
567
+ /**
568
+ *
569
+ * @param r
570
+ * @return
571
+ */
572
+ public final Rect set(Rect r) {
573
+ x = r.x;
574
+ y = r.y;
575
+ width = r.width;
576
+ height = r.height;
577
+ return this;
578
+ }
579
+
580
+ /**
581
+ *
582
+ * @param dim
583
+ * @return
584
+ */
585
+ public final Rect setDimension(Vec2D dim) {
586
+ width = dim.x;
587
+ height = dim.y;
588
+ return this;
589
+ }
590
+
591
+ /**
592
+ *
593
+ * @param pos
594
+ * @return
595
+ */
596
+ public final Rect setPosition(Vec2D pos) {
597
+ x = pos.x;
598
+ y = pos.y;
599
+ return this;
600
+ }
601
+
602
+ /**
603
+ * Adds corner vertices for rounded rectangles polygon construction.
604
+ *
605
+ * @param poly
606
+ * @param o
607
+ * @param radius
608
+ * @param theta
609
+ * @param res
610
+ */
611
+ private void toPolyArc(Polygon2D poly, Vec2D o, float radius, float theta,
612
+ int res) {
613
+ for (int i = 0; i <= res; i++) {
614
+ poly.add(o.add(Vec2D.fromTheta(theta + i * MathUtils.HALF_PI / res)
615
+ .scaleSelf(radius)));
616
+ }
617
+ }
618
+
619
+ /**
620
+ * Creates a {@link Polygon2D} instance of the rect.
621
+ *
622
+ * @return rect as polygon
623
+ */
624
+ @Override
625
+ public Polygon2D toPolygon2D() {
626
+ Polygon2D poly = new Polygon2D();
627
+ poly.add(new Vec2D(x, y));
628
+ poly.add(new Vec2D(x + width, y));
629
+ poly.add(new Vec2D(x + width, y + height));
630
+ poly.add(new Vec2D(x, y + height));
631
+ return poly;
632
+ }
633
+
634
+ /**
635
+ * Turns this rectangle into a rounded rectangle shaped {@link Polygon2D}
636
+ * instance with the given corner radius. The number of corner vertices to
637
+ * be used, can be specified as well.
638
+ *
639
+ * @param radius
640
+ * corner radius
641
+ * @param res
642
+ * number of vertices per corner
643
+ * @return rounded rect as polygon
644
+ */
645
+ public Polygon2D toPolygon2D(float radius, int res) {
646
+ Polygon2D poly = new Polygon2D();
647
+ toPolyArc(poly, new Vec2D(x + width - radius, y + radius), radius,
648
+ -MathUtils.HALF_PI, res);
649
+ toPolyArc(poly, new Vec2D(x + width - radius, y + height - radius),
650
+ radius, 0, res);
651
+ toPolyArc(poly, new Vec2D(x + radius, y + height - radius), radius,
652
+ MathUtils.HALF_PI, res);
653
+ toPolyArc(poly, new Vec2D(x + radius, y + radius), radius,
654
+ MathUtils.PI, res);
655
+ return poly;
656
+ }
657
+
658
+ /**
659
+ *
660
+ * @return
661
+ */
662
+ @Override
663
+ public String toString() {
664
+ return "rect: {x:" + x + ", y:" + y + ", width:" + width + ", height:"
665
+ + height + "}";
666
+ }
667
+
668
+ /**
669
+ *
670
+ * @param dx
671
+ * @param dy
672
+ * @return
673
+ */
674
+ public Rect translate(float dx, float dy) {
675
+ x += dx;
676
+ y += dy;
677
+ return this;
678
+ }
679
+
680
+ /**
681
+ *
682
+ * @param offset
683
+ * @return
684
+ */
685
+ public Rect translate(ReadonlyVec2D offset) {
686
+ x += offset.x();
687
+ y += offset.y();
688
+ return this;
689
+ }
690
+
691
+ /**
692
+ * @deprecated use {@link #unionRectWith(Rect)} instead. Also note, that
693
+ * {@link #unionRectWith(Rect)} does NOT modify the original
694
+ * Rect anymore, but produces a new Rect instance.
695
+ * @param r
696
+ * @return new Rect
697
+ */
698
+ @Deprecated
699
+ public final Rect union(Rect r) {
700
+ return unionRectWith(r);
701
+ }
702
+
703
+ /**
704
+ * Creates a new rectangle by forming an union of this rectangle and the
705
+ * given other Rect. The resulting bounds will be inclusive of both.
706
+ *
707
+ * @param r
708
+ * @return new Rect
709
+ */
710
+ public final Rect unionRectWith(Rect r) {
711
+ float x1 = MathUtils.min(x, r.x);
712
+ float x2 = MathUtils.max(x + width, r.x + r.width);
713
+ float w = x2 - x1;
714
+ float y1 = MathUtils.min(y, r.y);
715
+ float y2 = MathUtils.max(y + height, r.y + r.height);
716
+ float h = y2 - y1;
717
+ return new Rect(x1, y1, w, h);
718
+ }
719
+
720
+ }