Package not found. Please check the package name and try again.

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,45 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+
28
+ package toxi.geom;
29
+
30
+ /**
31
+ * Defines an interface for clipping 2D polygons. Currently the only
32
+ * implementation for this available is {@link SutherlandHodgemanClipper}.
33
+ */
34
+ public interface PolygonClipper2D {
35
+
36
+ /**
37
+ * Creates a clipped version of the polygon to the boundary shape set.
38
+ *
39
+ * @param poly
40
+ * polygon to be clipped
41
+ * @return clipped poly
42
+ */
43
+ public Polygon2D clipPolygon(Polygon2D poly);
44
+
45
+ }
@@ -0,0 +1,20 @@
1
+ package toxi.geom;
2
+
3
+ import java.util.List;
4
+
5
+ /**
6
+ *
7
+ * @author tux
8
+ */
9
+ public interface PolygonTesselator {
10
+
11
+ /**
12
+ * Tesselates the given polygon into a set of triangles.
13
+ *
14
+ * @param poly
15
+ * polygon
16
+ * @return list of triangles
17
+ */
18
+ public List<Triangle2D> tesselatePolygon(Polygon2D poly);
19
+
20
+ }
@@ -0,0 +1,44 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+
28
+ package toxi.geom;
29
+
30
+ /**
31
+ * This interface is the core part of the visitor pattern application for
32
+ * {@link PointQuadtree}s. It can be used to apply a procedure to all tree nodes
33
+ * when passed to {@link PointQuadtree#applyVisitor(QuadtreeVisitor)}.
34
+ */
35
+ public interface QuadtreeVisitor {
36
+
37
+ /**
38
+ * Applies the procedure defined by an implementation of this interface to
39
+ * the given tree node.
40
+ *
41
+ * @param node
42
+ */
43
+ void visitNode(PointQuadtree node);
44
+ }
@@ -0,0 +1,641 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+
28
+ package toxi.geom;
29
+
30
+ import javax.xml.bind.annotation.XmlAccessType;
31
+ import javax.xml.bind.annotation.XmlAccessorType;
32
+ import javax.xml.bind.annotation.XmlAttribute;
33
+
34
+ import toxi.math.InterpolateStrategy;
35
+ import toxi.math.MathUtils;
36
+
37
+ /**
38
+ * Quaternion implementation with SLERP based on http://is.gd/2n9s
39
+ */
40
+ @XmlAccessorType(XmlAccessType.FIELD)
41
+ public class Quaternion {
42
+
43
+ /**
44
+ *
45
+ */
46
+ public static final float DOT_THRESHOLD = 0.9995f;
47
+
48
+ /**
49
+ * Creates a Quaternion from a axis and a angle.
50
+ *
51
+ * @param axis
52
+ * axis vector (will be normalized)
53
+ * @param angle
54
+ * angle in radians.
55
+ *
56
+ * @return new quaternion
57
+ */
58
+ public static Quaternion createFromAxisAngle(ReadonlyVec3D axis, float angle) {
59
+ angle *= 0.5;
60
+ float sin = MathUtils.sin(angle);
61
+ float cos = MathUtils.cos(angle);
62
+ Quaternion q = new Quaternion(cos, axis.getNormalizedTo(sin));
63
+ return q;
64
+ }
65
+
66
+ /**
67
+ * Creates a Quaternion from Euler angles.
68
+ *
69
+ * @param pitch
70
+ * X-angle in radians.
71
+ * @param yaw
72
+ * Y-angle in radians.
73
+ * @param roll
74
+ * Z-angle in radians.
75
+ *
76
+ * @return new quaternion
77
+ */
78
+ public static Quaternion createFromEuler(float pitch, float yaw, float roll) {
79
+ pitch *= 0.5;
80
+ yaw *= 0.5;
81
+ roll *= 0.5;
82
+ float sinPitch = MathUtils.sin(pitch);
83
+ float cosPitch = MathUtils.cos(pitch);
84
+ float sinYaw = MathUtils.sin(yaw);
85
+ float cosYaw = MathUtils.cos(yaw);
86
+ float sinRoll = MathUtils.sin(roll);
87
+ float cosRoll = MathUtils.cos(roll);
88
+ float cosPitchCosYaw = cosPitch * cosYaw;
89
+ float sinPitchSinYaw = sinPitch * sinYaw;
90
+
91
+ Quaternion q = new Quaternion();
92
+
93
+ q.x = sinRoll * cosPitchCosYaw - cosRoll * sinPitchSinYaw;
94
+ q.y = cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw;
95
+ q.z = cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw;
96
+ q.w = cosRoll * cosPitchCosYaw + sinRoll * sinPitchSinYaw;
97
+
98
+ // alternative solution from:
99
+ // http://is.gd/6HdEB
100
+ //
101
+ // double c1 = Math.cos(yaw/2);
102
+ // double s1 = Math.sin(yaw/2);
103
+ // double c2 = Math.cos(pitch/2);
104
+ // double s2 = Math.sin(pitch/2);
105
+ // double c3 = Math.cos(roll/2);
106
+ // double s3 = Math.sin(roll/2);
107
+ // double c1c2 = c1*c2;
108
+ // double s1s2 = s1*s2;
109
+ // w =c1c2*c3 - s1s2*s3;
110
+ // x =c1c2*s3 + s1s2*c3;
111
+ // y =s1*c2*c3 + c1*s2*s3;
112
+ // z =c1*s2*c3 - s1*c2*s3;
113
+
114
+ return q;
115
+ }
116
+
117
+ /**
118
+ * Creates a quaternion from a rotation matrix. The algorithm used is from
119
+ * Allan and Mark Watt's "Advanced Animation and Rendering Techniques" (ACM
120
+ * Press 1992).
121
+ *
122
+ * @param m
123
+ * rotation matrix
124
+ * @return quaternion
125
+ */
126
+ public static Quaternion createFromMatrix(Matrix4x4 m) {
127
+
128
+ double s = 0.0f;
129
+ double[] q = new double[4];
130
+ double trace = m.matrix[0][0] + m.matrix[1][1] + m.matrix[2][2];
131
+ if (trace > 0.0f) {
132
+ s = 0.5 / Math.sqrt(trace + 1.0);
133
+ q[0] = (m.matrix[2][1] - m.matrix[1][2]) * s;
134
+ q[1] = (m.matrix[0][2] - m.matrix[2][0]) * s;
135
+ q[2] = (m.matrix[1][0] - m.matrix[0][1]) * s;
136
+ q[3] = 0.25 / s;
137
+ } else {
138
+ int[] nxt = new int[] {
139
+ 1, 2, 0
140
+ };
141
+ int i = 0, j = 0, k = 0;
142
+
143
+ if (m.matrix[1][1] > m.matrix[0][0]) {
144
+ i = 1;
145
+ }
146
+
147
+ if (m.matrix[2][2] > m.matrix[i][i]) {
148
+ i = 2;
149
+ }
150
+
151
+ j = nxt[i];
152
+ k = nxt[j];
153
+ s = 2.0f * Math
154
+ .sqrt((m.matrix[i][i] - m.matrix[j][j] - m.matrix[k][k]) + 1.0f);
155
+
156
+ double ss = 1.0 / s;
157
+ q[i] = s * 0.25f;
158
+ q[j] = (m.matrix[j][i] + m.matrix[i][j]) * ss;
159
+ q[k] = (m.matrix[k][i] + m.matrix[i][k]) * ss;
160
+ q[3] = (m.matrix[k][j] - m.matrix[j][k]) * ss;
161
+ }
162
+
163
+ return new Quaternion((float) q[3], (float) q[0], (float) q[1],
164
+ (float) q[2]);
165
+ }
166
+
167
+ /**
168
+ * Constructs a quaternion that rotates the vector given by the "forward"
169
+ * param into the direction given by the "dir" param.
170
+ *
171
+ * @param dir
172
+ * @param forward
173
+ * @return quaternion
174
+ */
175
+ public static Quaternion getAlignmentQuat(ReadonlyVec3D dir,
176
+ ReadonlyVec3D forward) {
177
+ Vec3D target = dir.getNormalized();
178
+ ReadonlyVec3D axis = forward.cross(target);
179
+ float length = axis.magnitude() + 0.0001f;
180
+ float angle = (float) Math.atan2(length, forward.dot(target));
181
+ return createFromAxisAngle(axis, angle);
182
+ }
183
+
184
+ @XmlAttribute(required = true)
185
+ public float x,
186
+
187
+ /**
188
+ *
189
+ */
190
+
191
+ /**
192
+ *
193
+ */
194
+ y,
195
+
196
+ /**
197
+ *
198
+ */
199
+ z,
200
+
201
+ /**
202
+ *
203
+ */
204
+ w;
205
+
206
+ /**
207
+ *
208
+ */
209
+ public Quaternion() {
210
+ identity();
211
+ }
212
+
213
+ /**
214
+ *
215
+ * @param w
216
+ * @param x
217
+ * @param y
218
+ * @param z
219
+ */
220
+ public Quaternion(float w, float x, float y, float z) {
221
+ this.w = w;
222
+ this.x = x;
223
+ this.y = y;
224
+ this.z = z;
225
+ }
226
+
227
+ /**
228
+ *
229
+ * @param w
230
+ * @param v
231
+ */
232
+ public Quaternion(float w, ReadonlyVec3D v) {
233
+ this.x = v.x();
234
+ this.y = v.y();
235
+ this.z = v.z();
236
+ this.w = w;
237
+ }
238
+
239
+ /**
240
+ *
241
+ * @param q
242
+ */
243
+ public Quaternion(Quaternion q) {
244
+ this.w = q.w;
245
+ this.x = q.x;
246
+ this.y = q.y;
247
+ this.z = q.z;
248
+ }
249
+
250
+ /**
251
+ *
252
+ * @param q
253
+ * @return
254
+ */
255
+ public Quaternion add(Quaternion q) {
256
+ return new Quaternion(x + q.x, y + q.y, z + q.z, w + q.w);
257
+ }
258
+
259
+ /**
260
+ *
261
+ * @param q
262
+ * @return
263
+ */
264
+ public Quaternion addSelf(Quaternion q) {
265
+ x += q.x;
266
+ y += q.y;
267
+ z += q.z;
268
+ w += q.w;
269
+ return this;
270
+ }
271
+
272
+ /**
273
+ *
274
+ * @param v
275
+ * @return
276
+ */
277
+ public Vec3D applyTo(Vec3D v) {
278
+ float ix = w * v.x + y * v.z - z * v.y;
279
+ float iy = w * v.y + z * v.x - x * v.z;
280
+ float iz = w * v.z + x * v.y - y * v.x;
281
+ float iw = -x * v.x - y * v.y - z * v.z;
282
+ float xx = ix * w - iw * x - iy * z + iz * y;
283
+ float yy = iy * w - iw * y - iz * x + ix * z;
284
+ float zz = iz * w - iw * z - ix * y + iy * x;
285
+ v.set(xx, yy, zz);
286
+ return v;
287
+ }
288
+
289
+ /**
290
+ *
291
+ * @return
292
+ */
293
+ public Quaternion copy() {
294
+ return new Quaternion(w, x, y, z);
295
+ }
296
+
297
+ /**
298
+ * Computes the dot product with the given quaternion.
299
+ *
300
+ * @param q
301
+ * @return dot product
302
+ */
303
+ public float dot(Quaternion q) {
304
+ return (x * q.x) + (y * q.y) + (z * q.z) + (w * q.w);
305
+ }
306
+
307
+ /**
308
+ * Computes this quaternion's conjugate, defined as the same w around the
309
+ * inverted axis.
310
+ *
311
+ * @return new conjugate quaternion
312
+ */
313
+ public Quaternion getConjugate() {
314
+ Quaternion q = new Quaternion();
315
+ q.x = -x;
316
+ q.y = -y;
317
+ q.z = -z;
318
+ q.w = w;
319
+ return q;
320
+ }
321
+
322
+ /**
323
+ * @deprecated use {@link #toMatrix4x4()} instead
324
+ * @return result matrix
325
+ */
326
+ @Deprecated
327
+ public Matrix4x4 getMatrix() {
328
+ return toMatrix4x4();
329
+ }
330
+
331
+ /**
332
+ * Computes normalized version of this quaternion.
333
+ *
334
+ * @return new normalized quaternion
335
+ */
336
+ public Quaternion getNormalized() {
337
+ return new Quaternion(this).normalize();
338
+ }
339
+
340
+ /**
341
+ *
342
+ * @return
343
+ */
344
+ public Quaternion identity() {
345
+ w = 1.0f;
346
+ x = 0.0f;
347
+ y = 0.0f;
348
+ z = 0.0f;
349
+ return this;
350
+ }
351
+
352
+ /**
353
+ * Spherical interpolation to target quaternion (code ported from <a href=
354
+ * "http://www.gamasutra.com/view/feature/3278/rotating_objects_using_quaternions.php"
355
+ * >GamaSutra</a>)
356
+ *
357
+ * @param target
358
+ * quaternion
359
+ * @param t
360
+ * interpolation factor (0..1)
361
+ * @return new interpolated quat
362
+ */
363
+ public Quaternion interpolateTo(Quaternion target, float t) {
364
+ return copy().interpolateToSelf(target, t);
365
+ }
366
+
367
+ /**
368
+ * @param target
369
+ * @param t
370
+ * @param is
371
+ * @return interpolated quaternion as new instance
372
+ */
373
+ public Quaternion interpolateTo(Quaternion target, float t,
374
+ InterpolateStrategy is) {
375
+ return copy().interpolateToSelf(target, is.interpolate(0, 1, t));
376
+ }
377
+
378
+ /**
379
+ * Spherical interpolation to target quaternion (code ported from <a href=
380
+ * "http://www.gamasutra.com/view/feature/3278/rotating_objects_using_quaternions.php"
381
+ * >GamaSutra</a>)
382
+ *
383
+ * @param target
384
+ * quaternion
385
+ * @param t
386
+ * interpolation factor (0..1)
387
+ * @return new interpolated quat
388
+ */
389
+ public Quaternion interpolateToSelf(Quaternion target, double t) {
390
+ double scale;
391
+ double invscale;
392
+ float dot = dot(target);
393
+ double theta = Math.acos(dot);
394
+ double sintheta = Math.sin(theta);
395
+ if (sintheta > 0.001f) {
396
+ scale = Math.sin(theta * (1.0 - t)) / sintheta;
397
+ invscale = Math.sin(theta * t) / sintheta;
398
+ } else {
399
+ scale = 1 - t;
400
+ invscale = t;
401
+ }
402
+ if (dot < 0) {
403
+ w = (float) (scale * w - invscale * target.w);
404
+ x = (float) (scale * x - invscale * target.x);
405
+ y = (float) (scale * y - invscale * target.y);
406
+ z = (float) (scale * z - invscale * target.z);
407
+ } else {
408
+ w = (float) (scale * w + invscale * target.w);
409
+ x = (float) (scale * x + invscale * target.x);
410
+ y = (float) (scale * y + invscale * target.y);
411
+ z = (float) (scale * z + invscale * target.z);
412
+ }
413
+ return normalize();
414
+ }
415
+
416
+ /**
417
+ * Uses spherical interpolation to approach the target quaternion. The
418
+ * interpolation factor is manipulated by the chosen
419
+ * {@link InterpolateStrategy} first.
420
+ *
421
+ * @param target
422
+ * @param t
423
+ * @param is
424
+ * @return itself
425
+ */
426
+ public Quaternion interpolateToSelf(Quaternion target, float t,
427
+ InterpolateStrategy is) {
428
+ return interpolateToSelf(target, is.interpolate(0, 1, t));
429
+ }
430
+
431
+ /**
432
+ *
433
+ * @return
434
+ */
435
+ public float magnitude() {
436
+ return (float) Math.sqrt(x * x + y * y + z * z + w * w);
437
+ }
438
+
439
+ /**
440
+ *
441
+ * @param q2
442
+ * @return
443
+ */
444
+ public Quaternion multiply(Quaternion q2) {
445
+ Quaternion res = new Quaternion();
446
+ res.w = w * q2.w - x * q2.x - y * q2.y - z * q2.z;
447
+ res.x = w * q2.x + x * q2.w + y * q2.z - z * q2.y;
448
+ res.y = w * q2.y + y * q2.w + z * q2.x - x * q2.z;
449
+ res.z = w * q2.z + z * q2.w + x * q2.y - y * q2.x;
450
+
451
+ return res;
452
+ }
453
+
454
+ /**
455
+ *
456
+ * @return
457
+ */
458
+ public Quaternion normalize() {
459
+ double mag = Math.sqrt(x * x + y * y + z * z + w * w);
460
+ if (mag > MathUtils.EPS) {
461
+ mag = 1.0 / mag;
462
+ x *= mag;
463
+ y *= mag;
464
+ z *= mag;
465
+ w *= mag;
466
+ }
467
+ return this;
468
+ }
469
+
470
+ /**
471
+ *
472
+ * @param t
473
+ * @return
474
+ */
475
+ public Quaternion scale(float t) {
476
+ return new Quaternion(x * t, y * t, z * t, w * t);
477
+ }
478
+
479
+ /**
480
+ *
481
+ * @param t
482
+ * @return
483
+ */
484
+ public Quaternion scaleSelf(float t) {
485
+ x *= t;
486
+ y *= t;
487
+ z *= t;
488
+ w *= t;
489
+ return this;
490
+ }
491
+
492
+ /**
493
+ *
494
+ * @param w
495
+ * @param x
496
+ * @param y
497
+ * @param z
498
+ * @return
499
+ */
500
+ public Quaternion set(float w, float x, float y, float z) {
501
+ this.w = w;
502
+ this.x = x;
503
+ this.y = y;
504
+ this.z = z;
505
+ return this;
506
+ }
507
+
508
+ /**
509
+ *
510
+ * @param w
511
+ * @param v
512
+ * @return
513
+ */
514
+ public Quaternion set(float w, Vec3D v) {
515
+ this.w = w;
516
+ x = v.x;
517
+ y = v.y;
518
+ z = v.z;
519
+ return this;
520
+ }
521
+
522
+ /**
523
+ *
524
+ * @param q
525
+ * @return
526
+ */
527
+ public Quaternion set(Quaternion q) {
528
+ w = q.w;
529
+ x = q.x;
530
+ y = q.y;
531
+ z = q.z;
532
+ return this;
533
+ }
534
+
535
+ /**
536
+ *
537
+ * @param q
538
+ * @return
539
+ */
540
+ public Quaternion sub(Quaternion q) {
541
+ return new Quaternion(x - q.x, y - q.y, z - q.z, w - q.w);
542
+ }
543
+
544
+ /**
545
+ *
546
+ * @param q
547
+ * @return
548
+ */
549
+ public Quaternion subSelf(Quaternion q) {
550
+ x -= q.x;
551
+ y -= q.y;
552
+ z -= q.z;
553
+ w -= q.w;
554
+ return this;
555
+ }
556
+
557
+ /**
558
+ *
559
+ * @return
560
+ */
561
+ public float[] toArray() {
562
+ return new float[] {
563
+ w, x, y, z
564
+ };
565
+ }
566
+
567
+ /**
568
+ * Converts the quaternion into a float array consisting of: rotation angle
569
+ * in radians, rotation axis x,y,z
570
+ *
571
+ * @return 4-element float array
572
+ */
573
+ public float[] toAxisAngle() {
574
+ float[] res = new float[4];
575
+ float sa = (float) Math.sqrt(1.0f - w * w);
576
+ if (sa < MathUtils.EPS) {
577
+ sa = 1.0f;
578
+ } else {
579
+ sa = 1.0f / sa;
580
+ }
581
+ res[0] = (float) Math.acos(w) * 2.0f;
582
+ res[1] = x * sa;
583
+ res[2] = y * sa;
584
+ res[3] = z * sa;
585
+ return res;
586
+ }
587
+
588
+ /**
589
+ * Converts the quat to a 4x4 rotation matrix (in row-major format). Assumes
590
+ * the quat is currently normalized (if not, you'll need to call
591
+ * {@link #normalize()} first).
592
+ *
593
+ * @return result matrix
594
+ */
595
+ public Matrix4x4 toMatrix4x4() {
596
+ return toMatrix4x4(new Matrix4x4());
597
+ }
598
+
599
+ /**
600
+ *
601
+ * @param result
602
+ * @return
603
+ */
604
+ public Matrix4x4 toMatrix4x4(Matrix4x4 result) {
605
+ // Converts this quaternion to a rotation matrix.
606
+ //
607
+ // | 1 - 2(y^2 + z^2) 2(xy + wz) 2(xz - wy) 0 |
608
+ // | 2(xy - wz) 1 - 2(x^2 + z^2) 2(yz + wx) 0 |
609
+ // | 2(xz + wy) 2(yz - wx) 1 - 2(x^2 + y^2) 0 |
610
+ // | 0 0 0 1 |
611
+
612
+ float x2 = x + x;
613
+ float y2 = y + y;
614
+ float z2 = z + z;
615
+ float xx = x * x2;
616
+ float xy = x * y2;
617
+ float xz = x * z2;
618
+ float yy = y * y2;
619
+ float yz = y * z2;
620
+ float zz = z * z2;
621
+ float wx = w * x2;
622
+ float wy = w * y2;
623
+ float wz = w * z2;
624
+
625
+ return result.set(1 - (yy + zz), xy - wz, xz + wy, 0, xy + wz,
626
+ 1 - (xx + zz), yz - wx, 0, xz - wy, yz + wx, 1 - (xx + yy), 0,
627
+ 0, 0, 0, 1);
628
+ }
629
+
630
+ /**
631
+ *
632
+ * @return
633
+ */
634
+ @Override
635
+ public String toString() {
636
+ StringBuilder sb = new StringBuilder(48);
637
+ sb.append("{axis: [").append(x).append(",").append(y).append(",")
638
+ .append(z).append("], w: ").append(w).append("}");
639
+ return sb.toString();
640
+ }
641
+ }