toxiclibs 0.2-java → 0.5.0-java

Sign up to get free protection for your applications and to get access to all the features.
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
+ }