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,120 @@
1
+ /*
2
+ * jgeom: Geometry Library fo Java
3
+ *
4
+ * Copyright (C) 2005 Samuel Gerber
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
+ */
20
+ package toxi.geom.nurbs;
21
+
22
+ import toxi.geom.Polygon2D;
23
+ import toxi.geom.Vec3D;
24
+ import toxi.geom.Vec4D;
25
+
26
+ /**
27
+ * Interface for Nurbs Curves
28
+ *
29
+ * @author sg
30
+ * @version 1.0
31
+ */
32
+ public interface NurbsCurve {
33
+
34
+ /**
35
+ * Computes control points of dth derivative<br />
36
+ * Piegel, L. The Nurbs Book<br />
37
+ * Algorithm A3.3 -> Page 98<br />
38
+ * <br />
39
+ *
40
+ * @param d
41
+ * - dth derivative<br />
42
+ * @param r1
43
+ * - from control point (0 for all control points)<br />
44
+ * @param r2
45
+ * - to control point (n for all control points)<br />
46
+ * @return Vec4D[k][i] kth derivative, ith control point
47
+ */
48
+ public Vec4D[][] curveDerivCpts(int d, int r1, int r2);
49
+
50
+ /**
51
+ *
52
+ * @param u
53
+ * @param d
54
+ * @return
55
+ */
56
+ public abstract Vec3D[] derivativesOnCurve(float u, int d);
57
+
58
+ /**
59
+ *
60
+ * @param u
61
+ * @param d
62
+ * @param ders
63
+ * @return
64
+ */
65
+ public abstract Vec3D[] derivativesOnCurve(float u, int d, Vec3D[] ders);
66
+
67
+ /**
68
+ * Get the ControlPoints of this curve
69
+ *
70
+ * @return the ordered ControlPoints
71
+ */
72
+ Vec4D[] getControlPoints();
73
+
74
+ /**
75
+ * Get the Degree of the curve
76
+ *
77
+ * @return degree of curve
78
+ */
79
+ int getDegree();
80
+
81
+ /**
82
+ * Gets the Knot values of the Nurbs curve
83
+ *
84
+ * @return knot values
85
+ */
86
+ float[] getKnots();
87
+
88
+ /**
89
+ *
90
+ * @return
91
+ */
92
+ KnotVector getKnotVector();
93
+
94
+ /**
95
+ * Calculate point on surface for the given u value
96
+ *
97
+ * @param u
98
+ * value to calculate point of
99
+ * @return calculated Point
100
+ */
101
+ Vec3D pointOnCurve(float u);
102
+
103
+ /**
104
+ * Calculate point on surface for the given u value
105
+ *
106
+ * @param u
107
+ * value to calculate point of
108
+ * @param out
109
+ * Point to place result in
110
+ * @return
111
+ */
112
+ Vec3D pointOnCurve(float u, Vec3D out);
113
+
114
+ /**
115
+ *
116
+ * @param res
117
+ * @return
118
+ */
119
+ Polygon2D toPolygon2D(int res);
120
+ }
@@ -0,0 +1,145 @@
1
+ package toxi.geom.nurbs;
2
+
3
+ import toxi.geom.Vec2D;
4
+ import toxi.geom.Vec3D;
5
+ import toxi.geom.mesh.Mesh3D;
6
+ import toxi.geom.mesh.TriangleMesh;
7
+
8
+ /**
9
+ *
10
+ * @author tux
11
+ */
12
+ public class NurbsMeshCreator {
13
+
14
+ private NurbsSurface surf;
15
+ private Vec2D maxUV;
16
+
17
+ /**
18
+ *
19
+ * @param surf
20
+ */
21
+ public NurbsMeshCreator(NurbsSurface surf) {
22
+ this(surf, new Vec2D(1, 1));
23
+ }
24
+
25
+ /**
26
+ *
27
+ * @param surf
28
+ * @param maxUV
29
+ */
30
+ public NurbsMeshCreator(NurbsSurface surf, Vec2D maxUV) {
31
+ this.surf = surf;
32
+ this.maxUV = maxUV;
33
+ }
34
+
35
+ /**
36
+ *
37
+ * @param mesh
38
+ * @return
39
+ */
40
+ public Mesh3D createControlMesh(Mesh3D mesh) {
41
+ Vec3D[] prev = null;
42
+ if (mesh == null) {
43
+ mesh = new TriangleMesh();
44
+ }
45
+ int resU = surf.getControlNet().uLength();
46
+ int resV = surf.getControlNet().vLength();
47
+ Vec2D dUV = maxUV.scale(1f / resU, 1f / resV);
48
+ for (int u = 0; u < resU; u++) {
49
+ Vec3D[] curr = new Vec3D[resV + 1];
50
+ for (int v = 0; v < resV; v++) {
51
+ Vec3D vert = surf.getControlNet().get(u, v).to3D();
52
+ if (v > 0 && u > 0) {
53
+ mesh.addFace(curr[v - 1], vert, prev[v - 1],
54
+ dUV.scale(u, v - 1), dUV.scale(u, v),
55
+ dUV.scale(u - 1, v - 1));
56
+ mesh.addFace(vert, prev[v], prev[v - 1], dUV.scale(u, v),
57
+ dUV.scale(u - 1, v), dUV.scale(u - 1, v - 1));
58
+ }
59
+ curr[v] = vert;
60
+ }
61
+ prev = curr;
62
+ }
63
+ mesh.computeVertexNormals();
64
+ return mesh;
65
+ }
66
+
67
+ /**
68
+ *
69
+ * @param mesh
70
+ * @param resU
71
+ * @param resV
72
+ * @param isClosed
73
+ * @return
74
+ */
75
+ public Mesh3D createMesh(Mesh3D mesh, int resU, int resV, boolean isClosed) {
76
+ final KnotVector knotU = surf.getUKnotVector();
77
+ final KnotVector knotV = surf.getVKnotVector();
78
+ double iresU = knotU.get(knotU.length() - 1) / resU;
79
+ double iresV = knotV.get(knotV.length() - 1) / resV;
80
+ Vec3D[] prev = null;
81
+ Vec3D[] first = null;
82
+ if (mesh == null) {
83
+ mesh = new TriangleMesh();
84
+ }
85
+ Vec2D dUV = maxUV.scale(1f / resU, 1f / resV);
86
+ for (int u = 0; u <= resU; u++) {
87
+ Vec3D[] curr = new Vec3D[resV + 1];
88
+ for (int v = 0; v <= resV; v++) {
89
+ Vec3D vert = null;
90
+ if (isClosed) {
91
+ vert = u < resU ? surf.pointOnSurface(u * iresU, v * iresV)
92
+ : first[v];
93
+ } else {
94
+ vert = surf.pointOnSurface(u * iresU, v * iresV);
95
+ }
96
+ if (v > 0 && u > 0) {
97
+ mesh.addFace(curr[v - 1], vert, prev[v - 1],
98
+ dUV.scale(u, v - 1), dUV.scale(u, v),
99
+ dUV.scale(u - 1, v - 1));
100
+ mesh.addFace(vert, prev[v], prev[v - 1], dUV.scale(u, v),
101
+ dUV.scale(u - 1, v), dUV.scale(u - 1, v - 1));
102
+ }
103
+ curr[v] = vert;
104
+ }
105
+ prev = curr;
106
+ if (u == 0) {
107
+ first = curr;
108
+ }
109
+ }
110
+ mesh.computeVertexNormals();
111
+ return mesh;
112
+ }
113
+
114
+ /**
115
+ *
116
+ * @return
117
+ */
118
+ public NurbsSurface getSurface() {
119
+ return surf;
120
+ }
121
+
122
+ /**
123
+ *
124
+ * @return
125
+ */
126
+ public Vec2D getUVScale() {
127
+ return maxUV;
128
+ }
129
+
130
+ /**
131
+ *
132
+ * @param surf
133
+ */
134
+ public void setSurface(NurbsSurface surf) {
135
+ this.surf = surf;
136
+ }
137
+
138
+ /**
139
+ *
140
+ * @param maxUV
141
+ */
142
+ public void setUVScale(Vec2D maxUV) {
143
+ this.maxUV = maxUV;
144
+ }
145
+ }
@@ -0,0 +1,147 @@
1
+ /*
2
+ * jgeom: Geometry Library fo Java
3
+ *
4
+ * Copyright (C) 2005 Samuel Gerber
5
+ *
6
+ * This program is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public License
8
+ * as published by the Free Software Foundation; either version 2
9
+ * of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
+ */
20
+ package toxi.geom.nurbs;
21
+
22
+ import toxi.geom.Vec3D;
23
+ import toxi.geom.Vec4D;
24
+
25
+ /**
26
+ * Interface for Nurbs Surfaces.
27
+ *
28
+ * @author sg
29
+ * @version 1.2
30
+ */
31
+ public interface NurbsSurface {
32
+
33
+ /**
34
+ * Get the Contol points of the NurbsSurface
35
+ *
36
+ * @return ControlNet of the Nurbs
37
+ */
38
+ ControlNet getControlNet();
39
+
40
+ /**
41
+ * Get a List of all TrimCurves asociated with this Nurbs Surface
42
+ *
43
+ * @return List of TrimCurves
44
+ */
45
+ // List<TrimCurve> getTrimCurves();
46
+
47
+ /**
48
+ * Get the degree in u direction
49
+ *
50
+ * @return degree in u direction
51
+ */
52
+ int getUDegree();
53
+
54
+ /**
55
+ * Get the knot values in u direction
56
+ *
57
+ * @return knot values in u direction
58
+ */
59
+ float[] getUKnots();
60
+
61
+ /**
62
+ *
63
+ * @return
64
+ */
65
+ public abstract KnotVector getUKnotVector();
66
+
67
+ /**
68
+ * Get the degree in v direction
69
+ *
70
+ * @return degree in v direction
71
+ */
72
+ int getVDegree();
73
+
74
+ /**
75
+ * Get the knot values in v direction
76
+ *
77
+ * @return knot values in v direction
78
+ */
79
+ float[] getVKnots();
80
+
81
+ /**
82
+ *
83
+ * @return
84
+ */
85
+ public abstract KnotVector getVKnotVector();
86
+
87
+ /**
88
+ *
89
+ * @param u
90
+ * @param v
91
+ * @return
92
+ */
93
+ public abstract Vec3D pointOnSurface(double u, double v);
94
+
95
+ /**
96
+ * Calculate point on surface for the given u and v values
97
+ *
98
+ * @param u
99
+ * u value to caculate point from
100
+ * @param v
101
+ * v value to caculate point from
102
+ * @return calculated point
103
+ */
104
+ Vec3D pointOnSurface(float u, float v);
105
+
106
+ /**
107
+ * Add a TrimCurve to this Nurbs Surface
108
+ *
109
+ * @param tc
110
+ * TrimCurve to add.
111
+ */
112
+ // void addTrimCurve(TrimCurve tc);
113
+
114
+ /**
115
+ * Calculate point on surface for the given u and v values
116
+ *
117
+ * @param u
118
+ * u value to caculate point from
119
+ * @param v
120
+ * v value to caculate point from
121
+ * @param out
122
+ * point to place result in.
123
+ * @return
124
+ */
125
+ Vec3D pointOnSurface(float u, float v, Vec3D out);
126
+
127
+ /**
128
+ * Computes control points of dth derivative<br />
129
+ * Piegel, L. The Nurbs Book, Algorithm A3.7 -> Page 114<br />
130
+ *
131
+ * @param d
132
+ * - dth derivative (0<=k+l<=d)<br />
133
+ * @param r1
134
+ * - from control point (u direction; 0 for all control points)<br />
135
+ * @param r2
136
+ * - to control point (u direction; n for all control points)<br />
137
+ * @param s1
138
+ * - from control point (v direction; 0 for all control points)<br />
139
+ * @param s2
140
+ * - to control point (v direction; n for all control points)<br />
141
+ * @return ControlPoint4f[k][l][i][j] i,jth control point, differentiated k
142
+ * times<br />
143
+ * with respect to u and l times with respect to v
144
+ */
145
+ public Vec4D[][][][] surfaceDerivCpts(int d, int r1, int r2, int s1, int s2);
146
+
147
+ }
@@ -0,0 +1,331 @@
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.image.util;
29
+
30
+ import processing.core.PImage;
31
+
32
+ /**
33
+ * Filter8bit is a collection of non-destructive, threadsafe filters for
34
+ * grayscale images in Processing PImage format. All filters are implemented as
35
+ * static methods so no instance is needed.
36
+ *
37
+ * @version 0.1
38
+ */
39
+ public class Filter8bit {
40
+
41
+ private static int[] koff;
42
+
43
+ private static int prevKernelSize = -1;
44
+
45
+ private static int prevWidth = -1;
46
+
47
+ /**
48
+ *
49
+ * @param pix
50
+ * @param width
51
+ * @param height
52
+ * @param kernelSize
53
+ * @param filterConst
54
+ * @return
55
+ */
56
+ public static int[] adaptiveThreshold(int[] pix, int width, int height,
57
+ int kernelSize, int filterConst) {
58
+ int maxIdx = pix.length;
59
+ int[] dest = new int[maxIdx];
60
+ int kl = kernelSize * kernelSize;
61
+ int ck = kernelSize >> 1;
62
+ if (kl != prevKernelSize || width != prevWidth) {
63
+ System.out.println("recalc threshold filter kernel");
64
+ koff = new int[kl];
65
+ prevKernelSize = kl;
66
+ prevWidth = width;
67
+ for (int k = 0, off = -width * ck - ck; k < kl; k++) {
68
+ koff[k] = off;
69
+ if ((k % kernelSize) == kernelSize - 1) {
70
+ off += width - kernelSize + 1;
71
+ } else {
72
+ off++;
73
+ }
74
+ }
75
+ }
76
+ for (int i = 0; i < maxIdx; i++) {
77
+ int mean = 0;
78
+ for (int k = 0; k < kl; k++) {
79
+ int idx = i + koff[k];
80
+ if (idx >= 0 && idx < maxIdx) {
81
+ mean += pix[idx] & 0xff;
82
+ }
83
+ }
84
+ mean = (mean / kl) - filterConst;
85
+ if ((pix[i] & 0xff) > mean) {
86
+ dest[i] = 0xff0000ff;
87
+ } else {
88
+ dest[i] = 0xff000000;
89
+ }
90
+ }
91
+ return dest;
92
+ }
93
+
94
+ /**
95
+ * Non-destructively applies an adaptive thresholding filter to the passed
96
+ * in image (grayscale only). Filter8bit only uses data stored in the blue
97
+ * channel of the image (lowest 8 bit).
98
+ *
99
+ * @param img
100
+ * image to be filtered
101
+ * @param ks
102
+ * kernel size
103
+ * @param c
104
+ * constant integer value to be subtracted from kernel result
105
+ * @return filtered version of the image (with alpha channel set to full
106
+ * opacity)
107
+ */
108
+
109
+ public static PImage adaptiveThreshold(PImage img, int ks, int c) {
110
+ PImage img2 = new PImage(img.width, img.height);
111
+ img2.format = img.format;
112
+ img2.pixels = adaptiveThreshold(img.pixels, img.width, img.height, ks,
113
+ c);
114
+ return img2;
115
+ }
116
+
117
+ /**
118
+ * @param pixels
119
+ * @param width
120
+ * @param height
121
+ * @param isInverted
122
+ * @return filtered pixel array
123
+ */
124
+ public static int[] erodePixels(int[] pixels, int width, int height,
125
+ boolean isInverted) {
126
+ int currIdx = 0;
127
+ int maxIdx = pixels.length;
128
+ int[] out = new int[maxIdx];
129
+
130
+ if (isInverted) {
131
+ // dilation (grow light areas)
132
+ while (currIdx < maxIdx) {
133
+ int currRowIdx = currIdx;
134
+ int maxRowIdx = currIdx + width;
135
+ while (currIdx < maxRowIdx) {
136
+ int colOrig, colOut;
137
+ colOrig = colOut = pixels[currIdx];
138
+ int idxLeft = currIdx - 1;
139
+ int idxRight = currIdx + 1;
140
+ int idxUp = currIdx - width;
141
+ int idxDown = currIdx + width;
142
+ if (idxLeft < currRowIdx) {
143
+ idxLeft = currIdx;
144
+ }
145
+ if (idxRight >= maxRowIdx) {
146
+ idxRight = currIdx;
147
+ }
148
+ if (idxUp < 0) {
149
+ idxUp = 0;
150
+ }
151
+ if (idxDown >= maxIdx) {
152
+ idxDown = currIdx;
153
+ }
154
+
155
+ int colUp = pixels[idxUp];
156
+ int colLeft = pixels[idxLeft];
157
+ int colDown = pixels[idxDown];
158
+ int colRight = pixels[idxRight];
159
+
160
+ // compute luminance
161
+ int currLum = colOrig & 0xff;
162
+ int lumLeft = colLeft & 0xff;
163
+ int lumRight = colRight & 0xff;
164
+ int lumUp = colUp & 0xff;
165
+ int lumDown = colDown & 0xff;
166
+
167
+ if (lumLeft > currLum) {
168
+ colOut = colLeft;
169
+ currLum = lumLeft;
170
+ }
171
+ if (lumRight > currLum) {
172
+ colOut = colRight;
173
+ currLum = lumRight;
174
+ }
175
+ if (lumUp > currLum) {
176
+ colOut = colUp;
177
+ currLum = lumUp;
178
+ }
179
+ if (lumDown > currLum) {
180
+ colOut = colDown;
181
+ currLum = lumDown;
182
+ }
183
+ out[currIdx++] = colOut;
184
+ }
185
+ }
186
+ } else {
187
+ // erode (grow dark areas)
188
+ while (currIdx < maxIdx) {
189
+ int currRowIdx = currIdx;
190
+ int maxRowIdx = currIdx + width;
191
+ while (currIdx < maxRowIdx) {
192
+ int colOrig, colOut;
193
+ colOrig = colOut = pixels[currIdx];
194
+ int idxLeft = currIdx - 1;
195
+ int idxRight = currIdx + 1;
196
+ int idxUp = currIdx - width;
197
+ int idxDown = currIdx + width;
198
+ if (idxLeft < currRowIdx) {
199
+ idxLeft = currIdx;
200
+ }
201
+ if (idxRight >= maxRowIdx) {
202
+ idxRight = currIdx;
203
+ }
204
+ if (idxUp < 0) {
205
+ idxUp = 0;
206
+ }
207
+ if (idxDown >= maxIdx) {
208
+ idxDown = currIdx;
209
+ }
210
+
211
+ int colUp = pixels[idxUp];
212
+ int colLeft = pixels[idxLeft];
213
+ int colDown = pixels[idxDown];
214
+ int colRight = pixels[idxRight];
215
+
216
+ // compute luminance
217
+ int currLum = colOrig & 0xff;
218
+ int lumLeft = colLeft & 0xff;
219
+ int lumRight = colRight & 0xff;
220
+ int lumUp = colUp & 0xff;
221
+ int lumDown = colDown & 0xff;
222
+
223
+ if (lumLeft < currLum) {
224
+ colOut = colLeft;
225
+ currLum = lumLeft;
226
+ }
227
+ if (lumRight < currLum) {
228
+ colOut = colRight;
229
+ currLum = lumRight;
230
+ }
231
+ if (lumUp < currLum) {
232
+ colOut = colUp;
233
+ currLum = lumUp;
234
+ }
235
+ if (lumDown < currLum) {
236
+ colOut = colDown;
237
+ currLum = lumDown;
238
+ }
239
+ out[currIdx++] = colOut;
240
+ }
241
+ }
242
+ }
243
+ return out;
244
+ }
245
+
246
+ /**
247
+ * @param img
248
+ * @param isInverted
249
+ * @return filtered result as new image
250
+ */
251
+ public static PImage erodePixels(PImage img, boolean isInverted) {
252
+ PImage img2 = new PImage(img.width, img.height);
253
+ img2.format = img.format;
254
+ img2.pixels = erodePixels(img.pixels, img.width, img.height, isInverted);
255
+ return img2;
256
+ }
257
+
258
+ /**
259
+ *
260
+ * @param srcpix
261
+ * @param lolim
262
+ * @param uplim
263
+ * @return
264
+ */
265
+ public static int[] stretchLevels(int[] srcpix, int lolim, int uplim) {
266
+ int min = srcpix[0] & 0xff;
267
+ int max = srcpix[0] & 0xff;
268
+ int src_rgb;
269
+ int result;
270
+ float quotient = 0;
271
+
272
+ int[] dest = new int[srcpix.length];
273
+
274
+ // Find the max and min values
275
+ for (int i = 0; i < srcpix.length; i++) {
276
+ src_rgb = srcpix[i] & 0xff;
277
+ if (src_rgb < min) {
278
+ min = src_rgb;
279
+ } else if (src_rgb > max) {
280
+ max = src_rgb;
281
+ }
282
+ }
283
+ quotient = (((float) (uplim - lolim)) / ((float) (max - min)));
284
+ // Calculate the output values
285
+ for (int i = 0; i < srcpix.length; i++) {
286
+ src_rgb = srcpix[i] & 0xff;
287
+ result = (int) ((src_rgb - min) * quotient) + lolim;
288
+ if (result > 255) {
289
+ result = 255;
290
+ } else if (result < 0) {
291
+ result = 0;
292
+ }
293
+ dest[i] = 0xff000000 | result;
294
+ }
295
+ return dest;
296
+ }
297
+
298
+ /**
299
+ * Non-destructively stretches levels of an 8bit grayscale image
300
+ *
301
+ * @param img
302
+ * Image to be level stretched
303
+ * @param uplim
304
+ * The upper limit for the values to be stretched between
305
+ * @param lolim
306
+ * The lower limit for the values to be stretched between
307
+ * @return filtered version of the image (with alpha channel set to full
308
+ * opacity)
309
+ */
310
+
311
+ public static PImage stretchLevels(PImage img, int lolim, int uplim) {
312
+ PImage img2 = new PImage(img.width, img.height);
313
+ img2.format = img.format;
314
+ img2.pixels = stretchLevels(img.pixels, lolim, uplim);
315
+ return img2;
316
+ }
317
+
318
+ /**
319
+ *
320
+ * @param pix
321
+ * @param threshold
322
+ * @return
323
+ */
324
+ public static int[] threshold(int[] pix, int threshold) {
325
+ int[] dest = new int[pix.length];
326
+ for (int i = 0; i < pix.length; i++) {
327
+ dest[i] = (pix[i] & 0xff) > threshold ? 0xff0000ff : 0xff000000;
328
+ }
329
+ return dest;
330
+ }
331
+ }