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.
- checksums.yaml +4 -4
- data/.gitignore +16 -0
- data/CHANGELOG.md +4 -0
- data/LICENSE +675 -0
- data/README.md +12 -5
- data/Rakefile +25 -82
- data/examples/attract_repel/attract_repel.rb +30 -0
- data/examples/attract_repel/attractor.rb +23 -0
- data/examples/attract_repel/particle.rb +27 -0
- data/examples/data/ti_yong.png +0 -0
- data/examples/force_directed/cluster.rb +76 -0
- data/examples/force_directed/force_directed_graph.rb +92 -0
- data/examples/force_directed/node.rb +26 -0
- data/examples/gray_scott_image.rb +75 -0
- data/examples/gray_scott_tone_map.rb +77 -0
- data/examples/implicit.rb +139 -0
- data/examples/inflate_mesh.rb +89 -0
- data/examples/model_align.rb +44 -0
- data/examples/povmesh/ftest.rb +46 -0
- data/examples/povmesh/tentacle.rb +73 -0
- data/examples/simple_cluster/cluster.rb +47 -0
- data/examples/simple_cluster/node.rb +27 -0
- data/examples/simple_cluster/simple_cluster.rb +60 -0
- data/examples/soft_body/blanket.rb +45 -0
- data/examples/soft_body/connection.rb +16 -0
- data/examples/soft_body/particle.rb +22 -0
- data/examples/soft_body/soft_body_square_adapted.rb +55 -0
- data/lib/toxiclibs.jar +0 -0
- data/lib/toxiclibs.rb +91 -32
- data/lib/toxiclibs/version.rb +1 -1
- data/pom.xml +122 -0
- data/src/com/toxi/net/ClientListener.java +41 -0
- data/src/com/toxi/net/ServerListener.java +70 -0
- data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
- data/src/com/toxi/net/ServerState.java +18 -0
- data/src/com/toxi/net/UDPConnection.java +66 -0
- data/src/com/toxi/net/UDPSyncClient.java +81 -0
- data/src/com/toxi/net/UDPSyncServer.java +450 -0
- data/src/com/toxi/nio/UDPClient.java +121 -0
- data/src/com/toxi/nio/UDPClientState.java +32 -0
- data/src/com/toxi/nio/UDPServer.java +129 -0
- data/src/toxi/color/AccessCriteria.java +114 -0
- data/src/toxi/color/AlphaAccessor.java +67 -0
- data/src/toxi/color/CMYKAccessor.java +122 -0
- data/src/toxi/color/CMYKDistanceProxy.java +40 -0
- data/src/toxi/color/ColorGradient.java +260 -0
- data/src/toxi/color/ColorList.java +699 -0
- data/src/toxi/color/ColorRange.java +671 -0
- data/src/toxi/color/ColorTheme.java +163 -0
- data/src/toxi/color/DistanceProxy.java +44 -0
- data/src/toxi/color/HSVAccessor.java +113 -0
- data/src/toxi/color/HSVDistanceProxy.java +40 -0
- data/src/toxi/color/HistEntry.java +85 -0
- data/src/toxi/color/Histogram.java +185 -0
- data/src/toxi/color/Hue.java +249 -0
- data/src/toxi/color/LuminanceAccessor.java +78 -0
- data/src/toxi/color/NamedColor.java +935 -0
- data/src/toxi/color/ProximityComparator.java +70 -0
- data/src/toxi/color/RGBAccessor.java +113 -0
- data/src/toxi/color/RGBDistanceProxy.java +41 -0
- data/src/toxi/color/ReadonlyTColor.java +296 -0
- data/src/toxi/color/TColor.java +1677 -0
- data/src/toxi/color/TColorAdapter.java +68 -0
- data/src/toxi/color/ToneMap.java +218 -0
- data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
- data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
- data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
- data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
- data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
- data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
- data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
- data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
- data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
- data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
- data/src/toxi/data/csv/CSVAdapter.java +74 -0
- data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
- data/src/toxi/data/csv/CSVListener.java +61 -0
- data/src/toxi/data/csv/CSVParser.java +202 -0
- data/src/toxi/data/feeds/AtomAuthor.java +49 -0
- data/src/toxi/data/feeds/AtomContent.java +50 -0
- data/src/toxi/data/feeds/AtomEntry.java +111 -0
- data/src/toxi/data/feeds/AtomFeed.java +129 -0
- data/src/toxi/data/feeds/AtomLink.java +62 -0
- data/src/toxi/data/feeds/RSSChannel.java +88 -0
- data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
- data/src/toxi/data/feeds/RSSFeed.java +99 -0
- data/src/toxi/data/feeds/RSSItem.java +104 -0
- data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
- data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
- data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
- data/src/toxi/geom/AABB.java +658 -0
- data/src/toxi/geom/Axis3D.java +116 -0
- data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
- data/src/toxi/geom/BernsteinPolynomial.java +94 -0
- data/src/toxi/geom/BezierCurve2D.java +159 -0
- data/src/toxi/geom/BezierCurve3D.java +148 -0
- data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
- data/src/toxi/geom/BoxIntersector.java +52 -0
- data/src/toxi/geom/Circle.java +230 -0
- data/src/toxi/geom/CircleIntersector.java +85 -0
- data/src/toxi/geom/Cone.java +150 -0
- data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
- data/src/toxi/geom/CoordinateExtractor.java +16 -0
- data/src/toxi/geom/Ellipse.java +250 -0
- data/src/toxi/geom/GMatrix.java +2599 -0
- data/src/toxi/geom/GVector.java +833 -0
- data/src/toxi/geom/GlobalGridTesselator.java +54 -0
- data/src/toxi/geom/GridTesselator.java +108 -0
- data/src/toxi/geom/Intersector2D.java +49 -0
- data/src/toxi/geom/Intersector3D.java +51 -0
- data/src/toxi/geom/IsectData2D.java +103 -0
- data/src/toxi/geom/IsectData3D.java +103 -0
- data/src/toxi/geom/Line2D.java +534 -0
- data/src/toxi/geom/Line3D.java +471 -0
- data/src/toxi/geom/LineStrip2D.java +430 -0
- data/src/toxi/geom/LineStrip3D.java +230 -0
- data/src/toxi/geom/LocalGridTesselator.java +57 -0
- data/src/toxi/geom/Matrix3d.java +3048 -0
- data/src/toxi/geom/Matrix4f.java +3446 -0
- data/src/toxi/geom/Matrix4x4.java +1076 -0
- data/src/toxi/geom/MatrixSizeException.java +58 -0
- data/src/toxi/geom/OctreeVisitor.java +44 -0
- data/src/toxi/geom/Origin3D.java +148 -0
- data/src/toxi/geom/Plane.java +293 -0
- data/src/toxi/geom/PlaneIntersector.java +57 -0
- data/src/toxi/geom/PointCloud3D.java +253 -0
- data/src/toxi/geom/PointOctree.java +502 -0
- data/src/toxi/geom/PointQuadtree.java +375 -0
- data/src/toxi/geom/Polygon2D.java +1038 -0
- data/src/toxi/geom/PolygonClipper2D.java +45 -0
- data/src/toxi/geom/PolygonTesselator.java +20 -0
- data/src/toxi/geom/QuadtreeVisitor.java +44 -0
- data/src/toxi/geom/Quaternion.java +641 -0
- data/src/toxi/geom/Ray2D.java +146 -0
- data/src/toxi/geom/Ray3D.java +150 -0
- data/src/toxi/geom/Ray3DIntersector.java +75 -0
- data/src/toxi/geom/ReadonlyVec2D.java +575 -0
- data/src/toxi/geom/ReadonlyVec3D.java +628 -0
- data/src/toxi/geom/ReadonlyVec4D.java +431 -0
- data/src/toxi/geom/Rect.java +720 -0
- data/src/toxi/geom/Reflector3D.java +58 -0
- data/src/toxi/geom/Shape2D.java +94 -0
- data/src/toxi/geom/Shape3D.java +42 -0
- data/src/toxi/geom/SingularMatrixException.java +57 -0
- data/src/toxi/geom/SpatialBins.java +182 -0
- data/src/toxi/geom/SpatialIndex.java +61 -0
- data/src/toxi/geom/Sphere.java +224 -0
- data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
- data/src/toxi/geom/Spline2D.java +349 -0
- data/src/toxi/geom/Spline3D.java +351 -0
- data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
- data/src/toxi/geom/Triangle2D.java +422 -0
- data/src/toxi/geom/Triangle3D.java +456 -0
- data/src/toxi/geom/TriangleIntersector.java +105 -0
- data/src/toxi/geom/Vec2D.java +1328 -0
- data/src/toxi/geom/Vec3D.java +1832 -0
- data/src/toxi/geom/Vec4D.java +985 -0
- data/src/toxi/geom/VecMathUtil.java +100 -0
- data/src/toxi/geom/XAxisCylinder.java +64 -0
- data/src/toxi/geom/YAxisCylinder.java +65 -0
- data/src/toxi/geom/ZAxisCylinder.java +64 -0
- data/src/toxi/geom/mesh/BezierPatch.java +200 -0
- data/src/toxi/geom/mesh/BoxSelector.java +62 -0
- data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
- data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
- data/src/toxi/geom/mesh/Face.java +176 -0
- data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
- data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
- data/src/toxi/geom/mesh/Mesh3D.java +224 -0
- data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
- data/src/toxi/geom/mesh/OBJWriter.java +194 -0
- data/src/toxi/geom/mesh/PLYWriter.java +167 -0
- data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
- data/src/toxi/geom/mesh/STLColorModel.java +54 -0
- data/src/toxi/geom/mesh/STLReader.java +185 -0
- data/src/toxi/geom/mesh/STLWriter.java +323 -0
- data/src/toxi/geom/mesh/SphereFunction.java +156 -0
- data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
- data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
- data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
- data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
- data/src/toxi/geom/mesh/Terrain.java +451 -0
- data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
- data/src/toxi/geom/mesh/Vertex.java +78 -0
- data/src/toxi/geom/mesh/VertexSelector.java +193 -0
- data/src/toxi/geom/mesh/WEFace.java +100 -0
- data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
- data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
- data/src/toxi/geom/mesh/WEVertex.java +134 -0
- data/src/toxi/geom/mesh/WingedEdge.java +115 -0
- data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
- data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
- data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
- data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
- data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
- data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
- data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
- data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
- data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
- data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
- data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
- data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
- data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
- data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
- data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
- data/src/toxi/geom/nurbs/ControlNet.java +148 -0
- data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
- data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
- data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
- data/src/toxi/geom/nurbs/KnotVector.java +333 -0
- data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
- data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
- data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
- data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
- data/src/toxi/image/util/Filter8bit.java +331 -0
- data/src/toxi/image/util/TiledFrameExporter.java +162 -0
- data/src/toxi/math/BezierInterpolation.java +102 -0
- data/src/toxi/math/CircularInterpolation.java +88 -0
- data/src/toxi/math/CosineInterpolation.java +51 -0
- data/src/toxi/math/DecimatedInterpolation.java +77 -0
- data/src/toxi/math/ExponentialInterpolation.java +68 -0
- data/src/toxi/math/InterpolateStrategy.java +60 -0
- data/src/toxi/math/Interpolation2D.java +93 -0
- data/src/toxi/math/LinearInterpolation.java +46 -0
- data/src/toxi/math/MathUtils.java +990 -0
- data/src/toxi/math/NonLinearScaleMap.java +101 -0
- data/src/toxi/math/ScaleMap.java +183 -0
- data/src/toxi/math/SigmoidInterpolation.java +78 -0
- data/src/toxi/math/SinCosLUT.java +141 -0
- data/src/toxi/math/ThresholdInterpolation.java +58 -0
- data/src/toxi/math/ZoomLensInterpolation.java +126 -0
- data/src/toxi/math/conversion/UnitTranslator.java +161 -0
- data/src/toxi/math/noise/PerlinNoise.java +281 -0
- data/src/toxi/math/noise/SimplexNoise.java +542 -0
- data/src/toxi/math/waves/AMFMSineWave.java +143 -0
- data/src/toxi/math/waves/AbstractWave.java +248 -0
- data/src/toxi/math/waves/ConstantWave.java +48 -0
- data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
- data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
- data/src/toxi/math/waves/FMSineWave.java +142 -0
- data/src/toxi/math/waves/FMSquareWave.java +143 -0
- data/src/toxi/math/waves/FMTriangleWave.java +126 -0
- data/src/toxi/math/waves/SineWave.java +81 -0
- data/src/toxi/math/waves/Wave2D.java +68 -0
- data/src/toxi/math/waves/WaveState.java +69 -0
- data/src/toxi/music/scale/AbstractScale.java +117 -0
- data/src/toxi/music/scale/GenericScale.java +66 -0
- data/src/toxi/music/scale/MajorScale.java +41 -0
- data/src/toxi/newmesh/AttributedEdge.java +106 -0
- data/src/toxi/newmesh/AttributedFace.java +63 -0
- data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
- data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
- data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
- data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
- data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
- data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
- data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
- data/src/toxi/newmesh/SpatialIndex.java +78 -0
- data/src/toxi/physics2d/ParticlePath2D.java +100 -0
- data/src/toxi/physics2d/ParticleString2D.java +184 -0
- data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
- data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
- data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
- data/src/toxi/physics2d/VerletParticle2D.java +457 -0
- data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
- data/src/toxi/physics2d/VerletSpring2D.java +181 -0
- data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
- data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
- data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
- data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
- data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
- data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
- data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
- data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
- data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
- data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
- data/src/toxi/physics3d/ParticlePath3D.java +100 -0
- data/src/toxi/physics3d/ParticleString3D.java +184 -0
- data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
- data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
- data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
- data/src/toxi/physics3d/VerletParticle3D.java +385 -0
- data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
- data/src/toxi/physics3d/VerletSpring3D.java +180 -0
- data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
- data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
- data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
- data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
- data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
- data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
- data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
- data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
- data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
- data/src/toxi/processing/ArrowModifier.java +116 -0
- data/src/toxi/processing/DashedLineModifier.java +48 -0
- data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
- data/src/toxi/processing/Line2DRenderModifier.java +18 -0
- data/src/toxi/processing/MeshToVBO.java +94 -0
- data/src/toxi/processing/NormalMapper.java +18 -0
- data/src/toxi/processing/POVInterface.java +121 -0
- data/src/toxi/processing/POVMesh.java +219 -0
- data/src/toxi/processing/POVWriter.java +460 -0
- data/src/toxi/processing/RCOpaque.java +77 -0
- data/src/toxi/processing/RCTransp.java +78 -0
- data/src/toxi/processing/TextureBuilder.java +232 -0
- data/src/toxi/processing/Textures.java +110 -0
- data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
- data/src/toxi/processing/Tracing.java +25 -0
- data/src/toxi/processing/XYZNormalMapper.java +30 -0
- data/src/toxi/sim/automata/CAMatrix.java +297 -0
- data/src/toxi/sim/automata/CARule.java +76 -0
- data/src/toxi/sim/automata/CARule2D.java +354 -0
- data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
- data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
- data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
- data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
- data/src/toxi/sim/dla/DLA.java +497 -0
- data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
- data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
- data/src/toxi/sim/dla/DLAEventListener.java +57 -0
- data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
- data/src/toxi/sim/dla/DLAParticle.java +102 -0
- data/src/toxi/sim/dla/DLASegment.java +88 -0
- data/src/toxi/sim/dla/PipelineOrder.java +50 -0
- data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
- data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
- data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
- data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
- data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
- data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
- data/src/toxi/sim/grayscott/GrayScott.java +469 -0
- data/src/toxi/util/DateUtils.java +141 -0
- data/src/toxi/util/FileSequenceDescriptor.java +181 -0
- data/src/toxi/util/FileUtils.java +467 -0
- data/src/toxi/util/datatypes/ArraySet.java +128 -0
- data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
- data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
- data/src/toxi/util/datatypes/DoubleRange.java +251 -0
- data/src/toxi/util/datatypes/FloatRange.java +251 -0
- data/src/toxi/util/datatypes/GenericSet.java +215 -0
- data/src/toxi/util/datatypes/IntegerRange.java +247 -0
- data/src/toxi/util/datatypes/IntegerSet.java +149 -0
- data/src/toxi/util/datatypes/ItemIndex.java +72 -0
- data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
- data/src/toxi/util/datatypes/TypedProperties.java +291 -0
- data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
- data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
- data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
- data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
- data/src/toxi/util/events/EventDispatcher.java +86 -0
- data/src/toxi/volume/AdditiveBrush.java +19 -0
- data/src/toxi/volume/ArrayIsoSurface.java +297 -0
- data/src/toxi/volume/BoxBrush.java +100 -0
- data/src/toxi/volume/BrushMode.java +16 -0
- data/src/toxi/volume/HashIsoSurface.java +354 -0
- data/src/toxi/volume/IsoSurface.java +59 -0
- data/src/toxi/volume/MarchingCubesIndex.java +312 -0
- data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
- data/src/toxi/volume/MeshVoxelizer.java +216 -0
- data/src/toxi/volume/MultiplyBrush.java +20 -0
- data/src/toxi/volume/PeakBrush.java +21 -0
- data/src/toxi/volume/ReplaceBrush.java +19 -0
- data/src/toxi/volume/RoundBrush.java +113 -0
- data/src/toxi/volume/VolumetricBrush.java +160 -0
- data/src/toxi/volume/VolumetricHashMap.java +179 -0
- data/src/toxi/volume/VolumetricSpace.java +195 -0
- data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
- data/toxiclibs.gemspec +34 -0
- 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
|
+
}
|