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,560 @@
1
+ package toxi.geom.mesh2d;
2
+
3
+ import java.util.Arrays;
4
+ import toxi.geom.Vec2D;
5
+
6
+ /*
7
+ * Copyright (c) 2005, 2007 by L. Paul Chew.
8
+ *
9
+ * Permission is hereby granted, without written agreement and without
10
+ * license or royalty fees, to use, copy, modify, and distribute this
11
+ * software and its documentation for any purpose, subject to the following
12
+ * conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included
15
+ * in all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23
+ * DEALINGS IN THE SOFTWARE.
24
+ */
25
+
26
+ /**
27
+ * Points in Euclidean space, implemented as double[].
28
+ *
29
+ * Includes simple geometric operations. Uses matrices; a matrix is represented
30
+ * as an array of Pnts. Uses simplices; a simplex is represented as an array of
31
+ * Pnts.
32
+ *
33
+ * @author Paul Chew Created July 2005. Derived from an earlier, messier
34
+ * version. Modified Novemeber 2007. Minor clean up.
35
+ */
36
+ public class DelaunayVertex {
37
+
38
+ /**
39
+ * Circumcenter of a simplex.
40
+ *
41
+ * @param simplex
42
+ * the simplex (as an array of Pnts)
43
+ * @return the circumcenter (a DelaunayVertex) of simplex
44
+ */
45
+ public static DelaunayVertex circumcenter(DelaunayVertex[] simplex) {
46
+ int dim = simplex[0].dimension();
47
+ if (simplex.length - 1 != dim) {
48
+ throw new IllegalArgumentException("Dimension mismatch");
49
+ }
50
+ DelaunayVertex[] matrix = new DelaunayVertex[dim];
51
+ for (int i = 0; i < dim; i++) {
52
+ matrix[i] = simplex[i].bisector(simplex[i + 1]);
53
+ }
54
+ DelaunayVertex hCenter = cross(matrix); // Center in homogeneous
55
+ // coordinates
56
+ double last = hCenter.coordinates[dim];
57
+ double[] result = new double[dim];
58
+ for (int i = 0; i < dim; i++) {
59
+ result[i] = hCenter.coordinates[i] / last;
60
+ }
61
+ return new DelaunayVertex(result);
62
+ }
63
+
64
+ /**
65
+ * Determine the signed content (i.e., area or volume, etc.) of a simplex.
66
+ *
67
+ * @param simplex
68
+ * the simplex (as an array of Pnts)
69
+ * @return the signed content of the simplex
70
+ */
71
+ public static double content(DelaunayVertex[] simplex) {
72
+ DelaunayVertex[] matrix = new DelaunayVertex[simplex.length];
73
+ for (int i = 0; i < matrix.length; i++) {
74
+ matrix[i] = simplex[i].extend(1);
75
+ }
76
+ int fact = 1;
77
+ for (int i = 1; i < matrix.length; i++) {
78
+ fact = fact * i;
79
+ }
80
+ return determinant(matrix) / fact;
81
+ }
82
+
83
+ /**
84
+ * Compute generalized cross-product of the rows of a matrix. The result is
85
+ * a DelaunayVertex perpendicular (as a vector) to each row of the matrix.
86
+ * This is not an efficient implementation, but should be adequate for low
87
+ * dimension.
88
+ *
89
+ * @param matrix
90
+ * the matrix of Pnts (one less row than the DelaunayVertex
91
+ * dimension)
92
+ * @return a DelaunayVertex perpendicular to each row DelaunayVertex
93
+ * @throws IllegalArgumentException
94
+ * if matrix is wrong shape
95
+ */
96
+ public static DelaunayVertex cross(DelaunayVertex[] matrix) {
97
+ int len = matrix.length + 1;
98
+ if (len != matrix[0].dimension()) {
99
+ throw new IllegalArgumentException("Dimension mismatch");
100
+ }
101
+ boolean[] columns = new boolean[len];
102
+ for (int i = 0; i < len; i++) {
103
+ columns[i] = true;
104
+ }
105
+ double[] result = new double[len];
106
+ int sign = 1;
107
+ try {
108
+ for (int i = 0; i < len; i++) {
109
+ columns[i] = false;
110
+ result[i] = sign * determinant(matrix, 0, columns);
111
+ columns[i] = true;
112
+ sign = -sign;
113
+ }
114
+ } catch (ArrayIndexOutOfBoundsException e) {
115
+ throw new IllegalArgumentException("Matrix is wrong shape");
116
+ }
117
+ return new DelaunayVertex(result);
118
+ }
119
+
120
+ /**
121
+ * Compute the determinant of a matrix (array of Pnts). This is not an
122
+ * efficient implementation, but should be adequate for low dimension.
123
+ *
124
+ * @param matrix
125
+ * the matrix as an array of Pnts
126
+ * @return the determinnant of the input matrix
127
+ * @throws IllegalArgumentException
128
+ * if dimensions are wrong
129
+ */
130
+ public static double determinant(DelaunayVertex[] matrix) {
131
+ if (matrix.length != matrix[0].dimension()) {
132
+ throw new IllegalArgumentException("Matrix is not square");
133
+ }
134
+ boolean[] columns = new boolean[matrix.length];
135
+ for (int i = 0; i < matrix.length; i++) {
136
+ columns[i] = true;
137
+ }
138
+ try {
139
+ return determinant(matrix, 0, columns);
140
+ } catch (ArrayIndexOutOfBoundsException e) {
141
+ throw new IllegalArgumentException("Matrix is wrong shape");
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Compute the determinant of a submatrix specified by starting row and by
147
+ * "active" columns.
148
+ *
149
+ * @param matrix
150
+ * the matrix as an array of Pnts
151
+ * @param row
152
+ * the starting row
153
+ * @param columns
154
+ * a boolean array indicating the "active" columns
155
+ * @return the determinant of the specified submatrix
156
+ * @throws ArrayIndexOutOfBoundsException
157
+ * if dimensions are wrong
158
+ */
159
+ private static double determinant(DelaunayVertex[] matrix, int row,
160
+ boolean[] columns) {
161
+ if (row == matrix.length) {
162
+ return 1;
163
+ }
164
+ double sum = 0;
165
+ int sign = 1;
166
+ for (int col = 0; col < columns.length; col++) {
167
+ if (!columns[col]) {
168
+ continue;
169
+ }
170
+ columns[col] = false;
171
+ sum += sign * matrix[row].coordinates[col]
172
+ * determinant(matrix, row + 1, columns);
173
+ columns[col] = true;
174
+ sign = -sign;
175
+ }
176
+ return sum;
177
+ }
178
+
179
+ /**
180
+ * Create a String for a matrix.
181
+ *
182
+ * @param matrix
183
+ * the matrix (an array of Pnts)
184
+ * @return a String represenation of the matrix
185
+ */
186
+ public static String toString(DelaunayVertex[] matrix) {
187
+ StringBuilder buf = new StringBuilder("{");
188
+ for (DelaunayVertex row : matrix) {
189
+ buf.append(" ").append(row);
190
+ }
191
+ buf.append(" }");
192
+ return buf.toString();
193
+ }
194
+
195
+ private final double[] coordinates; // The point's coordinates
196
+
197
+ /**
198
+ * Constructor.
199
+ *
200
+ * @param coords
201
+ * the coordinates
202
+ */
203
+ public DelaunayVertex(double... coords) {
204
+ // Copying is done here to ensure that DelaunayVertex's coords cannot be
205
+ // altered.
206
+ // This is necessary because the double... notation actually creates a
207
+ // constructor with double[] as its argument.
208
+ coordinates = new double[coords.length];
209
+ System.arraycopy(coords, 0, coordinates, 0, coords.length);
210
+ }
211
+
212
+ /**
213
+ * Add.
214
+ *
215
+ * @param p
216
+ * the other DelaunayVertex
217
+ * @return a new DelaunayVertex = this + p
218
+ */
219
+ public DelaunayVertex add(DelaunayVertex p) {
220
+ int len = dimCheck(p);
221
+ double[] coords = new double[len];
222
+ for (int i = 0; i < len; i++) {
223
+ coords[i] = this.coordinates[i] + p.coordinates[i];
224
+ }
225
+ return new DelaunayVertex(coords);
226
+ }
227
+
228
+ /**
229
+ * Angle (in radians) between two Pnts (treated as vectors).
230
+ *
231
+ * @param p
232
+ * the other DelaunayVertex
233
+ * @return the angle (in radians) between the two Pnts
234
+ */
235
+ public double angle(DelaunayVertex p) {
236
+ return Math.acos(this.dot(p) / (this.magnitude() * p.magnitude()));
237
+ }
238
+
239
+ /**
240
+ * Perpendicular bisector of two Pnts. Works in any dimension. The
241
+ * coefficients are returned as a DelaunayVertex of one higher dimension
242
+ * (e.g., (A,B,C,D) for an equation of the form Ax + By + Cz + D = 0).
243
+ *
244
+ * @param point
245
+ * the other point
246
+ * @return the coefficients of the perpendicular bisector
247
+ */
248
+ public DelaunayVertex bisector(DelaunayVertex point) {
249
+ dimCheck(point);
250
+ DelaunayVertex diff = this.subtract(point);
251
+ DelaunayVertex sum = this.add(point);
252
+ double dot = diff.dot(sum);
253
+ return diff.extend(-dot / 2);
254
+ }
255
+
256
+ /**
257
+ * @param i
258
+ * @return the specified coordinate of this DelaunayVertex
259
+ * @throws ArrayIndexOutOfBoundsException
260
+ * for bad coordinate
261
+ */
262
+ public double coord(int i) {
263
+ return this.coordinates[i];
264
+ }
265
+
266
+ /**
267
+ * Check that dimensions match.
268
+ *
269
+ * @param p
270
+ * the DelaunayVertex to check (against this DelaunayVertex)
271
+ * @return the dimension of the Pnts
272
+ * @throws IllegalArgumentException
273
+ * if dimension fail to match
274
+ */
275
+ public int dimCheck(DelaunayVertex p) {
276
+ int len = this.coordinates.length;
277
+ if (len != p.coordinates.length) {
278
+ throw new IllegalArgumentException("Dimension mismatch");
279
+ }
280
+ return len;
281
+ }
282
+
283
+ /**
284
+ * @return this DelaunayVertex's dimension.
285
+ */
286
+ public int dimension() {
287
+ return coordinates.length;
288
+ }
289
+
290
+ /* Pnts as matrices */
291
+
292
+ /**
293
+ * Dot product.
294
+ *
295
+ * @param p
296
+ * the other DelaunayVertex
297
+ * @return dot product of this DelaunayVertex and p
298
+ */
299
+ public double dot(DelaunayVertex p) {
300
+ int len = dimCheck(p);
301
+ double sum = 0;
302
+ for (int i = 0; i < len; i++) {
303
+ sum += this.coordinates[i] * p.coordinates[i];
304
+ }
305
+ return sum;
306
+ }
307
+
308
+ /**
309
+ *
310
+ * @param other
311
+ * @return
312
+ */
313
+ @Override
314
+ public boolean equals(Object other) {
315
+ if (!(other instanceof DelaunayVertex)) {
316
+ return false;
317
+ }
318
+ DelaunayVertex p = (DelaunayVertex) other;
319
+ if (this.coordinates.length != p.coordinates.length) {
320
+ return false;
321
+ }
322
+ for (int i = 0; i < this.coordinates.length; i++) {
323
+ if (this.coordinates[i] != p.coordinates[i]) {
324
+ return false;
325
+ }
326
+ }
327
+ return true;
328
+ }
329
+
330
+ /**
331
+ *
332
+ * @return
333
+ */
334
+ @Override
335
+ public int hashCode() {
336
+ int hash = 7;
337
+ hash = 97 * hash + Arrays.hashCode(this.coordinates);
338
+ return hash;
339
+ }
340
+
341
+ /**
342
+ * Create a new DelaunayVertex by adding additional coordinates to this
343
+ * DelaunayVertex.
344
+ *
345
+ * @param coords
346
+ * the new coordinates (added on the right end)
347
+ * @return a new DelaunayVertex with the additional coordinates
348
+ */
349
+ public DelaunayVertex extend(double... coords) {
350
+ double[] result = new double[coordinates.length + coords.length];
351
+ System.arraycopy(coordinates, 0, result, 0, coordinates.length);
352
+ System.arraycopy(coords, 0, result, coordinates.length, coords.length);
353
+ return new DelaunayVertex(result);
354
+ }
355
+
356
+ /* Pnts as simplices */
357
+
358
+ /**
359
+ * Test if this DelaunayVertex is inside a simplex.
360
+ *
361
+ * @param simplex
362
+ * the simplex (an arary of Pnts)
363
+ * @return true iff this DelaunayVertex is inside simplex.
364
+ */
365
+ public boolean isInside(DelaunayVertex[] simplex) {
366
+ int[] result = this.relation(simplex);
367
+ for (int r : result) {
368
+ if (r >= 0) {
369
+ return false;
370
+ }
371
+ }
372
+ return true;
373
+ }
374
+
375
+ /**
376
+ * Test if this DelaunayVertex is on a simplex.
377
+ *
378
+ * @param simplex
379
+ * the simplex (an array of Pnts)
380
+ * @return the simplex DelaunayVertex that "witnesses" on-ness (or null if
381
+ * not on)
382
+ */
383
+ public DelaunayVertex isOn(DelaunayVertex[] simplex) {
384
+ int[] result = this.relation(simplex);
385
+ DelaunayVertex witness = null;
386
+ for (int i = 0; i < result.length; i++) {
387
+ if (result[i] == 0) {
388
+ witness = simplex[i];
389
+ } else if (result[i] > 0) {
390
+ return null;
391
+ }
392
+ }
393
+ return witness;
394
+ }
395
+
396
+ /**
397
+ * Test if this DelaunayVertex is outside of simplex.
398
+ *
399
+ * @param simplex
400
+ * the simplex (an array of Pnts)
401
+ * @return simplex DelaunayVertex that "witnesses" outsideness (or null if
402
+ * not outside)
403
+ */
404
+ public DelaunayVertex isOutside(DelaunayVertex[] simplex) {
405
+ int[] result = this.relation(simplex);
406
+ for (int i = 0; i < result.length; i++) {
407
+ if (result[i] > 0) {
408
+ return simplex[i];
409
+ }
410
+ }
411
+ return null;
412
+ }
413
+
414
+ /**
415
+ * Magnitude (as a vector).
416
+ *
417
+ * @return the Euclidean length of this vector
418
+ */
419
+ public double magnitude() {
420
+ return Math.sqrt(this.dot(this));
421
+ }
422
+
423
+ /**
424
+ * Relation between this DelaunayVertex and a simplex (represented as an
425
+ * array of Pnts). Result is an array of signs, one for each vertex of the
426
+ * simplex, indicating the relation between the vertex, the vertex's
427
+ * opposite facet, and this DelaunayVertex.
428
+ *
429
+ * <pre>
430
+ * -1 means DelaunayVertex is on same side of facet
431
+ * 0 means DelaunayVertex is on the facet
432
+ * +1 means DelaunayVertex is on opposite side of facet
433
+ * </pre>
434
+ *
435
+ * @param simplex
436
+ * an array of Pnts representing a simplex
437
+ * @return an array of signs showing relation between this DelaunayVertex
438
+ * and simplex
439
+ */
440
+ public int[] relation(DelaunayVertex[] simplex) {
441
+ /*
442
+ * In 2D, we compute the cross of this matrix: 1 1 1 1 p0 a0 b0 c0 p1 a1
443
+ * b1 c1 where (a, b, c) is the simplex and p is this DelaunayVertex.
444
+ * The result is a vector in which the first coordinate is the signed
445
+ * area (all signed areas are off by the same constant factor) of the
446
+ * simplex and the remaining coordinates are the *negated* signed areas
447
+ * for the simplices in which p is substituted for each of the vertices.
448
+ * Analogous results occur in higher dimensions.
449
+ */
450
+ int dim = simplex.length - 1;
451
+ if (this.dimension() != dim) {
452
+ throw new IllegalArgumentException("Dimension mismatch");
453
+ }
454
+
455
+ /* Create and load the matrix */
456
+ DelaunayVertex[] matrix = new DelaunayVertex[dim + 1];
457
+ /* First row */
458
+ double[] coords = new double[dim + 2];
459
+ for (int j = 0; j < coords.length; j++) {
460
+ coords[j] = 1;
461
+ }
462
+ matrix[0] = new DelaunayVertex(coords);
463
+ /* Other rows */
464
+ for (int i = 0; i < dim; i++) {
465
+ coords[0] = this.coordinates[i];
466
+ for (int j = 0; j < simplex.length; j++) {
467
+ coords[j + 1] = simplex[j].coordinates[i];
468
+ }
469
+ matrix[i + 1] = new DelaunayVertex(coords);
470
+ }
471
+
472
+ /* Compute and analyze the vector of areas/volumes/contents */
473
+ DelaunayVertex vector = cross(matrix);
474
+ double content = vector.coordinates[0];
475
+ int[] result = new int[dim + 1];
476
+ for (int i = 0; i < result.length; i++) {
477
+ double value = vector.coordinates[i + 1];
478
+ if (Math.abs(value) <= 1.0e-6 * Math.abs(content)) {
479
+ result[i] = 0;
480
+ } else if (value < 0) {
481
+ result[i] = -1;
482
+ } else {
483
+ result[i] = 1;
484
+ }
485
+ }
486
+ if (content < 0) {
487
+ for (int i = 0; i < result.length; i++) {
488
+ result[i] = -result[i];
489
+ }
490
+ }
491
+ if (content == 0) {
492
+ for (int i = 0; i < result.length; i++) {
493
+ result[i] = Math.abs(result[i]);
494
+ }
495
+ }
496
+ return result;
497
+ }
498
+
499
+ /**
500
+ * Subtract.
501
+ *
502
+ * @param p
503
+ * the other DelaunayVertex
504
+ * @return a new DelaunayVertex = this - p
505
+ */
506
+ public DelaunayVertex subtract(DelaunayVertex p) {
507
+ int len = dimCheck(p);
508
+ double[] coords = new double[len];
509
+ for (int i = 0; i < len; i++) {
510
+ coords[i] = this.coordinates[i] - p.coordinates[i];
511
+ }
512
+ return new DelaunayVertex(coords);
513
+ }
514
+
515
+ /**
516
+ *
517
+ * @return
518
+ */
519
+ @Override
520
+ public String toString() {
521
+ if (coordinates.length == 0) {
522
+ return "DelaunayVertex()";
523
+ }
524
+ String result = "DelaunayVertex(" + coordinates[0];
525
+ for (int i = 1; i < coordinates.length; i++) {
526
+ result = result + "," + coordinates[i];
527
+ }
528
+ result = result + ")";
529
+ return result;
530
+ }
531
+
532
+ /**
533
+ *
534
+ * @return
535
+ */
536
+ public Vec2D toVec2D() {
537
+ return new Vec2D((float) coordinates[0], (float) coordinates[1]);
538
+ }
539
+
540
+ /**
541
+ * Test relation between this DelaunayVertex and circumcircle of a simplex.
542
+ *
543
+ * @param simplex
544
+ * the simplex (as an array of Pnts)
545
+ * @return -1, 0, or +1 for inside, on, or outside of circumcircle
546
+ */
547
+ public int vsCircumcircle(DelaunayVertex[] simplex) {
548
+ DelaunayVertex[] matrix = new DelaunayVertex[simplex.length + 1];
549
+ for (int i = 0; i < simplex.length; i++) {
550
+ matrix[i] = simplex[i].extend(1, simplex[i].dot(simplex[i]));
551
+ }
552
+ matrix[simplex.length] = this.extend(1, this.dot(this));
553
+ double d = determinant(matrix);
554
+ int result = (d < 0) ? -1 : ((d > 0) ? +1 : 0);
555
+ if (content(simplex) < 0) {
556
+ result = -result;
557
+ }
558
+ return result;
559
+ }
560
+ }