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,105 @@
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.MathUtils;
31
+
32
+ /**
33
+ *
34
+ * @author tux
35
+ */
36
+ public class TriangleIntersector implements Intersector3D {
37
+
38
+ /**
39
+ *
40
+ */
41
+ public Triangle3D triangle;
42
+ private IsectData3D isectData;
43
+
44
+ /**
45
+ *
46
+ */
47
+ public TriangleIntersector() {
48
+ this(new Triangle3D());
49
+ }
50
+
51
+ /**
52
+ *
53
+ * @param t
54
+ */
55
+ public TriangleIntersector(Triangle3D t) {
56
+ this.triangle = t;
57
+ this.isectData = new IsectData3D();
58
+ }
59
+
60
+ @Override
61
+ public IsectData3D getIntersectionData() {
62
+ return isectData;
63
+ }
64
+
65
+ /**
66
+ * @return the triangle
67
+ */
68
+ public Triangle3D getTriangle() {
69
+ return triangle;
70
+ }
71
+
72
+ @Override
73
+ public boolean intersectsRay(Ray3D ray) {
74
+ isectData.isIntersection = false;
75
+ Vec3D n = triangle.computeNormal();
76
+ float dotprod = n.dot(ray.dir);
77
+ if (dotprod < 0) {
78
+ Vec3D rt = ray.sub(triangle.a);
79
+ double t = -(double) (n.x * rt.x + n.y * rt.y + n.z * rt.z)
80
+ / (n.x * ray.dir.x + n.y * ray.dir.y + n.z * ray.dir.z);
81
+ if (t >= MathUtils.EPS) {
82
+ Vec3D pos = ray.getPointAtDistance((float) t);
83
+ // check if pos is inside triangle
84
+ if (triangle.containsPoint(pos)) {
85
+ isectData.isIntersection = true;
86
+ isectData.pos = pos;
87
+ isectData.normal = n;
88
+ isectData.dist = (float) t;
89
+ isectData.dir = isectData.pos.sub(ray).normalize();
90
+ }
91
+ }
92
+ }
93
+ return isectData.isIntersection;
94
+ }
95
+
96
+ /**
97
+ * @param tri
98
+ * the triangle to set
99
+ * @return
100
+ */
101
+ public TriangleIntersector setTriangle(Triangle3D tri) {
102
+ this.triangle = tri;
103
+ return this;
104
+ }
105
+ }
@@ -0,0 +1,1328 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+ package toxi.geom;
28
+
29
+ import java.util.Random;
30
+
31
+ import javax.xml.bind.annotation.XmlAttribute;
32
+
33
+ import toxi.math.InterpolateStrategy;
34
+ import toxi.math.MathUtils;
35
+ import toxi.math.ScaleMap;
36
+
37
+ /**
38
+ * Comprehensive 2D vector class with additional basic intersection and
39
+ * collision detection features.
40
+ */
41
+ public class Vec2D implements Comparable<ReadonlyVec2D>, ReadonlyVec2D {
42
+
43
+ /**
44
+ *
45
+ */
46
+ public static enum Axis {
47
+
48
+ /**
49
+ *
50
+ */
51
+ X(Vec2D.X_AXIS),
52
+
53
+ /**
54
+ *
55
+ */
56
+ Y(Vec2D.Y_AXIS);
57
+
58
+ private final ReadonlyVec2D vector;
59
+
60
+ private Axis(ReadonlyVec2D v) {
61
+ this.vector = v;
62
+ }
63
+
64
+ /**
65
+ *
66
+ * @return
67
+ */
68
+ public ReadonlyVec2D getVector() {
69
+ return vector;
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Defines positive X axis
75
+ */
76
+ public static final ReadonlyVec2D X_AXIS = new Vec2D(1, 0);
77
+
78
+ /**
79
+ * Defines positive Y axis
80
+ */
81
+ public static final ReadonlyVec2D Y_AXIS = new Vec2D(0, 1);
82
+ ;
83
+
84
+ /** Defines the zero vector. */
85
+ public static final ReadonlyVec2D ZERO = new Vec2D();
86
+
87
+ /**
88
+ * Defines vector with both coords set to Float.MIN_VALUE. Useful for
89
+ * bounding box operations.
90
+ */
91
+ public static final ReadonlyVec2D MIN_VALUE = new Vec2D(Float.MIN_VALUE,
92
+ Float.MIN_VALUE);
93
+
94
+ /**
95
+ * Defines vector with both coords set to Float.MAX_VALUE. Useful for
96
+ * bounding box operations.
97
+ */
98
+ public static final ReadonlyVec2D MAX_VALUE = new Vec2D(Float.MAX_VALUE,
99
+ Float.MAX_VALUE);
100
+
101
+ /**
102
+ *
103
+ */
104
+ public static final ReadonlyVec2D NEG_MAX_VALUE = new Vec2D(
105
+ -Float.MAX_VALUE, -Float.MAX_VALUE);
106
+
107
+ /**
108
+ * Creates a new vector from the given angle in the XY plane.
109
+ *
110
+ * The resulting vector for theta=0 is equal to the positive X axis.
111
+ *
112
+ * @param theta
113
+ * @return new vector pointing into the direction of the passed in angle
114
+ */
115
+ public static final Vec2D fromTheta(float theta) {
116
+ return new Vec2D((float) Math.cos(theta), (float) Math.sin(theta));
117
+ }
118
+
119
+ /**
120
+ * Constructs a new vector consisting of the largest components of both
121
+ * vectors.
122
+ *
123
+ * @param b the b
124
+ * @param a the a
125
+ *
126
+ * @return result as new vector
127
+ */
128
+ public static final Vec2D max(ReadonlyVec2D a, ReadonlyVec2D b) {
129
+ return new Vec2D(MathUtils.max(a.x(), b.x()), MathUtils.max(a.y(),
130
+ b.y()));
131
+ }
132
+
133
+ /**
134
+ * Constructs a new vector consisting of the smallest components of both
135
+ * vectors.
136
+ *
137
+ * @param b comparing vector
138
+ * @param a the a
139
+ *
140
+ * @return result as new vector
141
+ */
142
+ public static final Vec2D min(ReadonlyVec2D a, ReadonlyVec2D b) {
143
+ return new Vec2D(MathUtils.min(a.x(), b.x()), MathUtils.min(a.y(),
144
+ b.y()));
145
+ }
146
+
147
+ /**
148
+ * Static factory method. Creates a new random unit vector using the Random
149
+ * implementation set as default for the {@link MathUtils} class.
150
+ *
151
+ * @return a new random normalized unit vector.
152
+ */
153
+ public static final Vec2D randomVector() {
154
+ return randomVector(MathUtils.RND);
155
+ }
156
+
157
+ /**
158
+ * Static factory method. Creates a new random unit vector using the given
159
+ * Random generator instance. I recommend to have a look at the
160
+ * https://uncommons-maths.dev.java.net library for a good choice of
161
+ * reliable and high quality random number generators.
162
+ *
163
+ * @param rnd
164
+ * @return a new random normalized unit vector.
165
+ */
166
+ public static final Vec2D randomVector(Random rnd) {
167
+ Vec2D v = new Vec2D(rnd.nextFloat() * 2 - 1, rnd.nextFloat() * 2 - 1);
168
+ return v.normalize();
169
+ }
170
+
171
+ /**
172
+ * X coordinate
173
+ */
174
+ @XmlAttribute(required = true)
175
+ public float x;
176
+
177
+ /**
178
+ * Y coordinate
179
+ */
180
+ @XmlAttribute(required = true)
181
+ public float y;
182
+
183
+ /**
184
+ * Creates a new zero vector
185
+ */
186
+ public Vec2D() {
187
+ x = y = 0;
188
+ }
189
+
190
+ /**
191
+ * Creates a new vector with the given coordinates
192
+ *
193
+ * @param x
194
+ * @param y
195
+ */
196
+ public Vec2D(float x, float y) {
197
+ this.x = x;
198
+ this.y = y;
199
+ }
200
+
201
+ /**
202
+ *
203
+ * @param v
204
+ */
205
+ public Vec2D(float[] v) {
206
+ this.x = v[0];
207
+ this.y = v[1];
208
+ }
209
+
210
+ /**
211
+ * Creates a new vector with the coordinates of the given vector
212
+ *
213
+ * @param v vector to be copied
214
+ */
215
+ public Vec2D(ReadonlyVec2D v) {
216
+ this.x = v.x();
217
+ this.y = v.y();
218
+ }
219
+
220
+ /**
221
+ *
222
+ * @return
223
+ */
224
+ public final Vec2D abs() {
225
+ x = MathUtils.abs(x);
226
+ y = MathUtils.abs(y);
227
+ return this;
228
+ }
229
+
230
+ @Override
231
+ public final Vec2D add(float a, float b) {
232
+ return new Vec2D(x + a, y + b);
233
+ }
234
+
235
+ @Override
236
+ public Vec2D add(ReadonlyVec2D v) {
237
+ return new Vec2D(x + v.x(), y + v.y());
238
+ }
239
+
240
+ /**
241
+ *
242
+ * @param v
243
+ * @return
244
+ */
245
+ public final Vec2D add(Vec2D v) {
246
+ return new Vec2D(x + v.x, y + v.y);
247
+ }
248
+
249
+ /**
250
+ * Adds vector {a,b,c} and overrides coordinates with result.
251
+ *
252
+ * @param a X coordinate
253
+ * @param b Y coordinate
254
+ * @return itself
255
+ */
256
+ public final Vec2D addSelf(float a, float b) {
257
+ x += a;
258
+ y += b;
259
+ return this;
260
+ }
261
+
262
+ /**
263
+ * Adds vector v and overrides coordinates with result.
264
+ *
265
+ * @param v vector to add
266
+ * @return itself
267
+ */
268
+ public final Vec2D addSelf(Vec2D v) {
269
+ x += v.x;
270
+ y += v.y;
271
+ return this;
272
+ }
273
+
274
+ @Override
275
+ public final float angleBetween(ReadonlyVec2D v) {
276
+ return (float) Math.acos(dot(v));
277
+ }
278
+
279
+ @Override
280
+ public final float angleBetween(ReadonlyVec2D v, boolean forceNormalize) {
281
+ float theta;
282
+ if (forceNormalize) {
283
+ theta = getNormalized().dot(v.getNormalized());
284
+ } else {
285
+ theta = dot(v);
286
+ }
287
+ return (float) Math.acos(MathUtils.clipNormalized(theta));
288
+ }
289
+
290
+ @Override
291
+ public Vec3D bisect(Vec2D b) {
292
+ Vec2D diff = this.sub(b);
293
+ Vec2D sum = this.add(b);
294
+ float dot = diff.dot(sum);
295
+ return new Vec3D(diff.x, diff.y, -dot / 2);
296
+ }
297
+
298
+ /**
299
+ * Sets all vector components to 0.
300
+ *
301
+ * @return itself
302
+ */
303
+ public final Vec2D clear() {
304
+ x = y = 0;
305
+ return this;
306
+ }
307
+
308
+ @Override
309
+ public int compareTo(ReadonlyVec2D o) {
310
+ if (this.equals(o)) {
311
+ return 0;
312
+ }
313
+ int result = (this.magSquared() < o.magSquared()) ? -1 : 1;
314
+ return result;
315
+ }
316
+
317
+ /**
318
+ * Constraints this vector to the perimeter of the given polygon. Unlike the
319
+ * {@link #constrain(Rect)} version of this method, this version DOES NOT
320
+ * check containment automatically. If you want to only constrain a point if
321
+ * its (for example) outside the polygon, then check containment with
322
+ * {@link Polygon2D#containsPoint(ReadonlyVec2D)} first before calling this
323
+ * method.
324
+ *
325
+ * @param poly
326
+ * @return itself
327
+ */
328
+ public Vec2D constrain(Polygon2D poly) {
329
+ float minD = Float.MAX_VALUE;
330
+ Vec2D q = null;
331
+ for (Line2D l : poly.getEdges()) {
332
+ Vec2D c = l.closestPointTo(this);
333
+ float d = c.distanceToSquared(this);
334
+ if (d < minD) {
335
+ q = c;
336
+ minD = d;
337
+ }
338
+ }
339
+ if (q != null) {
340
+ x = q.x;
341
+ y = q.y;
342
+ }
343
+ return this;
344
+ }
345
+
346
+ /**
347
+ * Forcefully fits the vector in the given rectangle.
348
+ *
349
+ * @param r
350
+ * @return itself
351
+ */
352
+ public Vec2D constrain(Rect r) {
353
+ x = MathUtils.clip(x, r.x, r.x + r.width);
354
+ y = MathUtils.clip(y, r.y, r.y + r.height);
355
+ return this;
356
+ }
357
+
358
+ /**
359
+ * Forcefully fits the vector in the given rectangle defined by the points.
360
+ *
361
+ * @param min
362
+ * @param max
363
+ * @return itself
364
+ */
365
+ public Vec2D constrain(Vec2D min, Vec2D max) {
366
+ x = MathUtils.clip(x, min.x, max.x);
367
+ y = MathUtils.clip(y, min.y, max.y);
368
+ return this;
369
+ }
370
+
371
+ @Override
372
+ public final Vec2D copy() {
373
+ return new Vec2D(this);
374
+ }
375
+
376
+ @Override
377
+ public float cross(ReadonlyVec2D v) {
378
+ return (x * v.y()) - (y * v.x());
379
+ }
380
+
381
+ @Override
382
+ public final float distanceTo(ReadonlyVec2D v) {
383
+ if (v != null) {
384
+ float dx = x - v.x();
385
+ float dy = y - v.y();
386
+ return (float) Math.sqrt(dx * dx + dy * dy);
387
+ } else {
388
+ return Float.NaN;
389
+ }
390
+ }
391
+
392
+ @Override
393
+ public final float distanceToSquared(ReadonlyVec2D v) {
394
+ if (v != null) {
395
+ float dx = x - v.x();
396
+ float dy = y - v.y();
397
+ return dx * dx + dy * dy;
398
+ } else {
399
+ return Float.NaN;
400
+ }
401
+ }
402
+
403
+ @Override
404
+ public final float dot(ReadonlyVec2D v) {
405
+ return x * v.x() + y * v.y();
406
+ }
407
+
408
+ /**
409
+ * Returns true if the Object v is of type ReadonlyVec2D and all of the data
410
+ * members of v are equal to the corresponding data members in this vector.
411
+ *
412
+ * @param obj the object with which the comparison is made
413
+ * @return true or false
414
+ */
415
+
416
+ @Override
417
+ public boolean equals(Object obj) {
418
+ if (obj instanceof ReadonlyVec2D) {
419
+ final ReadonlyVec2D other = (ReadonlyVec2D) obj;
420
+ if (!((Float) x).equals(other.x())) {
421
+ return false;
422
+ }
423
+ return ((Float) y).equals(other.y());
424
+ }
425
+ return false;
426
+ }
427
+
428
+ /**
429
+ * Returns a hash code value based on the data values in this object. Two
430
+ * different Vec2D objects with identical data values (i.e., Vec2D.equals
431
+ * returns true) will return the same hash code value. Two objects with
432
+ * different data members may return the same hash value, although this is
433
+ * not likely.
434
+ *
435
+ * @return the hash code value of this vector.
436
+ */
437
+
438
+ @Override
439
+ public int hashCode() {
440
+ int hash = 7;
441
+ hash = 97 * hash + Float.floatToIntBits(this.x);
442
+ hash = 97 * hash + Float.floatToIntBits(this.y);
443
+ return hash;
444
+ }
445
+
446
+ /**
447
+ * Returns true if all of the data members of ReadonlyVec2D v are equal to
448
+ * the corresponding data members in this vector.
449
+ *
450
+ * @param v the vector with which the comparison is made
451
+ * @return true or false
452
+ */
453
+ public boolean equals(ReadonlyVec2D v) {
454
+ final ReadonlyVec2D other = (ReadonlyVec2D) v;
455
+ if (!((Float) x).equals(other.x())) {
456
+ return false;
457
+ }
458
+ return ((Float) y).equals(other.y());
459
+ }
460
+
461
+ @Override
462
+ public boolean equalsWithTolerance(ReadonlyVec2D v, float tolerance) {
463
+ if (v instanceof ReadonlyVec2D){
464
+ float diff = x - v.x();
465
+ if (Float.isNaN(diff)) {
466
+ return false;
467
+ }
468
+ if ((diff < 0 ? -diff : diff) > tolerance) {
469
+ return false;
470
+ }
471
+ diff = y - v.y();
472
+ if (Float.isNaN(diff)) {
473
+ return false;
474
+ }
475
+ return ((diff < 0 ? -diff : diff) < tolerance);
476
+ }
477
+ return false;
478
+ }
479
+
480
+ /**
481
+ * Replaces the vector components with integer values of their current
482
+ * values
483
+ *
484
+ * @return itself
485
+ */
486
+ public final Vec2D floor() {
487
+ x = MathUtils.floor(x);
488
+ y = MathUtils.floor(y);
489
+ return this;
490
+ }
491
+
492
+ /**
493
+ * Replaces the vector components with the fractional part of their current
494
+ * values
495
+ *
496
+ * @return itself
497
+ */
498
+ public final Vec2D frac() {
499
+ x -= MathUtils.floor(x);
500
+ y -= MathUtils.floor(y);
501
+ return this;
502
+ }
503
+
504
+ /**
505
+ *
506
+ * @return
507
+ */
508
+ @Override
509
+ public final Vec2D getAbs() {
510
+ return new Vec2D(this).abs();
511
+ }
512
+
513
+ @Override
514
+ public Vec2D getCartesian() {
515
+ return copy().toCartesian();
516
+ }
517
+
518
+ /**
519
+ *
520
+ * @param id
521
+ * @return
522
+ */
523
+ @Override
524
+ public float getComponent(Axis id) {
525
+ switch (id) {
526
+ case X:
527
+ return x;
528
+ case Y:
529
+ return y;
530
+ }
531
+ return 0;
532
+ }
533
+
534
+ /**
535
+ *
536
+ * @param id
537
+ * @return
538
+ */
539
+ @Override
540
+ public final float getComponent(int id) {
541
+ switch (id) {
542
+ case 0:
543
+ return x;
544
+ case 1:
545
+ return y;
546
+ }
547
+ throw new IllegalArgumentException("index must be 0 or 1");
548
+ }
549
+
550
+ /**
551
+ *
552
+ * @param poly
553
+ * @return
554
+ */
555
+ public final Vec2D getConstrained(Polygon2D poly) {
556
+ return new Vec2D(this).constrain(poly);
557
+ }
558
+
559
+ @Override
560
+ public final Vec2D getConstrained(Rect r) {
561
+ return new Vec2D(this).constrain(r);
562
+ }
563
+
564
+ @Override
565
+ public final Vec2D getFloored() {
566
+ return new Vec2D(this).floor();
567
+ }
568
+
569
+ @Override
570
+ public final Vec2D getFrac() {
571
+ return new Vec2D(this).frac();
572
+ }
573
+
574
+ @Override
575
+ public final Vec2D getInverted() {
576
+ return new Vec2D(-x, -y);
577
+ }
578
+
579
+ @Override
580
+ public final Vec2D getLimited(float lim) {
581
+ if (magSquared() > lim * lim) {
582
+ return getNormalizedTo(lim);
583
+ }
584
+ return new Vec2D(this);
585
+ }
586
+
587
+ @Override
588
+ public Vec2D getMapped(ScaleMap map) {
589
+ return new Vec2D((float) map.getClippedValueFor(x),
590
+ (float) map.getClippedValueFor(y));
591
+ }
592
+
593
+ @Override
594
+ public final Vec2D getNormalized() {
595
+ return new Vec2D(this).normalize();
596
+ }
597
+
598
+ @Override
599
+ public final Vec2D getNormalizedTo(float len) {
600
+ return new Vec2D(this).normalizeTo(len);
601
+ }
602
+
603
+ /**
604
+ *
605
+ * @return
606
+ */
607
+ @Override
608
+ public final Vec2D getPerpendicular() {
609
+ return new Vec2D(this).perpendicular();
610
+ }
611
+
612
+ @Override
613
+ public Vec2D getPolar() {
614
+ return copy().toPolar();
615
+ }
616
+
617
+ /**
618
+ *
619
+ * @return
620
+ */
621
+ @Override
622
+ public final Vec2D getReciprocal() {
623
+ return copy().reciprocal();
624
+ }
625
+
626
+ /**
627
+ *
628
+ * @param normal
629
+ * @return
630
+ */
631
+ @Override
632
+ public final Vec2D getReflected(ReadonlyVec2D normal) {
633
+ return copy().reflect(normal);
634
+ }
635
+
636
+ @Override
637
+ public final Vec2D getRotated(float theta) {
638
+ return new Vec2D(this).rotate(theta);
639
+ }
640
+
641
+ @Override
642
+ public Vec2D getRoundedTo(float prec) {
643
+ return copy().roundTo(prec);
644
+ }
645
+
646
+ @Override
647
+ public Vec2D getSignum() {
648
+ return new Vec2D(this).signum();
649
+ }
650
+
651
+ @Override
652
+ public final float heading() {
653
+ return (float) Math.atan2(y, x);
654
+ }
655
+
656
+ @Override
657
+ public Vec2D interpolateTo(ReadonlyVec2D v, float f) {
658
+ return new Vec2D(x + (v.x() - x) * f, y + (v.y() - y) * f);
659
+ }
660
+
661
+ @Override
662
+ public Vec2D interpolateTo(ReadonlyVec2D v, float f, InterpolateStrategy s) {
663
+ return new Vec2D(s.interpolate(x, v.x(), f), s.interpolate(y, v.y(), f));
664
+ }
665
+
666
+ /**
667
+ *
668
+ * @param v
669
+ * @param f
670
+ * @return
671
+ */
672
+ public final Vec2D interpolateTo(Vec2D v, float f) {
673
+ return new Vec2D(x + (v.x - x) * f, y + (v.y - y) * f);
674
+ }
675
+
676
+ /**
677
+ *
678
+ * @param v
679
+ * @param f
680
+ * @param s
681
+ * @return
682
+ */
683
+ public Vec2D interpolateTo(Vec2D v, float f, InterpolateStrategy s) {
684
+ return new Vec2D(s.interpolate(x, v.x, f), s.interpolate(y, v.y, f));
685
+ }
686
+
687
+ /**
688
+ * Interpolates the vector towards the given target vector, using linear
689
+ * interpolation
690
+ *
691
+ * @param v target vector
692
+ * @param f interpolation factor (should be in the range 0..1)
693
+ * @return itself, result overrides current vector
694
+ */
695
+ public final Vec2D interpolateToSelf(ReadonlyVec2D v, float f) {
696
+ x += (v.x() - x) * f;
697
+ y += (v.y() - y) * f;
698
+ return this;
699
+ }
700
+
701
+ /**
702
+ * Interpolates the vector towards the given target vector, using the given
703
+ * {@link InterpolateStrategy}
704
+ *
705
+ * @param v target vector
706
+ * @param f interpolation factor (should be in the range 0..1)
707
+ * @param s InterpolateStrategy instance
708
+ * @return itself, result overrides current vector
709
+ */
710
+ public Vec2D interpolateToSelf(ReadonlyVec2D v, float f,
711
+ InterpolateStrategy s) {
712
+ x = s.interpolate(x, v.x(), f);
713
+ y = s.interpolate(y, v.y(), f);
714
+ return this;
715
+ }
716
+
717
+ /**
718
+ * Scales vector uniformly by factor -1 ( v = -v ), overrides coordinates
719
+ * with result
720
+ *
721
+ * @return itself
722
+ */
723
+ public final Vec2D invert() {
724
+ x *= -1;
725
+ y *= -1;
726
+ return this;
727
+ }
728
+
729
+ @Override
730
+ public boolean isInCircle(ReadonlyVec2D sO, float sR) {
731
+ float d = sub(sO).magSquared();
732
+ return (d <= sR * sR);
733
+ }
734
+
735
+ /**
736
+ * Simplified
737
+ * @param r
738
+ * @return
739
+ */
740
+
741
+ @Override
742
+ public boolean isInRectangle(Rect r) {
743
+ if (x < r.x || x > r.x + r.width) {
744
+ return false;
745
+ }
746
+ return (y >= r.y || y <= r.y + r.height);
747
+ }
748
+
749
+ @Override
750
+ public boolean isInTriangle(Vec2D a, Vec2D b, Vec2D c) {
751
+ Vec2D v1 = sub(a).normalize();
752
+ Vec2D v2 = sub(b).normalize();
753
+ Vec2D v3 = sub(c).normalize();
754
+
755
+ double total_angles = Math.acos(v1.dot(v2));
756
+ total_angles += Math.acos(v2.dot(v3));
757
+ total_angles += Math.acos(v3.dot(v1));
758
+
759
+ return (MathUtils.abs((float) total_angles - MathUtils.TWO_PI) <= 0.005f);
760
+ }
761
+
762
+ @Override
763
+ public final boolean isMajorAxis(float tol) {
764
+ float ax = MathUtils.abs(x);
765
+ float ay = MathUtils.abs(y);
766
+ float itol = 1 - tol;
767
+ if (ax > itol) {
768
+ return (ay < tol);
769
+ } else if (ay > itol) {
770
+ return (ax < tol);
771
+ }
772
+ return false;
773
+ }
774
+
775
+ @Override
776
+ public final boolean isZeroVector() {
777
+ return MathUtils.abs(x) < MathUtils.EPS
778
+ && MathUtils.abs(y) < MathUtils.EPS;
779
+ }
780
+
781
+ /**
782
+ *
783
+ * @param j
784
+ * @return
785
+ */
786
+ public final Vec2D jitter(float j) {
787
+ return jitter(j, j);
788
+ }
789
+
790
+ /**
791
+ * Adds random jitter to the vector in the range -j ... +j using the default
792
+ * {@link Random} generator of {@link MathUtils}.
793
+ *
794
+ * @param jx maximum x jitter
795
+ * @param jy maximum y jitter
796
+ * @return itself
797
+ */
798
+ public final Vec2D jitter(float jx, float jy) {
799
+ x += MathUtils.normalizedRandom() * jx;
800
+ y += MathUtils.normalizedRandom() * jy;
801
+ return this;
802
+ }
803
+
804
+ /**
805
+ *
806
+ * @param rnd
807
+ * @param j
808
+ * @return
809
+ */
810
+ public final Vec2D jitter(Random rnd, float j) {
811
+ return jitter(rnd, j, j);
812
+ }
813
+
814
+ /**
815
+ *
816
+ * @param rnd
817
+ * @param jx
818
+ * @param jy
819
+ * @return
820
+ */
821
+ public final Vec2D jitter(Random rnd, float jx, float jy) {
822
+ x += MathUtils.normalizedRandom(rnd) * jx;
823
+ y += MathUtils.normalizedRandom(rnd) * jy;
824
+ return this;
825
+ }
826
+
827
+ /**
828
+ *
829
+ * @param rnd
830
+ * @param jv
831
+ * @return
832
+ */
833
+ public final Vec2D jitter(Random rnd, Vec2D jv) {
834
+ return jitter(rnd, jv.x, jv.y);
835
+ }
836
+
837
+ /**
838
+ *
839
+ * @param jv
840
+ * @return
841
+ */
842
+ public final Vec2D jitter(Vec2D jv) {
843
+ return jitter(jv.x, jv.y);
844
+ }
845
+
846
+ /**
847
+ * Limits the vector's magnitude to the length given
848
+ *
849
+ * @param lim new maximum magnitude
850
+ * @return itself
851
+ */
852
+ public final Vec2D limit(float lim) {
853
+ if (magSquared() > lim * lim) {
854
+ return normalize().scaleSelf(lim);
855
+ }
856
+ return this;
857
+ }
858
+
859
+ @Override
860
+ public final float magnitude() {
861
+ return (float) Math.sqrt(x * x + y * y);
862
+ }
863
+
864
+ @Override
865
+ public final float magSquared() {
866
+ return x * x + y * y;
867
+ }
868
+
869
+ @Override
870
+ public final Vec2D max(ReadonlyVec2D v) {
871
+ return new Vec2D(MathUtils.max(x, v.x()), MathUtils.max(y, v.y()));
872
+ }
873
+
874
+ /**
875
+ * Adjusts the vector components to the maximum values of both vectors
876
+ *
877
+ * @param v
878
+ * @return itself
879
+ */
880
+ public final Vec2D maxSelf(ReadonlyVec2D v) {
881
+ x = MathUtils.max(x, v.x());
882
+ y = MathUtils.max(y, v.y());
883
+ return this;
884
+ }
885
+
886
+ @Override
887
+ public final Vec2D min(ReadonlyVec2D v) {
888
+ return new Vec2D(MathUtils.min(x, v.x()), MathUtils.min(y, v.y()));
889
+ }
890
+
891
+ /**
892
+ * Adjusts the vector components to the minimum values of both vectors
893
+ *
894
+ * @param v
895
+ * @return itself
896
+ */
897
+ public final Vec2D minSelf(ReadonlyVec2D v) {
898
+ x = MathUtils.min(x, v.x());
899
+ y = MathUtils.min(y, v.y());
900
+ return this;
901
+ }
902
+
903
+ /**
904
+ * Normalizes the vector so that its magnitude = 1
905
+ *
906
+ * @return itself
907
+ */
908
+ public final Vec2D normalize() {
909
+ float mag = x * x + y * y;
910
+ if (mag > 0) {
911
+ mag = 1f / (float) Math.sqrt(mag);
912
+ x *= mag;
913
+ y *= mag;
914
+ }
915
+ return this;
916
+ }
917
+
918
+ /**
919
+ * Normalizes the vector to the given length.
920
+ *
921
+ * @param len desired length
922
+ * @return itself
923
+ */
924
+ public final Vec2D normalizeTo(float len) {
925
+ float mag = (float) Math.sqrt(x * x + y * y);
926
+ if (mag > 0) {
927
+ mag = len / mag;
928
+ x *= mag;
929
+ y *= mag;
930
+ }
931
+ return this;
932
+ }
933
+
934
+ /**
935
+ *
936
+ * @return
937
+ */
938
+ public final Vec2D perpendicular() {
939
+ float t = x;
940
+ x = -y;
941
+ y = t;
942
+ return this;
943
+ }
944
+
945
+ /**
946
+ *
947
+ * @return
948
+ */
949
+ public final float positiveHeading() {
950
+ double dist = Math.sqrt(x * x + y * y);
951
+ if (y >= 0) {
952
+ return (float) Math.acos(x / dist);
953
+ } else {
954
+ return (float) (Math.acos(-x / dist) + MathUtils.PI);
955
+ }
956
+ }
957
+
958
+ /**
959
+ *
960
+ * @return
961
+ */
962
+ public final Vec2D reciprocal() {
963
+ x = 1f / x;
964
+ y = 1f / y;
965
+ return this;
966
+ }
967
+
968
+ /**
969
+ *
970
+ * @param normal
971
+ * @return
972
+ */
973
+ public final Vec2D reflect(ReadonlyVec2D normal) {
974
+ return set(normal.scale(this.dot(normal) * 2).subSelf(this));
975
+ }
976
+
977
+ /**
978
+ * Rotates the vector by the given angle around the Z axis.
979
+ *
980
+ * @param theta
981
+ * @return itself
982
+ */
983
+ public final Vec2D rotate(float theta) {
984
+ float co = (float) Math.cos(theta);
985
+ float si = (float) Math.sin(theta);
986
+ float xx = co * x - si * y;
987
+ y = si * x + co * y;
988
+ x = xx;
989
+ return this;
990
+ }
991
+
992
+ /**
993
+ *
994
+ * @param prec
995
+ * @return
996
+ */
997
+ public Vec2D roundTo(float prec) {
998
+ x = MathUtils.roundTo(x, prec);
999
+ y = MathUtils.roundTo(y, prec);
1000
+ return this;
1001
+ }
1002
+
1003
+ @Override
1004
+ public final Vec2D scale(float s) {
1005
+ return new Vec2D(x * s, y * s);
1006
+ }
1007
+
1008
+ @Override
1009
+ public final Vec2D scale(float a, float b) {
1010
+ return new Vec2D(x * a, y * b);
1011
+ }
1012
+
1013
+ /**
1014
+ *
1015
+ * @param s
1016
+ * @return
1017
+ */
1018
+ @Override
1019
+ public final Vec2D scale(ReadonlyVec2D s) {
1020
+ return s.copy().scaleSelf(this);
1021
+ }
1022
+
1023
+ @Override
1024
+ public final Vec2D scale(Vec2D s) {
1025
+ return new Vec2D(x * s.x, y * s.y);
1026
+ }
1027
+
1028
+ /**
1029
+ * Scales vector uniformly and overrides coordinates with result
1030
+ *
1031
+ * @param s scale factor
1032
+ * @return itself
1033
+ */
1034
+ public final Vec2D scaleSelf(float s) {
1035
+ x *= s;
1036
+ y *= s;
1037
+ return this;
1038
+ }
1039
+
1040
+ /**
1041
+ * Scales vector non-uniformly by vector {a,b,c} and overrides coordinates
1042
+ * with result
1043
+ *
1044
+ * @param a scale factor for X coordinate
1045
+ * @param b scale factor for Y coordinate
1046
+ * @return itself
1047
+ */
1048
+ public final Vec2D scaleSelf(float a, float b) {
1049
+ x *= a;
1050
+ y *= b;
1051
+ return this;
1052
+ }
1053
+
1054
+ /**
1055
+ * Scales vector non-uniformly by vector v and overrides coordinates with
1056
+ * result
1057
+ *
1058
+ * @param s scale vector
1059
+ * @return itself
1060
+ */
1061
+ public final Vec2D scaleSelf(Vec2D s) {
1062
+ x *= s.x;
1063
+ y *= s.y;
1064
+ return this;
1065
+ }
1066
+
1067
+ /**
1068
+ * Overrides coordinates with the given values
1069
+ *
1070
+ * @param x
1071
+ * @param y
1072
+ * @return itself
1073
+ */
1074
+ public final Vec2D set(float x, float y) {
1075
+ this.x = x;
1076
+ this.y = y;
1077
+ return this;
1078
+ }
1079
+
1080
+ /**
1081
+ *
1082
+ * @param v
1083
+ * @return
1084
+ */
1085
+ public final Vec2D set(ReadonlyVec2D v) {
1086
+ x = v.x();
1087
+ y = v.y();
1088
+ return this;
1089
+ }
1090
+
1091
+ /**
1092
+ * Overrides coordinates with the ones of the given vector
1093
+ *
1094
+ * @param v vector to be copied
1095
+ * @return itself
1096
+ */
1097
+ public final Vec2D set(Vec2D v) {
1098
+ x = v.x;
1099
+ y = v.y;
1100
+ return this;
1101
+ }
1102
+
1103
+ /**
1104
+ *
1105
+ * @param id
1106
+ * @param val
1107
+ * @return
1108
+ */
1109
+ public final Vec2D setComponent(Axis id, float val) {
1110
+ switch (id) {
1111
+ case X:
1112
+ x = val;
1113
+ break;
1114
+ case Y:
1115
+ y = val;
1116
+ break;
1117
+ }
1118
+ return this;
1119
+ }
1120
+
1121
+ /**
1122
+ *
1123
+ * @param id
1124
+ * @param val
1125
+ * @return
1126
+ */
1127
+ public final Vec2D setComponent(int id, float val) {
1128
+ switch (id) {
1129
+ case 0:
1130
+ x = val;
1131
+ break;
1132
+ case 1:
1133
+ y = val;
1134
+ break;
1135
+ default:
1136
+ throw new IllegalArgumentException(
1137
+ "component id needs to be 0 or 1");
1138
+ }
1139
+ return this;
1140
+ }
1141
+
1142
+ /**
1143
+ *
1144
+ * @param x
1145
+ * @return
1146
+ */
1147
+ public Vec2D setX(float x) {
1148
+ this.x = x;
1149
+ return this;
1150
+ }
1151
+
1152
+ /**
1153
+ *
1154
+ * @param y
1155
+ * @return
1156
+ */
1157
+ public Vec2D setY(float y) {
1158
+ this.y = y;
1159
+ return this;
1160
+ }
1161
+
1162
+ /**
1163
+ * Replaces all vector components with the signum of their original values.
1164
+ * In other words if a components value was negative its new value will be
1165
+ * -1, if zero => 0, if positive => +1
1166
+ *
1167
+ * @return itself
1168
+ */
1169
+ public final Vec2D signum() {
1170
+ x = (x < 0 ? -1 : x == 0 ? 0 : 1);
1171
+ y = (y < 0 ? -1 : y == 0 ? 0 : 1);
1172
+ return this;
1173
+ }
1174
+
1175
+ /**
1176
+ * Rounds the vector to the closest major axis. Assumes the vector is
1177
+ * normalized.
1178
+ *
1179
+ * @return itself
1180
+ */
1181
+ public final Vec2D snapToAxis() {
1182
+ if (MathUtils.abs(x) < 0.5f) {
1183
+ x = 0;
1184
+ } else {
1185
+ x = x < 0 ? -1 : 1;
1186
+ y = 0;
1187
+ }
1188
+ if (MathUtils.abs(y) < 0.5f) {
1189
+ y = 0;
1190
+ } else {
1191
+ y = y < 0 ? -1 : 1;
1192
+ x = 0;
1193
+ }
1194
+ return this;
1195
+ }
1196
+
1197
+ @Override
1198
+ public final Vec2D sub(float a, float b) {
1199
+ return new Vec2D(x - a, y - b);
1200
+ }
1201
+
1202
+ /**
1203
+ *
1204
+ * @param v
1205
+ * @return
1206
+ */
1207
+ @Override
1208
+ public final Vec2D sub(ReadonlyVec2D v) {
1209
+ return new Vec2D(x - v.x(), y - v.y());
1210
+ }
1211
+
1212
+ @Override
1213
+ public final Vec2D sub(Vec2D v) {
1214
+ return new Vec2D(x - v.x, y - v.y);
1215
+ }
1216
+
1217
+ /**
1218
+ * Subtracts vector {a,b,c} and overrides coordinates with result.
1219
+ *
1220
+ * @param a X coordinate
1221
+ * @param b Y coordinate
1222
+ * @return itself
1223
+ */
1224
+ public final Vec2D subSelf(float a, float b) {
1225
+ x -= a;
1226
+ y -= b;
1227
+ return this;
1228
+ }
1229
+
1230
+ /**
1231
+ * Subtracts vector v and overrides coordinates with result.
1232
+ *
1233
+ * @param v vector to be subtracted
1234
+ * @return itself
1235
+ */
1236
+ public final Vec2D subSelf(Vec2D v) {
1237
+ x -= v.x;
1238
+ y -= v.y;
1239
+ return this;
1240
+ }
1241
+
1242
+ @Override
1243
+ public final Vec2D tangentNormalOfEllipse(Vec2D eO, Vec2D eR) {
1244
+ Vec2D p = this.sub(eO);
1245
+
1246
+ float xr2 = eR.x * eR.x;
1247
+ float yr2 = eR.y * eR.y;
1248
+
1249
+ return new Vec2D(p.x / xr2, p.y / yr2).normalize();
1250
+ }
1251
+
1252
+ @Override
1253
+ public final Vec3D to3DXY() {
1254
+ return new Vec3D(x, y, 0);
1255
+ }
1256
+
1257
+ @Override
1258
+ public final Vec3D to3DXZ() {
1259
+ return new Vec3D(x, 0, y);
1260
+ }
1261
+
1262
+ @Override
1263
+ public final Vec3D to3DYZ() {
1264
+ return new Vec3D(0, x, y);
1265
+ }
1266
+
1267
+ /**
1268
+ *
1269
+ * @return
1270
+ */
1271
+ @Override
1272
+ public float[] toArray() {
1273
+ return new float[]{
1274
+ x, y
1275
+ };
1276
+ }
1277
+
1278
+ /**
1279
+ *
1280
+ * @return
1281
+ */
1282
+ public final Vec2D toCartesian() {
1283
+ float xx = (float) (x * Math.cos(y));
1284
+ y = (float) (x * Math.sin(y));
1285
+ x = xx;
1286
+ return this;
1287
+ }
1288
+
1289
+ /**
1290
+ *
1291
+ * @return
1292
+ */
1293
+ public final Vec2D toPolar() {
1294
+ float r = (float) Math.sqrt(x * x + y * y);
1295
+ y = (float) Math.atan2(y, x);
1296
+ x = r;
1297
+ return this;
1298
+ }
1299
+
1300
+ /**
1301
+ *
1302
+ * @return
1303
+ */
1304
+ @Override
1305
+ public String toString() {
1306
+ StringBuilder sb = new StringBuilder(32);
1307
+ sb.append("{x:").append(x).append(", y:").append(y).append("}");
1308
+ return sb.toString();
1309
+ }
1310
+
1311
+ /**
1312
+ *
1313
+ * @return
1314
+ */
1315
+ @Override
1316
+ public final float x() {
1317
+ return x;
1318
+ }
1319
+
1320
+ /**
1321
+ *
1322
+ * @return
1323
+ */
1324
+ @Override
1325
+ public final float y() {
1326
+ return y;
1327
+ }
1328
+ }