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,833 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+ package toxi.geom;
28
+
29
+ import java.util.Arrays;
30
+ import toxi.math.InterpolateStrategy;
31
+ import toxi.math.MathUtils;
32
+
33
+ /**
34
+ * A double precision, general, dynamically-resizable, one-dimensional vector
35
+ * class.
36
+ */
37
+ public class GVector implements java.lang.Cloneable, java.io.Serializable {
38
+
39
+ private int length;
40
+
41
+ /**
42
+ *
43
+ */
44
+ public double[] values;
45
+
46
+ static final long serialVersionUID = 1L;
47
+
48
+ /**
49
+ * Constructs a new GVector of the specified length and initializes it by
50
+ * copying the specified number of elements from the specified array. The
51
+ * array must contain at least <code>length</code> elements (i.e.,
52
+ * <code>vector.length</code> >= <code>length</code>. The length of this new
53
+ * GVector is set to the specified length.
54
+ *
55
+ * @param vector The array from which the values will be copied.
56
+ * @param length The number of values copied from the array.
57
+ */
58
+ public GVector(double vector[], int length) {
59
+ this.length = length;
60
+ values = new double[length];
61
+ System.arraycopy(vector, 0, values, 0, length);
62
+ }
63
+
64
+ /**
65
+ * Constructs a new GVector from the specified array elements. The length of
66
+ * this GVector is set to the length of the specified array. The array
67
+ * elements are copied into this new GVector.
68
+ *
69
+ * @param vector the values for the new GVector.
70
+ */
71
+ public GVector(double[] vector) {
72
+ length = vector.length;
73
+ values = new double[vector.length];
74
+ System.arraycopy(vector, 0, values, 0, length);
75
+ }
76
+
77
+ /**
78
+ * Constructs a new GVector from the specified vector. The vector elements
79
+ * are copied into this new GVector.
80
+ *
81
+ * @param vector the source GVector for this new GVector.
82
+ */
83
+ public GVector(GVector vector) {
84
+ values = new double[vector.length];
85
+ length = vector.length;
86
+ System.arraycopy(vector.values, 0, values, 0, length);
87
+ }
88
+
89
+ /**
90
+ * Constructs a new GVector of the specified length with all vector elements
91
+ * initialized to 0.
92
+ *
93
+ * @param length the number of elements in this GVector.
94
+ */
95
+ public GVector(int length) {
96
+ this.length = length;
97
+ values = new double[length];
98
+ for (int i = 0; i < length; i++) {
99
+ values[i] = 0.0;
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Constructs a new GVector and copies the initial values from the specified
105
+ * tuple.
106
+ *
107
+ * @param v the source for the new GVector's initial values
108
+ */
109
+ public GVector(ReadonlyVec2D v) {
110
+ values = new double[]{
111
+ v.x(), v.y()
112
+ };
113
+ length = 2;
114
+ }
115
+
116
+ /**
117
+ * Constructs a new GVector and copies the initial values from the specified
118
+ * tuple.
119
+ *
120
+ * @param v the source for the new GVector's initial values
121
+ */
122
+ public GVector(ReadonlyVec3D v) {
123
+ values = new double[]{
124
+ v.x(), v.y(), v.z()
125
+ };
126
+ length = 3;
127
+ }
128
+
129
+ /**
130
+ * Constructs a new GVector and copies the initial values from the specified
131
+ * tuple.
132
+ *
133
+ * @param v the source for the new GVector's initial values
134
+ */
135
+ public GVector(ReadonlyVec4D v) {
136
+ values = new double[]{
137
+ v.x(), v.y(), v.z(), v.w()
138
+ };
139
+ length = 4;
140
+ }
141
+
142
+ /**
143
+ * Creates the vector sum of this vector and the given one (must be equal
144
+ * sized). Returns result as new vector.
145
+ *
146
+ * @param v
147
+ * @return new vector
148
+ */
149
+ public final GVector add(GVector v) {
150
+ if (length != v.length) {
151
+ throw new MatrixSizeException();
152
+ }
153
+ double[] tmp = new double[length];
154
+ for (int i = 0; i < length; i++) {
155
+ tmp[i] = values[i] + v.values[i];
156
+ }
157
+ return new GVector(tmp);
158
+ }
159
+
160
+ /**
161
+ * Sets the value of this vector to sum of itself and the specified vector
162
+ *
163
+ * @param vector the second vector
164
+ * @return itself
165
+ */
166
+ public final GVector addSelf(GVector vector) {
167
+ if (length != vector.length) {
168
+ throw new MatrixSizeException();
169
+ }
170
+ for (int i = 0; i < length; i++) {
171
+ this.values[i] += vector.values[i];
172
+ }
173
+ return this;
174
+ }
175
+
176
+ /**
177
+ * Returns the (n-space) angle in radians between this vector and the vector
178
+ * parameter; the return value is constrained to the range [0,PI].
179
+ *
180
+ * @param v The other vector
181
+ * @return The angle in radians in the range [0,PI]
182
+ */
183
+ public final double angleBetween(GVector v) {
184
+ return (Math.acos(this.dot(v) / (this.magnitude() * v.magnitude())));
185
+ }
186
+
187
+ /**
188
+ * LU Decomposition Back Solve; this method takes the LU matrix and the
189
+ * permutation vector produced by the GMatrix method LUD and solves the
190
+ * equation (LU)*x = b by placing the solution vector x into this vector.
191
+ * This vector should be the same length or longer than b.
192
+ *
193
+ * @param LU The matrix into which the lower and upper decompostions have
194
+ * been placed
195
+ * @param b The b vector in the equation (LU)*x = b
196
+ * @param permutation The row permuations that were necessary to produce the
197
+ * LU matrix parameter
198
+ */
199
+ public final void backSolveLUD(GMatrix LU, GVector b, GVector permutation) {
200
+ int size = LU.nRow * LU.nCol;
201
+
202
+ double[] temp = new double[size];
203
+ double[] result = new double[size];
204
+ int[] row_perm = new int[b.size()];
205
+ int i, j;
206
+
207
+ if (LU.nRow != b.size()) {
208
+ throw new MatrixSizeException();
209
+ }
210
+
211
+ if (LU.nRow != permutation.size()) {
212
+ throw new MatrixSizeException();
213
+ }
214
+
215
+ if (LU.nRow != LU.nCol) {
216
+ throw new MatrixSizeException();
217
+ }
218
+
219
+ for (i = 0; i < LU.nRow; i++) {
220
+ for (j = 0; j < LU.nCol; j++) {
221
+ temp[i * LU.nCol + j] = LU.values[i][j];
222
+ }
223
+ }
224
+
225
+ for (i = 0; i < LU.nRow; i++) {
226
+ result[i * LU.nCol] = b.values[i];
227
+ }
228
+ for (i = 0; i < LU.nCol; i++) {
229
+ row_perm[i] = (int) permutation.values[i];
230
+ }
231
+
232
+ GMatrix.backSubstituteLU(LU.nRow, temp, row_perm, result);
233
+
234
+ for (i = 0; i < LU.nRow; i++) {
235
+ this.values[i] = result[i * LU.nCol];
236
+ }
237
+ }
238
+
239
+ /**
240
+ * Solves for x in Ax = b, where x is this vector (nx1), A is mxn, b is mx1,
241
+ * and A = U*W*transpose(V); U,W,V must be precomputed and can be found by
242
+ * taking the singular value decomposition (SVD) of A using the method SVD
243
+ * found in the GMatrix class.
244
+ *
245
+ * @param U The U matrix produced by the GMatrix method SVD
246
+ * @param W The W matrix produced by the GMatrix method SVD
247
+ * @param V The V matrix produced by the GMatrix method SVD
248
+ * @param b The b vector in the linear equation Ax = b
249
+ */
250
+ public final void backSolveSVD(GMatrix U, GMatrix W, GMatrix V, GVector b) {
251
+ if (!(U.nRow == b.size() && U.nRow == U.nCol && U.nRow == W.nRow)) {
252
+ throw new MatrixSizeException();
253
+ }
254
+ if (!(W.nCol == values.length && W.nCol == V.nCol && W.nCol == V.nRow)) {
255
+ throw new MatrixSizeException();
256
+ }
257
+ GMatrix tmp = new GMatrix(U.nRow, W.nCol);
258
+ tmp.mul(U, V);
259
+ tmp.mulTransposeRight(U, W);
260
+ tmp.invert();
261
+ mul(tmp, b);
262
+ }
263
+
264
+ /**
265
+ * Creates a new object of the same class as this object.
266
+ *
267
+ * @return a clone of this instance.
268
+ * @exception OutOfMemoryError if there is not enough memory.
269
+ * @see java.lang.Cloneable
270
+ * @since vecmath 1.3
271
+ */
272
+
273
+
274
+ // public Object clone() {
275
+ // GVector v = null;
276
+ // try {
277
+ // v = (GVector) super.clone();
278
+ // } catch (CloneNotSupportedException e) {
279
+ // throw new InternalError();
280
+ // }
281
+ // v.values = new double[length];
282
+ // System.arraycopy(values, 0, v.values, 0, length);
283
+ // return v;
284
+ // }
285
+
286
+ /**
287
+ * Returns the dot product of this vector and vector v.
288
+ *
289
+ * @param v the other vector
290
+ * @return the dot product of this and v
291
+ */
292
+ public final double dot(GVector v) {
293
+ if (length != v.length) {
294
+ throw new MatrixSizeException();
295
+ }
296
+ double result = 0.0;
297
+ for (int i = 0; i < length; i++) {
298
+ result += values[i] * v.values[i];
299
+ }
300
+ return result;
301
+ }
302
+
303
+ /**
304
+ * Returns true if all of the data members of GVector vector1 are equal to
305
+ * the corresponding data members in this GVector.
306
+ *
307
+ * @param vector1 The vector with which the comparison is made.
308
+ * @return true or false
309
+ */
310
+ public boolean equals(GVector vector1) {
311
+ try {
312
+ if (length != vector1.length) {
313
+ return false;
314
+ }
315
+ for (int i = 0; i < length; i++) {
316
+ if (values[i] != vector1.values[i]) {
317
+ return false;
318
+ }
319
+ }
320
+ return true;
321
+ } catch (NullPointerException e) {
322
+ return false;
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Returns true if the Object o1 is of type GMatrix and all of the data
328
+ * members of o1 are equal to the corresponding data members in this
329
+ * GMatrix.
330
+ *
331
+ * @param o1 The object with which the comparison is made.
332
+ * @return true or false
333
+ */
334
+ @Override
335
+ public boolean equals(Object o1) {
336
+ if (o1 instanceof GVector) {
337
+ GVector v2 = (GVector) o1;
338
+ if (length != v2.length) {
339
+ return false;
340
+ }
341
+ for (int i = 0; i < length; i++) {
342
+ if (values[i] != v2.values[i]) {
343
+ return false;
344
+ }
345
+ }
346
+ return true;
347
+ }
348
+ return false;
349
+ }
350
+
351
+ /**
352
+ * Returns a hash code value based on the data values in this object. Two
353
+ * different GVector objects with identical data values (i.e.,
354
+ * GVector.equals returns true) will return the same hash number. Two
355
+ * GVector objects with different data members may return the same hash
356
+ * value, although this is not likely.
357
+ *
358
+ * @return the integer hash code value
359
+ */
360
+
361
+ @Override
362
+ public int hashCode() {
363
+ int hash = 5;
364
+ hash = 43 * hash + this.length;
365
+ hash = 43 * hash + Arrays.hashCode(this.values);
366
+ return hash;
367
+ }
368
+
369
+ /**
370
+ * Returns true if the L-infinite distance between this vector and vector v
371
+ * is less than or equal to the tolerance parameter, otherwise returns
372
+ * false. The L-infinite distance is equal to MAX[abs(x1-x2), abs(y1-y2), .
373
+ * . . ].
374
+ *
375
+ * @param v The vector to be compared to this vector
376
+ * @param tolerance the threshold value
377
+ * @return
378
+ */
379
+ public boolean equalsWithTolerance(GVector v, double tolerance) {
380
+ if (v instanceof GVector) {
381
+ double diff;
382
+ if (length != v.length) {
383
+ return false;
384
+ }
385
+ for (int i = 0; i < length; i++) {
386
+ diff = values[i] - v.values[i];
387
+ if ((diff < 0 ? -diff : diff) > tolerance) {
388
+ return false;
389
+ }
390
+ }
391
+ return true;
392
+ }
393
+ return false;
394
+ }
395
+
396
+ /**
397
+ * Retrieves the value at the specified index value of this vector.
398
+ *
399
+ * @param index the index of the element to retrieve (zero indexed)
400
+ * @return the value at the indexed element
401
+ */
402
+ public final double get(int index) {
403
+ return values[index];
404
+ }
405
+
406
+ /**
407
+ * Linearly interpolates this vector to the target vector and places the
408
+ * result into a new instance: result = this + (target-this)*alpha. The
409
+ * target vector needs to be equal sized.
410
+ *
411
+ * @param v the target vector
412
+ * @param alpha the alpha interpolation parameter
413
+ * @return result as new vector
414
+ */
415
+ public final GVector interpolateTo(GVector v, double alpha) {
416
+ if (length != v.length) {
417
+ throw new MatrixSizeException();
418
+ }
419
+ return new GVector(this).interpolateToSelf(v, alpha);
420
+ }
421
+
422
+ /**
423
+ * Interpolates the vector towards the given target vector, using the given
424
+ * {@link InterpolateStrategy}. The target vector needs to be equal sized.
425
+ *
426
+ * @param v target vector
427
+ * @param alpha interpolation factor (should be in the range 0..1)
428
+ * @param strategy InterpolateStrategy instance
429
+ *
430
+ * @return result as new vector
431
+ */
432
+ public final GVector interpolateTo(GVector v, double alpha,
433
+ InterpolateStrategy strategy) {
434
+ if (length != v.length) {
435
+ throw new MatrixSizeException();
436
+ }
437
+ return new GVector(this).interpolateToSelf(v, alpha, strategy);
438
+ }
439
+
440
+ /**
441
+ * Linearly interpolates this vector to the target vector and places result
442
+ * in this vector. result = this + (target-this)*alpha. The target vector
443
+ * needs to be equal sized.
444
+ *
445
+ * @param v the target vector
446
+ * @param alpha the alpha interpolation parameter
447
+ * @return
448
+ */
449
+ public final GVector interpolateToSelf(GVector v, double alpha) {
450
+ if (v.length != length) {
451
+ throw new MatrixSizeException();
452
+ }
453
+ for (int i = 0; i < length; i++) {
454
+ values[i] += (v.values[i] - values[i]) * alpha;
455
+ }
456
+ return this;
457
+ }
458
+
459
+ /**
460
+ * Interpolates the vector towards the given target vector, using the given
461
+ * {@link InterpolateStrategy}. The target vector needs to be equal sized.
462
+ *
463
+ * @param v target vector
464
+ * @param alpha interpolation factor (should be in the range 0..1)
465
+ * @param strategy InterpolateStrategy instance
466
+ *
467
+ * @return itself, result overrides current vector
468
+ */
469
+ public final GVector interpolateToSelf(GVector v, double alpha,
470
+ InterpolateStrategy strategy) {
471
+ if (v.length != length) {
472
+ throw new MatrixSizeException();
473
+ }
474
+ for (int i = 0; i < length; i++) {
475
+ values[i] = strategy.interpolate(values[i], v.values[i], alpha);
476
+ }
477
+ return this;
478
+ }
479
+
480
+ /**
481
+ * Negates the value of this vector: this = -this.
482
+ */
483
+ public final void invert() {
484
+ for (int i = 0; i < length; i++) {
485
+ this.values[i] *= -1.0;
486
+ }
487
+ }
488
+
489
+ /**
490
+ * Returns the square root of the sum of the squares of this vector (its
491
+ * length in n-dimensional space).
492
+ *
493
+ * @return length of this vector
494
+ */
495
+ public final double magnitude() {
496
+ double sq = 0.0;
497
+ for (int i = 0; i < length; i++) {
498
+ sq += values[i] * values[i];
499
+ }
500
+ return Math.sqrt(sq);
501
+ }
502
+
503
+ /**
504
+ * Returns the sum of the squares of this vector (its length squared in
505
+ * n-dimensional space).
506
+ *
507
+ * @return length squared of this vector
508
+ */
509
+ public final double magSquared() {
510
+ double sq = 0.0;
511
+ for (int i = 0; i < length; i++) {
512
+ sq += values[i] * values[i];
513
+ }
514
+ return sq;
515
+ }
516
+
517
+ /**
518
+ * Multiplies matrix m1 times Vector v1 and places the result into this
519
+ * vector (this = m1*v1).
520
+ *
521
+ * @param m1 The matrix in the multiplication
522
+ * @param v1 The vector that is multiplied
523
+ */
524
+ public final void mul(GMatrix m1, GVector v1) {
525
+ if (m1.getNumCol() != v1.length) {
526
+ throw new MatrixSizeException();
527
+ }
528
+
529
+ if (length != m1.getNumRow()) {
530
+ throw new MatrixSizeException();
531
+ }
532
+
533
+ double v[];
534
+ if (v1 != this) {
535
+ v = v1.values;
536
+ } else {
537
+ v = values.clone();
538
+ }
539
+
540
+ for (int j = length - 1; j >= 0; j--) {
541
+ values[j] = 0.0;
542
+ for (int i = v1.length - 1; i >= 0; i--) {
543
+ values[j] += m1.values[j][i] * v[i];
544
+ }
545
+ }
546
+ }
547
+
548
+ /**
549
+ * Multiplies the transpose of vector v1 (ie, v1 becomes a row vector with
550
+ * respect to the multiplication) times matrix m1 and places the result into
551
+ * this vector (this = transpose(v1)*m1). The result is technically a row
552
+ * vector, but the GVector class only knows about column vectors, and so the
553
+ * result is stored as a column vector.
554
+ *
555
+ * @param m1 The matrix in the multiplication
556
+ * @param v1 The vector that is temporarily transposed
557
+ */
558
+ public final void mul(GVector v1, GMatrix m1) {
559
+ if (m1.getNumRow() != v1.length) {
560
+ throw new MatrixSizeException();
561
+ }
562
+
563
+ if (length != m1.getNumCol()) {
564
+ throw new MatrixSizeException();
565
+ }
566
+
567
+ double v[];
568
+ if (v1 != this) {
569
+ v = v1.values;
570
+ } else {
571
+ v = values.clone();
572
+ }
573
+
574
+ for (int j = length - 1; j >= 0; j--) {
575
+ values[j] = 0.0;
576
+ for (int i = v1.length - 1; i >= 0; i--) {
577
+ values[j] += m1.values[i][j] * v[i];
578
+ }
579
+ }
580
+ }
581
+
582
+ /**
583
+ * Normalizes this vector in place.
584
+ */
585
+ public final void normalize() {
586
+ double mag = magnitude();
587
+ if (mag > MathUtils.EPS) {
588
+ double invMag = 1.0 / mag;
589
+ for (int i = 0; i < length; i++) {
590
+ values[i] = values[i] * invMag;
591
+ }
592
+ }
593
+ }
594
+
595
+ /**
596
+ * Scales this vector by the scale factor s and returns result as new
597
+ * vector.
598
+ *
599
+ * @param s the scalar value
600
+ * @return new vector
601
+ */
602
+ public final GVector scale(double s) {
603
+ double[] tmp = new double[length];
604
+ for (int i = 0; i < length; i++) {
605
+ tmp[i] = values[i] * s;
606
+ }
607
+ return new GVector(tmp);
608
+ }
609
+
610
+ /**
611
+ * Scales the values of this vector with the values of the given vector
612
+ * vector (this = this * vector). Returns result as new vector.
613
+ *
614
+ * @param v scale vector
615
+ * @return new vector
616
+ */
617
+ public final GVector scale(GVector v) {
618
+ if (length != v.length) {
619
+ throw new MatrixSizeException();
620
+ }
621
+ double[] tmp = new double[length];
622
+ for (int i = 0; i < length; i++) {
623
+ tmp[i] = values[i] * v.values[i];
624
+ }
625
+ return new GVector(tmp);
626
+ }
627
+
628
+ /**
629
+ * Scales this vector by the scale factor s.
630
+ *
631
+ * @param s the scalar value
632
+ * @return itself
633
+ */
634
+ public final GVector scaleSelf(double s) {
635
+ for (int i = 0; i < length; i++) {
636
+ values[i] = values[i] * s;
637
+ }
638
+ return this;
639
+ }
640
+
641
+ /**
642
+ * Scales the values of this vector with the values of the given vector
643
+ * vector (this = this * vector).
644
+ *
645
+ * @param v scale vector
646
+ * @return itself
647
+ */
648
+ public final GVector scaleSelf(GVector v) {
649
+ if (length != v.length) {
650
+ throw new MatrixSizeException();
651
+ }
652
+ for (int i = 0; i < length; i++) {
653
+ this.values[i] *= v.values[i];
654
+ }
655
+ return this;
656
+ }
657
+
658
+ /**
659
+ * Sets the values of this vector to the values found in the array
660
+ * parameter. If the array is shorter than the number of values in this
661
+ * vector the remaining values are zeroed. If the array is longer, only the
662
+ * first values up to to the vector length are copied.
663
+ *
664
+ * @param vector the source array
665
+ * @return
666
+ */
667
+ public final GVector set(double[] vector) {
668
+ int i;
669
+ if (vector.length >= length) {
670
+ for (i = 0; i < length; i++) {
671
+ values[i] = vector[i];
672
+ }
673
+ } else {
674
+ for (i = 0; i < vector.length; i++) {
675
+ values[i] = vector[i];
676
+ }
677
+ for (i = vector.length; i < length; i++) {
678
+ values[i] = 0.0;
679
+ }
680
+ }
681
+ return this;
682
+ }
683
+
684
+ /**
685
+ * Sets the value of this vector to the values found in vector vector.
686
+ *
687
+ * @param vector the source vector
688
+ * @return
689
+ */
690
+ public final GVector set(GVector vector) {
691
+ return set(vector.values);
692
+ }
693
+
694
+ /**
695
+ * Sets the value of this vector to the values in tuple
696
+ *
697
+ * @param tuple the source for the new GVector's new values
698
+ * @return
699
+ */
700
+ public final GVector set(ReadonlyVec2D tuple) {
701
+ return set(new double[]{
702
+ tuple.x(), tuple.y()
703
+ });
704
+ }
705
+
706
+ /**
707
+ * Sets the value of this vector to the values in tuple
708
+ *
709
+ * @param tuple the source for the new GVector's new values
710
+ * @return
711
+ */
712
+ public final GVector set(ReadonlyVec3D tuple) {
713
+ return set(new double[]{
714
+ tuple.x(), tuple.y(), tuple.z()
715
+ });
716
+ }
717
+
718
+ /**
719
+ * Sets the value of this vector to the values in tuple
720
+ *
721
+ * @param tuple the source for the new GVector's new values
722
+ * @return itself
723
+ */
724
+ public final GVector set(ReadonlyVec4D tuple) {
725
+ return set(new double[]{
726
+ tuple.x(), tuple.y(), tuple.w()
727
+ });
728
+ }
729
+
730
+ /**
731
+ * Modifies the value at the specified index of this vector.
732
+ *
733
+ * @param index the index if the element to modify (zero indexed)
734
+ * @param value the new vector element value
735
+ * @return
736
+ */
737
+ public final GVector setElement(int index, double value) {
738
+ values[index] = value;
739
+ return this;
740
+ }
741
+
742
+ /**
743
+ * Changes the size of this vector dynamically. If the size is increased no
744
+ * data values will be lost. If the size is decreased, only those data
745
+ * values whose vector positions were eliminated will be lost.
746
+ *
747
+ * @param length number of desired elements in this vector
748
+ * @return
749
+ */
750
+ public final GVector setSize(int length) {
751
+ double[] tmp = new double[length];
752
+ int max;
753
+ if (this.length < length) {
754
+ max = this.length;
755
+ } else {
756
+ max = length;
757
+ }
758
+ System.arraycopy(values, 0, tmp, 0, max);
759
+ this.length = length;
760
+ values = tmp;
761
+ return this;
762
+ }
763
+
764
+ /**
765
+ * Returns the number of elements in this vector.
766
+ *
767
+ * @return number of elements in this vector
768
+ */
769
+ public final int size() {
770
+ return values.length;
771
+ }
772
+
773
+ /**
774
+ * Creates the vector difference of this vector and the given one (must be
775
+ * equal sized). Returns result as new vector.
776
+ *
777
+ * @param v
778
+ * @return new vector
779
+ */
780
+ public final GVector sub(GVector v) {
781
+ if (length != v.length) {
782
+ throw new MatrixSizeException();
783
+ }
784
+ double[] tmp = new double[length];
785
+ for (int i = 0; i < length; i++) {
786
+ tmp[i] = values[i] - v.values[i];
787
+ }
788
+ return new GVector(tmp);
789
+ }
790
+
791
+ /**
792
+ * Sets the value of this vector to the vector difference of itself and
793
+ * vector (this = this - vector).
794
+ *
795
+ * @param vector the other vector
796
+ * @return
797
+ */
798
+ public final GVector subSelf(GVector vector) {
799
+ if (length != vector.length) {
800
+ throw new MatrixSizeException();
801
+ }
802
+ for (int i = 0; i < length; i++) {
803
+ this.values[i] -= vector.values[i];
804
+ }
805
+ return this;
806
+ }
807
+
808
+ /**
809
+ * Returns a string that contains the values of this GVector.
810
+ *
811
+ * @return the String representation
812
+ */
813
+ @Override
814
+ public String toString() {
815
+ StringBuilder buffer = new StringBuilder(length * 8);
816
+ for (int i = 0; i < length; i++) {
817
+ buffer.append(values[i]).append(" ");
818
+ }
819
+ return buffer.toString();
820
+ }
821
+
822
+ /**
823
+ * Sets all the values in this vector to zero.
824
+ *
825
+ * @return
826
+ */
827
+ public final GVector zero() {
828
+ for (int i = 0; i < length; i++) {
829
+ this.values[i] = 0.0;
830
+ }
831
+ return this;
832
+ }
833
+ }