toxiclibs 0.4.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (404) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +16 -0
  3. data/.mvn/extensions.xml +8 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +1 -0
  5. data/.travis.yml +23 -0
  6. data/CHANGELOG.md +7 -0
  7. data/COPYING.md +14 -0
  8. data/Gemfile +10 -0
  9. data/LICENSE +675 -0
  10. data/README.md +9 -7
  11. data/Rakefile +25 -81
  12. data/examples/README.md +5 -0
  13. data/examples/attract_repel/attract_repel.rb +30 -0
  14. data/examples/attract_repel/attractor.rb +23 -0
  15. data/examples/attract_repel/particle.rb +27 -0
  16. data/examples/data/ReplicaBold.ttf +0 -0
  17. data/examples/data/ti_yong.png +0 -0
  18. data/examples/force_directed/cluster.rb +76 -0
  19. data/examples/force_directed/force_directed_graph.rb +92 -0
  20. data/examples/force_directed/node.rb +26 -0
  21. data/examples/gray_scott_image.rb +74 -0
  22. data/examples/gray_scott_tone_map.rb +77 -0
  23. data/examples/implicit.rb +139 -0
  24. data/examples/inflate_mesh.rb +89 -0
  25. data/examples/model_align.rb +43 -0
  26. data/examples/physics_type.rb +77 -0
  27. data/examples/povmesh/data/mask.jpg +0 -0
  28. data/examples/povmesh/ftest.rb +59 -0
  29. data/examples/povmesh/mesh_align.rb +47 -0
  30. data/examples/povmesh/tentacle.rb +71 -0
  31. data/examples/simple_cluster/cluster.rb +47 -0
  32. data/examples/simple_cluster/node.rb +27 -0
  33. data/examples/simple_cluster/simple_cluster.rb +60 -0
  34. data/examples/soft_body/blanket.rb +45 -0
  35. data/examples/soft_body/connection.rb +16 -0
  36. data/examples/soft_body/particle.rb +22 -0
  37. data/examples/soft_body/soft_body_square_adapted.rb +55 -0
  38. data/examples/spherical_harmonics_mesh.rb +50 -0
  39. data/examples/test_rect.rb +32 -0
  40. data/lib/toxiclibs.jar +0 -0
  41. data/lib/toxiclibs.rb +72 -22
  42. data/lib/toxiclibs/version.rb +1 -1
  43. data/pom.rb +63 -0
  44. data/pom.xml +124 -0
  45. data/src/com/toxi/net/ClientListener.java +41 -0
  46. data/src/com/toxi/net/ServerListener.java +70 -0
  47. data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
  48. data/src/com/toxi/net/ServerState.java +18 -0
  49. data/src/com/toxi/net/UDPConnection.java +66 -0
  50. data/src/com/toxi/net/UDPSyncClient.java +81 -0
  51. data/src/com/toxi/net/UDPSyncServer.java +450 -0
  52. data/src/com/toxi/nio/UDPClient.java +121 -0
  53. data/src/com/toxi/nio/UDPClientState.java +32 -0
  54. data/src/com/toxi/nio/UDPServer.java +129 -0
  55. data/src/toxi/audio/AudioBuffer.java +229 -0
  56. data/src/toxi/audio/AudioSource.java +288 -0
  57. data/src/toxi/audio/DecompressInputStream.java +159 -0
  58. data/src/toxi/audio/IIRFilter.java +197 -0
  59. data/src/toxi/audio/JOALUtil.java +388 -0
  60. data/src/toxi/audio/MultiTimbralManager.java +162 -0
  61. data/src/toxi/audio/SoundListener.java +154 -0
  62. data/src/toxi/audio/SynthUtil.java +109 -0
  63. data/src/toxi/color/AccessCriteria.java +114 -0
  64. data/src/toxi/color/AlphaAccessor.java +67 -0
  65. data/src/toxi/color/CMYKAccessor.java +122 -0
  66. data/src/toxi/color/CMYKDistanceProxy.java +40 -0
  67. data/src/toxi/color/ColorGradient.java +260 -0
  68. data/src/toxi/color/ColorList.java +699 -0
  69. data/src/toxi/color/ColorRange.java +671 -0
  70. data/src/toxi/color/ColorTheme.java +163 -0
  71. data/src/toxi/color/DistanceProxy.java +44 -0
  72. data/src/toxi/color/HSVAccessor.java +113 -0
  73. data/src/toxi/color/HSVDistanceProxy.java +40 -0
  74. data/src/toxi/color/HistEntry.java +85 -0
  75. data/src/toxi/color/Histogram.java +185 -0
  76. data/src/toxi/color/Hue.java +249 -0
  77. data/src/toxi/color/LuminanceAccessor.java +78 -0
  78. data/src/toxi/color/NamedColor.java +935 -0
  79. data/src/toxi/color/ProximityComparator.java +70 -0
  80. data/src/toxi/color/RGBAccessor.java +113 -0
  81. data/src/toxi/color/RGBDistanceProxy.java +41 -0
  82. data/src/toxi/color/ReadonlyTColor.java +296 -0
  83. data/src/toxi/color/TColor.java +1677 -0
  84. data/src/toxi/color/TColorAdapter.java +68 -0
  85. data/src/toxi/color/ToneMap.java +218 -0
  86. data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
  87. data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
  88. data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
  89. data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
  90. data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
  91. data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
  92. data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
  93. data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
  94. data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
  95. data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
  96. data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
  97. data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
  98. data/src/toxi/data/csv/CSVAdapter.java +74 -0
  99. data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
  100. data/src/toxi/data/csv/CSVListener.java +61 -0
  101. data/src/toxi/data/csv/CSVParser.java +202 -0
  102. data/src/toxi/data/feeds/AtomAuthor.java +49 -0
  103. data/src/toxi/data/feeds/AtomContent.java +50 -0
  104. data/src/toxi/data/feeds/AtomEntry.java +111 -0
  105. data/src/toxi/data/feeds/AtomFeed.java +129 -0
  106. data/src/toxi/data/feeds/AtomLink.java +62 -0
  107. data/src/toxi/data/feeds/RSSChannel.java +88 -0
  108. data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
  109. data/src/toxi/data/feeds/RSSFeed.java +99 -0
  110. data/src/toxi/data/feeds/RSSItem.java +104 -0
  111. data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
  112. data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
  113. data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
  114. data/src/toxi/geom/AABB.java +658 -0
  115. data/src/toxi/geom/Axis3D.java +116 -0
  116. data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
  117. data/src/toxi/geom/BernsteinPolynomial.java +94 -0
  118. data/src/toxi/geom/BezierCurve2D.java +159 -0
  119. data/src/toxi/geom/BezierCurve3D.java +148 -0
  120. data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
  121. data/src/toxi/geom/BoxIntersector.java +52 -0
  122. data/src/toxi/geom/Circle.java +230 -0
  123. data/src/toxi/geom/CircleIntersector.java +85 -0
  124. data/src/toxi/geom/Cone.java +150 -0
  125. data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
  126. data/src/toxi/geom/CoordinateExtractor.java +16 -0
  127. data/src/toxi/geom/Ellipse.java +250 -0
  128. data/src/toxi/geom/GMatrix.java +2599 -0
  129. data/src/toxi/geom/GVector.java +833 -0
  130. data/src/toxi/geom/GlobalGridTesselator.java +54 -0
  131. data/src/toxi/geom/GridTesselator.java +108 -0
  132. data/src/toxi/geom/Intersector2D.java +49 -0
  133. data/src/toxi/geom/Intersector3D.java +51 -0
  134. data/src/toxi/geom/IsectData2D.java +103 -0
  135. data/src/toxi/geom/IsectData3D.java +103 -0
  136. data/src/toxi/geom/Line2D.java +534 -0
  137. data/src/toxi/geom/Line3D.java +471 -0
  138. data/src/toxi/geom/LineStrip2D.java +430 -0
  139. data/src/toxi/geom/LineStrip3D.java +230 -0
  140. data/src/toxi/geom/LocalGridTesselator.java +57 -0
  141. data/src/toxi/geom/Matrix3d.java +3048 -0
  142. data/src/toxi/geom/Matrix4f.java +3446 -0
  143. data/src/toxi/geom/Matrix4x4.java +1076 -0
  144. data/src/toxi/geom/MatrixSizeException.java +58 -0
  145. data/src/toxi/geom/OctreeVisitor.java +44 -0
  146. data/src/toxi/geom/Origin3D.java +148 -0
  147. data/src/toxi/geom/Plane.java +293 -0
  148. data/src/toxi/geom/PlaneIntersector.java +57 -0
  149. data/src/toxi/geom/PointCloud3D.java +253 -0
  150. data/src/toxi/geom/PointOctree.java +502 -0
  151. data/src/toxi/geom/PointQuadtree.java +375 -0
  152. data/src/toxi/geom/Polygon2D.java +1038 -0
  153. data/src/toxi/geom/PolygonClipper2D.java +45 -0
  154. data/src/toxi/geom/PolygonTesselator.java +20 -0
  155. data/src/toxi/geom/QuadtreeVisitor.java +44 -0
  156. data/src/toxi/geom/Quaternion.java +641 -0
  157. data/src/toxi/geom/Ray2D.java +146 -0
  158. data/src/toxi/geom/Ray3D.java +150 -0
  159. data/src/toxi/geom/Ray3DIntersector.java +75 -0
  160. data/src/toxi/geom/ReadonlyVec2D.java +575 -0
  161. data/src/toxi/geom/ReadonlyVec3D.java +628 -0
  162. data/src/toxi/geom/ReadonlyVec4D.java +431 -0
  163. data/src/toxi/geom/Rect.java +720 -0
  164. data/src/toxi/geom/Reflector3D.java +58 -0
  165. data/src/toxi/geom/Shape2D.java +94 -0
  166. data/src/toxi/geom/Shape3D.java +42 -0
  167. data/src/toxi/geom/SingularMatrixException.java +57 -0
  168. data/src/toxi/geom/SpatialBins.java +182 -0
  169. data/src/toxi/geom/SpatialIndex.java +61 -0
  170. data/src/toxi/geom/Sphere.java +224 -0
  171. data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
  172. data/src/toxi/geom/Spline2D.java +349 -0
  173. data/src/toxi/geom/Spline3D.java +351 -0
  174. data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
  175. data/src/toxi/geom/Triangle2D.java +422 -0
  176. data/src/toxi/geom/Triangle3D.java +456 -0
  177. data/src/toxi/geom/TriangleIntersector.java +105 -0
  178. data/src/toxi/geom/Vec2D.java +1328 -0
  179. data/src/toxi/geom/Vec3D.java +1832 -0
  180. data/src/toxi/geom/Vec4D.java +985 -0
  181. data/src/toxi/geom/VecMathUtil.java +100 -0
  182. data/src/toxi/geom/XAxisCylinder.java +64 -0
  183. data/src/toxi/geom/YAxisCylinder.java +65 -0
  184. data/src/toxi/geom/ZAxisCylinder.java +64 -0
  185. data/src/toxi/geom/mesh/BezierPatch.java +200 -0
  186. data/src/toxi/geom/mesh/BoxSelector.java +62 -0
  187. data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
  188. data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
  189. data/src/toxi/geom/mesh/Face.java +176 -0
  190. data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
  191. data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
  192. data/src/toxi/geom/mesh/Mesh3D.java +224 -0
  193. data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
  194. data/src/toxi/geom/mesh/OBJWriter.java +194 -0
  195. data/src/toxi/geom/mesh/PLYWriter.java +167 -0
  196. data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
  197. data/src/toxi/geom/mesh/STLColorModel.java +54 -0
  198. data/src/toxi/geom/mesh/STLReader.java +185 -0
  199. data/src/toxi/geom/mesh/STLWriter.java +323 -0
  200. data/src/toxi/geom/mesh/SphereFunction.java +156 -0
  201. data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
  202. data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
  203. data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
  204. data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
  205. data/src/toxi/geom/mesh/Terrain.java +451 -0
  206. data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
  207. data/src/toxi/geom/mesh/Vertex.java +78 -0
  208. data/src/toxi/geom/mesh/VertexSelector.java +193 -0
  209. data/src/toxi/geom/mesh/WEFace.java +100 -0
  210. data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
  211. data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
  212. data/src/toxi/geom/mesh/WEVertex.java +134 -0
  213. data/src/toxi/geom/mesh/WingedEdge.java +115 -0
  214. data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
  215. data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
  216. data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
  217. data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
  218. data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
  219. data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
  220. data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
  221. data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
  222. data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
  223. data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
  224. data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
  225. data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
  226. data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
  227. data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
  228. data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
  229. data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
  230. data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
  231. data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
  232. data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
  233. data/src/toxi/geom/nurbs/ControlNet.java +148 -0
  234. data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
  235. data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
  236. data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
  237. data/src/toxi/geom/nurbs/KnotVector.java +333 -0
  238. data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
  239. data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
  240. data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
  241. data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
  242. data/src/toxi/image/util/Filter8bit.java +331 -0
  243. data/src/toxi/image/util/TiledFrameExporter.java +162 -0
  244. data/src/toxi/math/BezierInterpolation.java +102 -0
  245. data/src/toxi/math/CircularInterpolation.java +88 -0
  246. data/src/toxi/math/CosineInterpolation.java +51 -0
  247. data/src/toxi/math/DecimatedInterpolation.java +77 -0
  248. data/src/toxi/math/ExponentialInterpolation.java +68 -0
  249. data/src/toxi/math/InterpolateStrategy.java +60 -0
  250. data/src/toxi/math/Interpolation2D.java +93 -0
  251. data/src/toxi/math/LinearInterpolation.java +46 -0
  252. data/src/toxi/math/MathUtils.java +990 -0
  253. data/src/toxi/math/NonLinearScaleMap.java +101 -0
  254. data/src/toxi/math/ScaleMap.java +183 -0
  255. data/src/toxi/math/SigmoidInterpolation.java +78 -0
  256. data/src/toxi/math/SinCosLUT.java +141 -0
  257. data/src/toxi/math/ThresholdInterpolation.java +58 -0
  258. data/src/toxi/math/ZoomLensInterpolation.java +126 -0
  259. data/src/toxi/math/conversion/UnitTranslator.java +161 -0
  260. data/src/toxi/math/noise/PerlinNoise.java +281 -0
  261. data/src/toxi/math/noise/SimplexNoise.java +542 -0
  262. data/src/toxi/math/waves/AMFMSineWave.java +143 -0
  263. data/src/toxi/math/waves/AbstractWave.java +248 -0
  264. data/src/toxi/math/waves/ConstantWave.java +48 -0
  265. data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
  266. data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
  267. data/src/toxi/math/waves/FMSineWave.java +142 -0
  268. data/src/toxi/math/waves/FMSquareWave.java +143 -0
  269. data/src/toxi/math/waves/FMTriangleWave.java +126 -0
  270. data/src/toxi/math/waves/SineWave.java +81 -0
  271. data/src/toxi/math/waves/Wave2D.java +68 -0
  272. data/src/toxi/math/waves/WaveState.java +69 -0
  273. data/src/toxi/music/scale/AbstractScale.java +117 -0
  274. data/src/toxi/music/scale/GenericScale.java +66 -0
  275. data/src/toxi/music/scale/MajorScale.java +41 -0
  276. data/src/toxi/newmesh/AttributedEdge.java +106 -0
  277. data/src/toxi/newmesh/AttributedFace.java +63 -0
  278. data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
  279. data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
  280. data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
  281. data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
  282. data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
  283. data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
  284. data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
  285. data/src/toxi/newmesh/SpatialIndex.java +78 -0
  286. data/src/toxi/physics2d/ParticlePath2D.java +100 -0
  287. data/src/toxi/physics2d/ParticleString2D.java +184 -0
  288. data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
  289. data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
  290. data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
  291. data/src/toxi/physics2d/VerletParticle2D.java +457 -0
  292. data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
  293. data/src/toxi/physics2d/VerletSpring2D.java +181 -0
  294. data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
  295. data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
  296. data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
  297. data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
  298. data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
  299. data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
  300. data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
  301. data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
  302. data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
  303. data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
  304. data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
  305. data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
  306. data/src/toxi/physics3d/ParticlePath3D.java +100 -0
  307. data/src/toxi/physics3d/ParticleString3D.java +184 -0
  308. data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
  309. data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
  310. data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
  311. data/src/toxi/physics3d/VerletParticle3D.java +385 -0
  312. data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
  313. data/src/toxi/physics3d/VerletSpring3D.java +180 -0
  314. data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
  315. data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
  316. data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
  317. data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
  318. data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
  319. data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
  320. data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
  321. data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
  322. data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
  323. data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
  324. data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
  325. data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
  326. data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
  327. data/src/toxi/processing/ArrowModifier.java +116 -0
  328. data/src/toxi/processing/DashedLineModifier.java +48 -0
  329. data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
  330. data/src/toxi/processing/Line2DRenderModifier.java +18 -0
  331. data/src/toxi/processing/MeshToVBO.java +127 -0
  332. data/src/toxi/processing/NormalMapper.java +18 -0
  333. data/src/toxi/processing/POVInterface.java +121 -0
  334. data/src/toxi/processing/POVMesh.java +219 -0
  335. data/src/toxi/processing/POVWriter.java +460 -0
  336. data/src/toxi/processing/RCOpaque.java +77 -0
  337. data/src/toxi/processing/RCTransp.java +78 -0
  338. data/src/toxi/processing/TextureBuilder.java +232 -0
  339. data/src/toxi/processing/Textures.java +110 -0
  340. data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
  341. data/src/toxi/processing/Tracing.java +25 -0
  342. data/src/toxi/processing/XYZNormalMapper.java +30 -0
  343. data/src/toxi/sim/automata/CAMatrix.java +297 -0
  344. data/src/toxi/sim/automata/CARule.java +76 -0
  345. data/src/toxi/sim/automata/CARule2D.java +354 -0
  346. data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
  347. data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
  348. data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
  349. data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
  350. data/src/toxi/sim/dla/DLA.java +497 -0
  351. data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
  352. data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
  353. data/src/toxi/sim/dla/DLAEventListener.java +57 -0
  354. data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
  355. data/src/toxi/sim/dla/DLAParticle.java +102 -0
  356. data/src/toxi/sim/dla/DLASegment.java +88 -0
  357. data/src/toxi/sim/dla/PipelineOrder.java +50 -0
  358. data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
  359. data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
  360. data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
  361. data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
  362. data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
  363. data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
  364. data/src/toxi/sim/grayscott/GrayScott.java +469 -0
  365. data/src/toxi/util/DateUtils.java +141 -0
  366. data/src/toxi/util/FileSequenceDescriptor.java +181 -0
  367. data/src/toxi/util/FileUtils.java +467 -0
  368. data/src/toxi/util/datatypes/ArraySet.java +128 -0
  369. data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
  370. data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
  371. data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
  372. data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
  373. data/src/toxi/util/datatypes/DoubleRange.java +251 -0
  374. data/src/toxi/util/datatypes/FloatRange.java +251 -0
  375. data/src/toxi/util/datatypes/GenericSet.java +215 -0
  376. data/src/toxi/util/datatypes/IntegerRange.java +247 -0
  377. data/src/toxi/util/datatypes/IntegerSet.java +149 -0
  378. data/src/toxi/util/datatypes/ItemIndex.java +72 -0
  379. data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
  380. data/src/toxi/util/datatypes/TypedProperties.java +291 -0
  381. data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
  382. data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
  383. data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
  384. data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
  385. data/src/toxi/util/events/EventDispatcher.java +86 -0
  386. data/src/toxi/volume/AdditiveBrush.java +19 -0
  387. data/src/toxi/volume/ArrayIsoSurface.java +297 -0
  388. data/src/toxi/volume/BoxBrush.java +100 -0
  389. data/src/toxi/volume/BrushMode.java +16 -0
  390. data/src/toxi/volume/HashIsoSurface.java +354 -0
  391. data/src/toxi/volume/IsoSurface.java +59 -0
  392. data/src/toxi/volume/MarchingCubesIndex.java +312 -0
  393. data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
  394. data/src/toxi/volume/MeshVoxelizer.java +216 -0
  395. data/src/toxi/volume/MultiplyBrush.java +20 -0
  396. data/src/toxi/volume/PeakBrush.java +21 -0
  397. data/src/toxi/volume/ReplaceBrush.java +19 -0
  398. data/src/toxi/volume/RoundBrush.java +113 -0
  399. data/src/toxi/volume/VolumetricBrush.java +160 -0
  400. data/src/toxi/volume/VolumetricHashMap.java +179 -0
  401. data/src/toxi/volume/VolumetricSpace.java +195 -0
  402. data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
  403. data/toxiclibs.gemspec +28 -0
  404. metadata +442 -31
