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,85 @@
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
+ /**
31
+ * This class handles Circle-Ray2D intersections by implementing the
32
+ * {@link Intersector2D} interface.
33
+ *
34
+ */
35
+ public class CircleIntersector implements Intersector2D {
36
+
37
+ private final IsectData2D isec = new IsectData2D();
38
+ private Circle circle;
39
+
40
+ /**
41
+ *
42
+ * @param circle
43
+ */
44
+ public CircleIntersector(Circle circle) {
45
+ this.circle = circle;
46
+ }
47
+
48
+ /**
49
+ *
50
+ * @return
51
+ */
52
+ public Circle getCircle() {
53
+ return circle;
54
+ }
55
+
56
+ @Override
57
+ public IsectData2D getIntersectionData() {
58
+ return isec;
59
+ }
60
+
61
+ @Override
62
+ public boolean intersectsRay(Ray2D ray) {
63
+ isec.clear();
64
+ Vec2D q = circle.sub(ray);
65
+ float distSquared = q.magSquared();
66
+ float v = q.dot(ray.getDirection());
67
+ float r = circle.getRadius();
68
+ float d = r * r - (distSquared - v * v);
69
+ if (d >= 0.0) {
70
+ isec.isIntersection = true;
71
+ isec.dist = v - (float) Math.sqrt(d);
72
+ isec.pos = ray.getPointAtDistance(isec.dist);
73
+ isec.normal = isec.pos.sub(circle).normalize();
74
+ }
75
+ return isec.isIntersection;
76
+ }
77
+
78
+ /**
79
+ *
80
+ * @param circle
81
+ */
82
+ public void setCircle(Circle circle) {
83
+ this.circle = circle;
84
+ }
85
+ }
@@ -0,0 +1,150 @@
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.geom.mesh.Mesh3D;
31
+ import toxi.geom.mesh.TriangleMesh;
32
+ import toxi.math.MathUtils;
33
+
34
+ /**
35
+ * A geometric definition of a cone (and cylinder as a special case) with
36
+ * support for mesh creation/representation. The class is currently still
37
+ * incomplete in that it doesn't provide any other features than the
38
+ * construction of a cone shaped mesh.
39
+ */
40
+ public class Cone extends Vec3D {
41
+
42
+ /**
43
+ *
44
+ */
45
+ public Vec3D dir;
46
+
47
+ /**
48
+ *
49
+ */
50
+ public float radiusSouth;
51
+
52
+ /**
53
+ *
54
+ */
55
+ public float radiusNorth;
56
+
57
+ /**
58
+ *
59
+ */
60
+ public float length;
61
+
62
+ /**
63
+ * Constructs a new cone instance.
64
+ *
65
+ * @param pos
66
+ * centre position
67
+ * @param dir
68
+ * direction
69
+ * @param rNorth
70
+ * radius on the side in the forward direction
71
+ * @param rSouth
72
+ * radius on the side in the opposite direction
73
+ * @param len
74
+ * length of the cone
75
+ */
76
+ public Cone(ReadonlyVec3D pos, ReadonlyVec3D dir, float rNorth,
77
+ float rSouth, float len) {
78
+ super(pos);
79
+ this.dir = dir.getNormalized();
80
+ this.radiusNorth = rNorth;
81
+ this.radiusSouth = rSouth;
82
+ this.length = len;
83
+ }
84
+
85
+ /**
86
+ *
87
+ * @param steps
88
+ * @return
89
+ */
90
+ public Mesh3D toMesh(int steps) {
91
+ return toMesh(steps, 0);
92
+ }
93
+
94
+ /**
95
+ *
96
+ * @param steps
97
+ * @param thetaOffset
98
+ * @return
99
+ */
100
+ public Mesh3D toMesh(int steps, float thetaOffset) {
101
+ return toMesh(null, steps, thetaOffset, true, true);
102
+ }
103
+
104
+ /**
105
+ *
106
+ * @param mesh
107
+ * @param steps
108
+ * @param thetaOffset
109
+ * @param topClosed
110
+ * @param bottomClosed
111
+ * @return
112
+ */
113
+ public Mesh3D toMesh(Mesh3D mesh, int steps, float thetaOffset,
114
+ boolean topClosed, boolean bottomClosed) {
115
+ ReadonlyVec3D c = this.add(0.01f, 0.01f, 0.01f);
116
+ ReadonlyVec3D n = c.cross(dir.getNormalized()).normalize();
117
+ Vec3D halfAxis = dir.scale(length * 0.5f);
118
+ Vec3D p = sub(halfAxis);
119
+ Vec3D q = add(halfAxis);
120
+ Vec3D[] south = new Vec3D[steps];
121
+ Vec3D[] north = new Vec3D[steps];
122
+ float phi = MathUtils.TWO_PI / steps;
123
+ for (int i = 0; i < steps; i++) {
124
+ float theta = i * phi + thetaOffset;
125
+ ReadonlyVec3D nr = n.getRotatedAroundAxis(dir, theta);
126
+ south[i] = nr.scale(radiusSouth).addSelf(p);
127
+ north[i] = nr.scale(radiusNorth).addSelf(q);
128
+ }
129
+ int numV = steps * 2 + 2;
130
+ int numF = steps * 2 + (topClosed ? steps : 0)
131
+ + (bottomClosed ? steps : 0);
132
+ if (mesh == null) {
133
+ mesh = new TriangleMesh("cone", numV, numF);
134
+ }
135
+ for (int i = 0, j = 1; i < steps; i++, j++) {
136
+ if (j == steps) {
137
+ j = 0;
138
+ }
139
+ mesh.addFace(south[i], north[i], south[j], null, null, null, null);
140
+ mesh.addFace(south[j], north[i], north[j], null, null, null, null);
141
+ if (bottomClosed) {
142
+ mesh.addFace(p, south[i], south[j], null, null, null, null);
143
+ }
144
+ if (topClosed) {
145
+ mesh.addFace(north[i], q, north[j], null, null, null, null);
146
+ }
147
+ }
148
+ return mesh;
149
+ }
150
+ }
@@ -0,0 +1,136 @@
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
+ /**
34
+ * A more generic version of the Sutherland-Hodgeman algorithm to limit 2D
35
+ * polygons to convex clipping regions. Uses the clipping region's centroid and
36
+ * {@link Line2D#classifyPoint(ReadonlyVec2D)} to identify if an edge needs to
37
+ * be clipped or not.
38
+ *
39
+ * More information: http://en.wikipedia.org/wiki/Sutherland-Hodgman_algorithm
40
+ *
41
+ * @see SutherlandHodgemanClipper
42
+ * @since 0021
43
+ */
44
+ public class ConvexPolygonClipper implements PolygonClipper2D {
45
+
46
+ /**
47
+ *
48
+ */
49
+ protected Polygon2D bounds;
50
+
51
+ /**
52
+ *
53
+ */
54
+ protected Vec2D boundsCentroid;
55
+
56
+ /**
57
+ *
58
+ * @param bounds
59
+ */
60
+ public ConvexPolygonClipper(Polygon2D bounds) {
61
+ setBounds(bounds);
62
+ }
63
+
64
+ @Override
65
+ public Polygon2D clipPolygon(Polygon2D poly) {
66
+ List<Vec2D> points = new ArrayList<>(poly.vertices);
67
+ List<Vec2D> clipped = new ArrayList<>();
68
+ points.add(points.get(0));
69
+ for (Line2D clipEdge : bounds.getEdges()) {
70
+ clipped.clear();
71
+ float sign = clipEdge.classifyPoint(boundsCentroid);
72
+ for (int i = 0, num = points.size() - 1; i < num; i++) {
73
+ Vec2D p = points.get(i);
74
+ Vec2D q = points.get(i + 1);
75
+ if (clipEdge.classifyPoint(p) == sign) {
76
+ if (clipEdge.classifyPoint(q) == sign) {
77
+ clipped.add(q.copy());
78
+ } else {
79
+ clipped.add(getClippedPosOnEdge(clipEdge, p, q));
80
+ }
81
+ continue;
82
+ }
83
+ if (clipEdge.classifyPoint(q) == sign) {
84
+ clipped.add(getClippedPosOnEdge(clipEdge, p, q));
85
+ clipped.add(q.copy());
86
+ }
87
+ }
88
+ if (clipped.size() > 0
89
+ && clipped.get(0) != clipped.get(clipped.size() - 1)) {
90
+ clipped.add(clipped.get(0));
91
+ }
92
+ List<Vec2D> t = points;
93
+ points = clipped;
94
+ clipped = t;
95
+ }
96
+ return new Polygon2D(points).removeDuplicates(0.001f);
97
+ }
98
+
99
+ /**
100
+ *
101
+ * @return
102
+ */
103
+ public Polygon2D getBounds() {
104
+ return bounds;
105
+ }
106
+
107
+ /**
108
+ *
109
+ * @param clipEdge
110
+ * @param p
111
+ * @param q
112
+ * @return
113
+ */
114
+ protected Vec2D getClippedPosOnEdge(Line2D clipEdge, Vec2D p, Vec2D q) {
115
+ return clipEdge.intersectLine(new Line2D(p, q)).getPos();
116
+ }
117
+
118
+ /**
119
+ *
120
+ * @param list
121
+ * @param q
122
+ * @return
123
+ */
124
+ protected boolean isKnownVertex(List<Vec2D> list, Vec2D q) {
125
+ return list.stream().anyMatch((p) -> (p.equalsWithTolerance(q, 0.001f)));
126
+ }
127
+
128
+ /**
129
+ *
130
+ * @param bounds
131
+ */
132
+ public final void setBounds(Polygon2D bounds) {
133
+ this.bounds = bounds;
134
+ this.boundsCentroid = bounds.getCentroid();
135
+ }
136
+ }
@@ -0,0 +1,16 @@
1
+ package toxi.geom;
2
+
3
+ /**
4
+ *
5
+ * @author tux
6
+ * @param <T>
7
+ */
8
+ public interface CoordinateExtractor<T> {
9
+
10
+ /**
11
+ *
12
+ * @param obj
13
+ * @return
14
+ */
15
+ public float coordinate(T obj);
16
+ }
@@ -0,0 +1,250 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+
28
+ package toxi.geom;
29
+
30
+ import java.util.List;
31
+
32
+ import toxi.math.MathUtils;
33
+ import toxi.util.datatypes.BiasedFloatRange;
34
+
35
+ /**
36
+ * This class defines a 2D ellipse and provides several utility methods for it.
37
+ */
38
+ public class Ellipse extends Vec2D implements Shape2D {
39
+
40
+ /**
41
+ *
42
+ */
43
+ public static int DEFAULT_RES = 20;
44
+
45
+ /**
46
+ *
47
+ */
48
+ protected Vec2D radius = new Vec2D();
49
+
50
+ /**
51
+ *
52
+ */
53
+ protected float focus;
54
+
55
+ /**
56
+ *
57
+ */
58
+ public Ellipse() {
59
+ this(0, 0, 1);
60
+
61
+ }
62
+
63
+ /**
64
+ *
65
+ * @param rx
66
+ * @param ry
67
+ */
68
+ public Ellipse(float rx, float ry) {
69
+ this(0, 0, rx, ry);
70
+ }
71
+
72
+ /**
73
+ *
74
+ * @param x
75
+ * @param y
76
+ * @param r
77
+ */
78
+ public Ellipse(float x, float y, float r) {
79
+ this(x, y, r, r);
80
+
81
+ }
82
+
83
+ /**
84
+ *
85
+ * @param x
86
+ * @param y
87
+ * @param rx
88
+ * @param ry
89
+ */
90
+ public Ellipse(float x, float y, float rx, float ry) {
91
+ super(x, y);
92
+ setRadii(rx, ry);
93
+ }
94
+
95
+ /**
96
+ *
97
+ * @param v
98
+ * @param r
99
+ */
100
+ public Ellipse(ReadonlyVec2D v, float r) {
101
+ this(v.x(), v.y(), r, r);
102
+ }
103
+
104
+ /**
105
+ *
106
+ * @param v
107
+ * @param r
108
+ */
109
+ public Ellipse(ReadonlyVec2D v, ReadonlyVec2D r) {
110
+ this(v.x(), v.y(), r.x(), r.y());
111
+ }
112
+
113
+ @Override
114
+ public boolean containsPoint(ReadonlyVec2D p) {
115
+ Vec2D[] foci = getFoci();
116
+ return p.distanceTo(foci[0]) + p.distanceTo(foci[1]) < 2 * MathUtils
117
+ .max(radius.x, radius.y);
118
+ }
119
+
120
+ /**
121
+ * Computes the area covered by the ellipse.
122
+ *
123
+ * @return area
124
+ */
125
+ @Override
126
+ public float getArea() {
127
+ return MathUtils.PI * radius.x * radius.y;
128
+ }
129
+
130
+ @Override
131
+ public Circle getBoundingCircle() {
132
+ return new Circle(x, y, MathUtils.max(radius.x, radius.y));
133
+ }
134
+
135
+ /**
136
+ * Returns the ellipse's bounding rect.
137
+ *
138
+ * @return bounding rect
139
+ * @see toxi.geom.Shape2D#getBounds()
140
+ */
141
+ @Override
142
+ public Rect getBounds() {
143
+ return new Rect(sub(radius), add(radius));
144
+ }
145
+
146
+ /**
147
+ * Computes the approximate circumference of the ellipse, using this
148
+ * equation: <code>2 * PI * sqrt(1/2 * (rx*rx+ry*ry))</code>.
149
+ *
150
+ * The precise value is an infinite series elliptical integral, but the
151
+ * approximation comes sufficiently close. See Wikipedia for more details:
152
+ *
153
+ * http://en.wikipedia.org/wiki/Ellipse
154
+ *
155
+ * @return circumference
156
+ */
157
+ @Override
158
+ public float getCircumference() {
159
+ // wikipedia solution:
160
+ // return (float) (MathUtils.PI * (3 * (radius.x + radius.y) - Math
161
+ // .sqrt((3 * radius.x + radius.y) * (radius.x + 3 * radius.y))));
162
+ return (float) Math.sqrt(0.5 * radius.magSquared()) * MathUtils.TWO_PI;
163
+ }
164
+
165
+ @Override
166
+ public List<Line2D> getEdges() {
167
+ return toPolygon2D().getEdges();
168
+ }
169
+
170
+ /**
171
+ * @return the focus
172
+ */
173
+ public Vec2D[] getFoci() {
174
+ Vec2D[] foci = new Vec2D[2];
175
+ if (radius.x > radius.y) {
176
+ foci[0] = sub(focus, 0);
177
+ foci[1] = add(focus, 0);
178
+ } else {
179
+ foci[0] = sub(0, focus);
180
+ foci[1] = add(0, focus);
181
+ }
182
+ return foci;
183
+ }
184
+
185
+ /**
186
+ * @return the 2 radii of the ellipse as a Vec2D
187
+ */
188
+ public Vec2D getRadii() {
189
+ return radius.copy();
190
+ }
191
+
192
+ /**
193
+ * Creates a random point within the ellipse using a
194
+ * {@link BiasedFloatRange} to create a more uniform distribution.
195
+ *
196
+ * @return Vec2D
197
+ */
198
+ @Override
199
+ public Vec2D getRandomPoint() {
200
+ float theta = MathUtils.random(MathUtils.TWO_PI);
201
+ BiasedFloatRange rnd = new BiasedFloatRange(0f, 1f, 1f, MathUtils.SQRT2);
202
+ return Vec2D.fromTheta(theta).scaleSelf(radius.scale(rnd.pickRandom()))
203
+ .addSelf(this);
204
+ }
205
+
206
+ /**
207
+ * Sets the radii of the ellipse to the new values.
208
+ *
209
+ * @param rx
210
+ * @param ry
211
+ * @return itself
212
+ */
213
+ public final Ellipse setRadii(float rx, float ry) {
214
+ radius.set(rx, ry);
215
+ focus = radius.magnitude();
216
+ return this;
217
+ }
218
+
219
+ /**
220
+ * Sets the radii of the ellipse to the values given by the vector.
221
+ *
222
+ * @param r
223
+ * @return itself
224
+ */
225
+ public Ellipse setRadii(ReadonlyVec3D r) {
226
+ return setRadii(r.x(), r.y());
227
+ }
228
+
229
+ @Override
230
+ public Polygon2D toPolygon2D() {
231
+ return toPolygon2D(DEFAULT_RES);
232
+ }
233
+
234
+ /**
235
+ * Creates a {@link Polygon2D} instance of the ellipse sampling it at the
236
+ * given resolution.
237
+ *
238
+ * @param res
239
+ * number of steps
240
+ * @return ellipse as polygon
241
+ */
242
+ public Polygon2D toPolygon2D(int res) {
243
+ Polygon2D poly = new Polygon2D();
244
+ float step = MathUtils.TWO_PI / res;
245
+ for (int i = 0; i < res; i++) {
246
+ poly.add(Vec2D.fromTheta(i * step).scaleSelf(radius).addSelf(this));
247
+ }
248
+ return poly;
249
+ }
250
+ }