@@ -0,0 +1,148 @@
1
+ package toxi.geom;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.List;
5
+
6
+ /**
7
+ * Standard multi-segment bezier curve implementation with optional automatic
8
+ * handle alignment between segments. Also provides curve tangent calculation
9
+ * feature. Can be used to create closed curves. Usage of this class is very
10
+ * similar to {@link Spline3D}.
11
+ */
12
+ public class BezierCurve3D {
13
+
14
+ /**
15
+ *
16
+ * @param a
17
+ * @param b
18
+ * @param c
19
+ * @param d
20
+ * @param t
21
+ * @return
22
+ */
23
+ public static Vec3D computePointInSegment(Vec3D a, Vec3D b, Vec3D c,
24
+ Vec3D d, float t) {
25
+ float it = 1.0f - t;
26
+ float it2 = it * it;
27
+ float t2 = t * t;
28
+ return a.scale(it2 * it).addSelf(b.scale(3 * t * it2))
29
+ .addSelf(c.scale(3 * t2 * it)).addSelf(d.scale(t2 * t));
30
+ }
31
+
32
+ /**
33
+ *
34
+ * @param a
35
+ * @param b
36
+ * @param c
37
+ * @param d
38
+ * @param t
39
+ * @return
40
+ */
41
+ public static Vec3D computeTangentInSegment(Vec3D a, Vec3D b, Vec3D c,
42
+ Vec3D d, float t) {
43
+ float t2 = t * t;
44
+ float x = (3 * t2 * (-a.x + 3 * b.x - 3 * c.x + d.x) + 6 * t
45
+ * (a.x - 2 * b.x + c.x) + 3 * (-a.x + b.x));
46
+ float y = (3 * t2 * (-a.y + 3 * b.y - 3 * c.y + d.y) + 6 * t
47
+ * (a.y - 2 * b.y + c.y) + 3 * (-a.y + b.y));
48
+ float z = (3 * t2 * (-a.z + 3 * b.z - 3 * c.z + d.z) + 6 * t
49
+ * (a.z - 2 * b.z + c.z) + 3 * (-a.z + b.z));
50
+ return new Vec3D(x, y, z).normalize();
51
+ }
52
+
53
+ private final List<Vec3D> points;
54
+
55
+ /**
56
+ *
57
+ */
58
+ public BezierCurve3D() {
59
+ points = new ArrayList<Vec3D>();
60
+ }
61
+
62
+ /**
63
+ *
64
+ * @param points
65
+ */
66
+ public BezierCurve3D(List<Vec3D> points) {
67
+ this.points = points;
68
+ }
69
+
70
+ /**
71
+ *
72
+ * @param p
73
+ * @return
74
+ */
75
+ public BezierCurve3D add(Vec3D p) {
76
+ points.add(p);
77
+ return this;
78
+ }
79
+
80
+ /**
81
+ *
82
+ */
83
+ public void alignAllHandles() {
84
+ for (int i = 0, num = points.size() - 1; i < num; i += 3) {
85
+ alignHandlesForPoint(i);
86
+ }
87
+ }
88
+
89
+ /**
90
+ *
91
+ * @param id
92
+ */
93
+ public void alignHandlesForPoint(int id) {
94
+ if (id < points.size() - 1) {
95
+ Vec3D c;
96
+ if (id == 0 && isClosed()) {
97
+ c = points.get(points.size() - 2);
98
+ } else {
99
+ c = points.get(id - 1);
100
+ }
101
+ Vec3D d = points.get(id);
102
+ Vec3D e = points.get(id + 1);
103
+ Vec3D cd = d.sub(c);
104
+ Vec3D de = e.sub(d);
105
+ Vec3D cd2 = cd.interpolateTo(de, 0.5f);
106
+ c.set(d.sub(cd2));
107
+ e.set(d.add(de.interpolateToSelf(cd, 0.5f)));
108
+ } else {
109
+ throw new IllegalArgumentException("invalid point index");
110
+ }
111
+ }
112
+
113
+ /**
114
+ * @return true, if the curve is closed. I.e. the first and last control
115
+ * point coincide.
116
+ */
117
+ public boolean isClosed() {
118
+ return points.get(0).equals(points.get(points.size() - 1));
119
+ }
120
+
121
+ /**
122
+ * Computes a list of intermediate curve points for all segments. For each
123
+ * curve segment the given number of points will be produced.
124
+ *
125
+ * @param res
126
+ * number of points per segment
127
+ * @return list of Vec3Ds
128
+ */
129
+ public LineStrip3D toLineStrip3D(int res) {
130
+ LineStrip3D strip = new LineStrip3D();
131
+ int i = 0;
132
+ int maxRes = res;
133
+ for (int num = points.size(); i < num - 3; i += 3) {
134
+ Vec3D a = points.get(i);
135
+ Vec3D b = points.get(i + 1);
136
+ Vec3D c = points.get(i + 2);
137
+ Vec3D d = points.get(i + 3);
138
+ if (i + 3 > num - 3) {
139
+ maxRes++;
140
+ }
141
+ for (int t = 0; t < maxRes; t++) {
142
+ strip.add(computePointInSegment(a, b, c, d, (float) t / res));
143
+ }
144
+ }
145
+ return strip;
146
+ }
147
+
148
+ }
@@ -0,0 +1,185 @@
1
+ package toxi.geom;
2
+
3
+ import java.awt.Shape;
4
+ import java.awt.geom.Area;
5
+ import java.awt.geom.Ellipse2D;
6
+ import java.awt.geom.Path2D;
7
+ import java.awt.geom.PathIterator;
8
+ import java.awt.geom.Rectangle2D;
9
+ import java.util.ArrayList;
10
+ import java.util.List;
11
+
12
+ /**
13
+ *
14
+ * @author tux
15
+ */
16
+ public class BooleanShapeBuilder {
17
+
18
+ /**
19
+ *
20
+ */
21
+ public enum Type {
22
+
23
+ /**
24
+ *
25
+ */
26
+ UNION,
27
+
28
+ /**
29
+ *
30
+ */
31
+ INTERSECTION,
32
+
33
+ /**
34
+ *
35
+ */
36
+ DIFFERENCE,
37
+
38
+ /**
39
+ *
40
+ */
41
+ XOR;
42
+ }
43
+
44
+ private int bezierRes;
45
+
46
+ private final Area area;
47
+ private final Type type;
48
+
49
+ /**
50
+ *
51
+ * @param type
52
+ */
53
+ public BooleanShapeBuilder(Type type) {
54
+ this(type, 8);
55
+ }
56
+
57
+ /**
58
+ *
59
+ * @param type
60
+ * @param bezierRes
61
+ */
62
+ public BooleanShapeBuilder(Type type, int bezierRes) {
63
+ this.type = type;
64
+ this.bezierRes = bezierRes;
65
+ area = new Area();
66
+ }
67
+
68
+ /**
69
+ *
70
+ * @param s
71
+ * @return
72
+ */
73
+ public BooleanShapeBuilder addShape(Shape2D s) {
74
+ return combineWithArea(new Area(convertToAWTShape(s)));
75
+ }
76
+
77
+ /**
78
+ *
79
+ * @param a
80
+ * @return
81
+ */
82
+ public BooleanShapeBuilder combineWithArea(Area a) {
83
+ switch (type) {
84
+ case UNION:
85
+ area.add(a);
86
+ break;
87
+ case INTERSECTION:
88
+ area.intersect(a);
89
+ break;
90
+ case DIFFERENCE:
91
+ area.subtract(a);
92
+ break;
93
+ case XOR:
94
+ area.exclusiveOr(a);
95
+ break;
96
+ }
97
+ return this;
98
+ }
99
+
100
+ /**
101
+ *
102
+ * @return
103
+ */
104
+ public List<Polygon2D> computeShapes() {
105
+ List<Polygon2D> shapes = new ArrayList<Polygon2D>();
106
+ PathIterator i = area.getPathIterator(null);
107
+ float[] buf = new float[6];
108
+ Vec2D prev = new Vec2D();
109
+ Polygon2D s = null;
110
+ while (!i.isDone()) {
111
+ int id = i.currentSegment(buf);
112
+ switch (id) {
113
+ case PathIterator.SEG_MOVETO:
114
+ s = new Polygon2D();
115
+ shapes.add(s);
116
+ prev.set(buf[0], buf[1]);
117
+ s.add(prev.copy());
118
+ break;
119
+ case PathIterator.SEG_LINETO:
120
+ prev.set(buf[0], buf[1]);
121
+ s.add(prev.copy());
122
+ break;
123
+ case PathIterator.SEG_CUBICTO:
124
+ Vec2D pa = new Vec2D(buf[0], buf[1]);
125
+ Vec2D pb = new Vec2D(buf[2], buf[3]);
126
+ Vec2D pc = new Vec2D(buf[4], buf[5]);
127
+ for (int t = 0; t <= bezierRes; t++) {
128
+ s.add(BezierCurve2D.computePointInSegment(prev, pa, pb,
129
+ pc, (float) t / bezierRes));
130
+ }
131
+ prev.set(pc);
132
+ break;
133
+ case PathIterator.SEG_CLOSE:
134
+ break;
135
+ default:
136
+ throw new UnsupportedOperationException(
137
+ "Unsupported path segment type: " + id);
138
+ }
139
+ i.next();
140
+ }
141
+ return shapes;
142
+ }
143
+
144
+ private Shape convertToAWTShape(Shape2D s) {
145
+ if (s instanceof Rect) {
146
+ Rect r = (Rect) s;
147
+ return new Rectangle2D.Float(r.x, r.y, r.width, r.height);
148
+ }
149
+ if (s instanceof Triangle2D) {
150
+ Triangle2D t = (Triangle2D) s;
151
+ Path2D path = new Path2D.Float();
152
+ path.moveTo(t.a.x, t.a.y);
153
+ path.lineTo(t.b.x, t.b.y);
154
+ path.lineTo(t.c.x, t.c.y);
155
+ path.closePath();
156
+ return path;
157
+ }
158
+ if (s instanceof Ellipse) {
159
+ Ellipse e = (Ellipse) s;
160
+ Vec2D r = e.getRadii();
161
+ return new Ellipse2D.Float(e.x - r.x, e.y - r.y, r.x * 2, r.y * 2);
162
+ }
163
+ if (!(s instanceof Polygon2D)) {
164
+ s = s.toPolygon2D();
165
+ }
166
+ Polygon2D poly = (Polygon2D) s;
167
+ Path2D path = new Path2D.Float();
168
+ Vec2D p = poly.get(0);
169
+ path.moveTo(p.x, p.y);
170
+ for (int i = 1, num = poly.getNumVertices(); i < num; i++) {
171
+ p = poly.get(i);
172
+ path.lineTo(p.x, p.y);
173
+ }
174
+ path.closePath();
175
+ return path;
176
+ }
177
+
178
+ /**
179
+ *
180
+ * @return
181
+ */
182
+ public Area getArea() {
183
+ return area;
184
+ }
185
+ }
@@ -0,0 +1,52 @@
1
+ package toxi.geom;
2
+
3
+ /**
4
+ *
5
+ * @author tux
6
+ */
7
+ public class BoxIntersector implements Intersector3D {
8
+
9
+ private AABB box;
10
+ private final IsectData3D isec;
11
+
12
+ /**
13
+ *
14
+ * @param box
15
+ */
16
+ public BoxIntersector(AABB box) {
17
+ this.box = box;
18
+ this.isec = new IsectData3D();
19
+ }
20
+
21
+ /**
22
+ * @return the box
23
+ */
24
+ public AABB getBox() {
25
+ return box;
26
+ }
27
+
28
+ @Override
29
+ public IsectData3D getIntersectionData() {
30
+ return isec;
31
+ }
32
+
33
+ @Override
34
+ public boolean intersectsRay(Ray3D ray) {
35
+ final Vec3D pos = box.intersectsRay(ray, 0, Float.MAX_VALUE);
36
+ isec.pos = pos;
37
+ isec.isIntersection = pos != null;
38
+ if (isec.isIntersection) {
39
+ isec.normal = box.getNormalForPoint(pos);
40
+ isec.dist = ray.distanceTo(pos);
41
+ }
42
+ return isec.isIntersection;
43
+ }
44
+
45
+ /**
46
+ * @param box
47
+ * the box to set
48
+ */
49
+ public void setBox(AABB box) {
50
+ this.box = box;
51
+ }
52
+ }
@@ -0,0 +1,230 @@
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
+
34
+ /**
35
+ * This class overrides {@link Ellipse} to define a 2D circle and provides
36
+ * several utility methods for it, including factory methods to construct
37
+ * circles from points.
38
+ */
39
+ public class Circle extends Ellipse {
40
+
41
+ /**
42
+ * Factory method to construct a circle which has the two given points lying
43
+ * on its perimeter. If the points are coincident, the circle will have a
44
+ * radius of zero.
45
+ *
46
+ * @param p1
47
+ * @param p2
48
+ * @return new circle instance
49
+ */
50
+ public static Circle from2Points(Vec2D p1, Vec2D p2) {
51
+ Vec2D m = p1.interpolateTo(p2, 0.5f);
52
+ return new Circle(m, m.distanceTo(p1));
53
+ }
54
+
55
+ /**
56
+ * Factory method to construct a circle which has the three given points
57
+ * lying on its perimeter. The function returns null, if the 3 points are
58
+ * co-linear (in which case it's impossible to find a circle).
59
+ *
60
+ * Based on CPP code by Paul Bourke:
61
+ * http://local.wasp.uwa.edu.au/~pbourke/geometry/circlefrom3/
62
+ *
63
+ * @param p1
64
+ * @param p2
65
+ * @param p3
66
+ * @return new circle instance or null
67
+ */
68
+ public static Circle from3Points(Vec2D p1, Vec2D p2, Vec2D p3) {
69
+ Circle circle = null;
70
+ Vec2D deltaA = p2.sub(p1);
71
+ Vec2D deltaB = p3.sub(p2);
72
+ if (MathUtils.abs(deltaA.x) <= 0.0000001f
73
+ && MathUtils.abs(deltaB.y) <= 0.0000001f) {
74
+ Vec2D centroid = new Vec2D(p2.x + p3.x, p1.y + p2.y)
75
+ .scaleSelf(0.5f);
76
+ float radius = centroid.distanceTo(p1);
77
+ circle = new Circle(centroid, radius);
78
+ } else {
79
+ float aSlope = deltaA.y / deltaA.x;
80
+ float bSlope = deltaB.y / deltaB.x;
81
+ if (MathUtils.abs(aSlope - bSlope) > 0.0000001f) {
82
+ float x = (aSlope * bSlope * (p1.y - p3.y) + bSlope
83
+ * (p1.x + p2.x) - aSlope * (p2.x + p3.x))
84
+ / (2 * (bSlope - aSlope));
85
+ float y = -(x - (p1.x + p2.x) / 2) / aSlope + (p1.y + p2.y) / 2;
86
+ Vec2D centroid = new Vec2D(x, y);
87
+ float radius = centroid.distanceTo(p1);
88
+ circle = new Circle(centroid, radius);
89
+ }
90
+ }
91
+ return circle;
92
+ }
93
+
94
+ /**
95
+ *
96
+ * @param vertices
97
+ * @return
98
+ */
99
+ public static Circle newBoundingCircle(List<Vec2D> vertices) {
100
+ Vec2D origin = new Vec2D();
101
+ float maxD = 0;
102
+ for (Vec2D v : vertices) {
103
+ origin.addSelf(v);
104
+ }
105
+ origin.scaleSelf(1f / vertices.size());
106
+ for (Vec2D v : vertices) {
107
+ float d = origin.distanceToSquared(v);
108
+ if (d > maxD) {
109
+ maxD = d;
110
+ }
111
+ }
112
+ return new Circle(origin, (float) Math.sqrt(maxD));
113
+ }
114
+
115
+ /**
116
+ *
117
+ */
118
+ public Circle() {
119
+ this(new Vec2D(), 1);
120
+ }
121
+
122
+ /**
123
+ *
124
+ * @param c
125
+ */
126
+ public Circle(Circle c) {
127
+ this(c, c.radius.x);
128
+ }
129
+
130
+ /**
131
+ *
132
+ * @param radius
133
+ */
134
+ public Circle(float radius) {
135
+ this(0, 0, radius);
136
+ }
137
+
138
+ /**
139
+ *
140
+ * @param x
141
+ * @param y
142
+ * @param radius
143
+ */
144
+ public Circle(float x, float y, float radius) {
145
+ super(x, y, radius, radius);
146
+ }
147
+
148
+ /**
149
+ *
150
+ * @param origin
151
+ * @param radius
152
+ */
153
+ public Circle(ReadonlyVec2D origin, float radius) {
154
+ super(origin, radius);
155
+ }
156
+
157
+ /*
158
+ * (non-Javadoc)
159
+ *
160
+ * @see toxi.geom.Ellipse#containsPoint(toxi.geom.Vec2D)
161
+ */
162
+ @Override
163
+ public boolean containsPoint(ReadonlyVec2D p) {
164
+ return distanceToSquared(p) <= radius.x * radius.x;
165
+ }
166
+
167
+ /*
168
+ * (non-Javadoc)
169
+ *
170
+ * @see toxi.geom.Ellipse#getCircumference()
171
+ */
172
+ @Override
173
+ public float getCircumference() {
174
+ return MathUtils.TWO_PI * radius.x;
175
+ }
176
+
177
+ /**
178
+ *
179
+ * @return
180
+ */
181
+ public float getRadius() {
182
+ return radius.x;
183
+ }
184
+
185
+ /**
186
+ *
187
+ * @param p
188
+ * @return
189
+ */
190
+ public Vec2D[] getTangentPoints(ReadonlyVec2D p) {
191
+ Vec2D m = interpolateTo(p, 0.5f);
192
+ return intersectsCircle(new Circle(m, m.distanceTo(p)));
193
+ }
194
+
195
+ /**
196
+ *
197
+ * @param c
198
+ * @return
199
+ */
200
+ public Vec2D[] intersectsCircle(Circle c) {
201
+ Vec2D[] res = null;
202
+ Vec2D delta = c.sub(this);
203
+ float d = delta.magnitude();
204
+ float r1 = radius.x;
205
+ float r2 = c.radius.x;
206
+ if (d <= r1 + r2 && d >= Math.abs(r1 - r2)) {
207
+ float a = (r1 * r1 - r2 * r2 + d * d) / (2.0f * d);
208
+ d = 1 / d;
209
+ Vec2D p = add(delta.scale(a * d));
210
+ float h = (float) Math.sqrt(r1 * r1 - a * a);
211
+ delta.perpendicular().scaleSelf(h * d);
212
+ Vec2D i1 = p.add(delta);
213
+ Vec2D i2 = p.sub(delta);
214
+ res = new Vec2D[] {
215
+ i1, i2
216
+ };
217
+ }
218
+ return res;
219
+ }
220
+
221
+ /**
222
+ *
223
+ * @param r
224
+ * @return
225
+ */
226
+ public Circle setRadius(float r) {
227
+ super.setRadii(r, r);
228
+ return this;
229
+ }
230
+ }