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,105 @@
|
|
|
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 toxi.math.MathUtils;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
*
|
|
34
|
+
* @author tux
|
|
35
|
+
*/
|
|
36
|
+
public class TriangleIntersector implements Intersector3D {
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
public Triangle3D triangle;
|
|
42
|
+
private IsectData3D isectData;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
*/
|
|
47
|
+
public TriangleIntersector() {
|
|
48
|
+
this(new Triangle3D());
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
*
|
|
53
|
+
* @param t
|
|
54
|
+
*/
|
|
55
|
+
public TriangleIntersector(Triangle3D t) {
|
|
56
|
+
this.triangle = t;
|
|
57
|
+
this.isectData = new IsectData3D();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@Override
|
|
61
|
+
public IsectData3D getIntersectionData() {
|
|
62
|
+
return isectData;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @return the triangle
|
|
67
|
+
*/
|
|
68
|
+
public Triangle3D getTriangle() {
|
|
69
|
+
return triangle;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@Override
|
|
73
|
+
public boolean intersectsRay(Ray3D ray) {
|
|
74
|
+
isectData.isIntersection = false;
|
|
75
|
+
Vec3D n = triangle.computeNormal();
|
|
76
|
+
float dotprod = n.dot(ray.dir);
|
|
77
|
+
if (dotprod < 0) {
|
|
78
|
+
Vec3D rt = ray.sub(triangle.a);
|
|
79
|
+
double t = -(double) (n.x * rt.x + n.y * rt.y + n.z * rt.z)
|
|
80
|
+
/ (n.x * ray.dir.x + n.y * ray.dir.y + n.z * ray.dir.z);
|
|
81
|
+
if (t >= MathUtils.EPS) {
|
|
82
|
+
Vec3D pos = ray.getPointAtDistance((float) t);
|
|
83
|
+
// check if pos is inside triangle
|
|
84
|
+
if (triangle.containsPoint(pos)) {
|
|
85
|
+
isectData.isIntersection = true;
|
|
86
|
+
isectData.pos = pos;
|
|
87
|
+
isectData.normal = n;
|
|
88
|
+
isectData.dist = (float) t;
|
|
89
|
+
isectData.dir = isectData.pos.sub(ray).normalize();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return isectData.isIntersection;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @param tri
|
|
98
|
+
* the triangle to set
|
|
99
|
+
* @return
|
|
100
|
+
*/
|
|
101
|
+
public TriangleIntersector setTriangle(Triangle3D tri) {
|
|
102
|
+
this.triangle = tri;
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,1328 @@
|
|
|
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.Random;
|
|
30
|
+
|
|
31
|
+
import javax.xml.bind.annotation.XmlAttribute;
|
|
32
|
+
|
|
33
|
+
import toxi.math.InterpolateStrategy;
|
|
34
|
+
import toxi.math.MathUtils;
|
|
35
|
+
import toxi.math.ScaleMap;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Comprehensive 2D vector class with additional basic intersection and
|
|
39
|
+
* collision detection features.
|
|
40
|
+
*/
|
|
41
|
+
public class Vec2D implements Comparable<ReadonlyVec2D>, ReadonlyVec2D {
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
public static enum Axis {
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
*
|
|
50
|
+
*/
|
|
51
|
+
X(Vec2D.X_AXIS),
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
*
|
|
55
|
+
*/
|
|
56
|
+
Y(Vec2D.Y_AXIS);
|
|
57
|
+
|
|
58
|
+
private final ReadonlyVec2D vector;
|
|
59
|
+
|
|
60
|
+
private Axis(ReadonlyVec2D v) {
|
|
61
|
+
this.vector = v;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
*
|
|
66
|
+
* @return
|
|
67
|
+
*/
|
|
68
|
+
public ReadonlyVec2D getVector() {
|
|
69
|
+
return vector;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Defines positive X axis
|
|
75
|
+
*/
|
|
76
|
+
public static final ReadonlyVec2D X_AXIS = new Vec2D(1, 0);
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Defines positive Y axis
|
|
80
|
+
*/
|
|
81
|
+
public static final ReadonlyVec2D Y_AXIS = new Vec2D(0, 1);
|
|
82
|
+
;
|
|
83
|
+
|
|
84
|
+
/** Defines the zero vector. */
|
|
85
|
+
public static final ReadonlyVec2D ZERO = new Vec2D();
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Defines vector with both coords set to Float.MIN_VALUE. Useful for
|
|
89
|
+
* bounding box operations.
|
|
90
|
+
*/
|
|
91
|
+
public static final ReadonlyVec2D MIN_VALUE = new Vec2D(Float.MIN_VALUE,
|
|
92
|
+
Float.MIN_VALUE);
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Defines vector with both coords set to Float.MAX_VALUE. Useful for
|
|
96
|
+
* bounding box operations.
|
|
97
|
+
*/
|
|
98
|
+
public static final ReadonlyVec2D MAX_VALUE = new Vec2D(Float.MAX_VALUE,
|
|
99
|
+
Float.MAX_VALUE);
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
*
|
|
103
|
+
*/
|
|
104
|
+
public static final ReadonlyVec2D NEG_MAX_VALUE = new Vec2D(
|
|
105
|
+
-Float.MAX_VALUE, -Float.MAX_VALUE);
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Creates a new vector from the given angle in the XY plane.
|
|
109
|
+
*
|
|
110
|
+
* The resulting vector for theta=0 is equal to the positive X axis.
|
|
111
|
+
*
|
|
112
|
+
* @param theta
|
|
113
|
+
* @return new vector pointing into the direction of the passed in angle
|
|
114
|
+
*/
|
|
115
|
+
public static final Vec2D fromTheta(float theta) {
|
|
116
|
+
return new Vec2D((float) Math.cos(theta), (float) Math.sin(theta));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Constructs a new vector consisting of the largest components of both
|
|
121
|
+
* vectors.
|
|
122
|
+
*
|
|
123
|
+
* @param b the b
|
|
124
|
+
* @param a the a
|
|
125
|
+
*
|
|
126
|
+
* @return result as new vector
|
|
127
|
+
*/
|
|
128
|
+
public static final Vec2D max(ReadonlyVec2D a, ReadonlyVec2D b) {
|
|
129
|
+
return new Vec2D(MathUtils.max(a.x(), b.x()), MathUtils.max(a.y(),
|
|
130
|
+
b.y()));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Constructs a new vector consisting of the smallest components of both
|
|
135
|
+
* vectors.
|
|
136
|
+
*
|
|
137
|
+
* @param b comparing vector
|
|
138
|
+
* @param a the a
|
|
139
|
+
*
|
|
140
|
+
* @return result as new vector
|
|
141
|
+
*/
|
|
142
|
+
public static final Vec2D min(ReadonlyVec2D a, ReadonlyVec2D b) {
|
|
143
|
+
return new Vec2D(MathUtils.min(a.x(), b.x()), MathUtils.min(a.y(),
|
|
144
|
+
b.y()));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Static factory method. Creates a new random unit vector using the Random
|
|
149
|
+
* implementation set as default for the {@link MathUtils} class.
|
|
150
|
+
*
|
|
151
|
+
* @return a new random normalized unit vector.
|
|
152
|
+
*/
|
|
153
|
+
public static final Vec2D randomVector() {
|
|
154
|
+
return randomVector(MathUtils.RND);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Static factory method. Creates a new random unit vector using the given
|
|
159
|
+
* Random generator instance. I recommend to have a look at the
|
|
160
|
+
* https://uncommons-maths.dev.java.net library for a good choice of
|
|
161
|
+
* reliable and high quality random number generators.
|
|
162
|
+
*
|
|
163
|
+
* @param rnd
|
|
164
|
+
* @return a new random normalized unit vector.
|
|
165
|
+
*/
|
|
166
|
+
public static final Vec2D randomVector(Random rnd) {
|
|
167
|
+
Vec2D v = new Vec2D(rnd.nextFloat() * 2 - 1, rnd.nextFloat() * 2 - 1);
|
|
168
|
+
return v.normalize();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* X coordinate
|
|
173
|
+
*/
|
|
174
|
+
@XmlAttribute(required = true)
|
|
175
|
+
public float x;
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Y coordinate
|
|
179
|
+
*/
|
|
180
|
+
@XmlAttribute(required = true)
|
|
181
|
+
public float y;
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Creates a new zero vector
|
|
185
|
+
*/
|
|
186
|
+
public Vec2D() {
|
|
187
|
+
x = y = 0;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Creates a new vector with the given coordinates
|
|
192
|
+
*
|
|
193
|
+
* @param x
|
|
194
|
+
* @param y
|
|
195
|
+
*/
|
|
196
|
+
public Vec2D(float x, float y) {
|
|
197
|
+
this.x = x;
|
|
198
|
+
this.y = y;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
*
|
|
203
|
+
* @param v
|
|
204
|
+
*/
|
|
205
|
+
public Vec2D(float[] v) {
|
|
206
|
+
this.x = v[0];
|
|
207
|
+
this.y = v[1];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Creates a new vector with the coordinates of the given vector
|
|
212
|
+
*
|
|
213
|
+
* @param v vector to be copied
|
|
214
|
+
*/
|
|
215
|
+
public Vec2D(ReadonlyVec2D v) {
|
|
216
|
+
this.x = v.x();
|
|
217
|
+
this.y = v.y();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
*
|
|
222
|
+
* @return
|
|
223
|
+
*/
|
|
224
|
+
public final Vec2D abs() {
|
|
225
|
+
x = MathUtils.abs(x);
|
|
226
|
+
y = MathUtils.abs(y);
|
|
227
|
+
return this;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
@Override
|
|
231
|
+
public final Vec2D add(float a, float b) {
|
|
232
|
+
return new Vec2D(x + a, y + b);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
@Override
|
|
236
|
+
public Vec2D add(ReadonlyVec2D v) {
|
|
237
|
+
return new Vec2D(x + v.x(), y + v.y());
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
*
|
|
242
|
+
* @param v
|
|
243
|
+
* @return
|
|
244
|
+
*/
|
|
245
|
+
public final Vec2D add(Vec2D v) {
|
|
246
|
+
return new Vec2D(x + v.x, y + v.y);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Adds vector {a,b,c} and overrides coordinates with result.
|
|
251
|
+
*
|
|
252
|
+
* @param a X coordinate
|
|
253
|
+
* @param b Y coordinate
|
|
254
|
+
* @return itself
|
|
255
|
+
*/
|
|
256
|
+
public final Vec2D addSelf(float a, float b) {
|
|
257
|
+
x += a;
|
|
258
|
+
y += b;
|
|
259
|
+
return this;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Adds vector v and overrides coordinates with result.
|
|
264
|
+
*
|
|
265
|
+
* @param v vector to add
|
|
266
|
+
* @return itself
|
|
267
|
+
*/
|
|
268
|
+
public final Vec2D addSelf(Vec2D v) {
|
|
269
|
+
x += v.x;
|
|
270
|
+
y += v.y;
|
|
271
|
+
return this;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
@Override
|
|
275
|
+
public final float angleBetween(ReadonlyVec2D v) {
|
|
276
|
+
return (float) Math.acos(dot(v));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
@Override
|
|
280
|
+
public final float angleBetween(ReadonlyVec2D v, boolean forceNormalize) {
|
|
281
|
+
float theta;
|
|
282
|
+
if (forceNormalize) {
|
|
283
|
+
theta = getNormalized().dot(v.getNormalized());
|
|
284
|
+
} else {
|
|
285
|
+
theta = dot(v);
|
|
286
|
+
}
|
|
287
|
+
return (float) Math.acos(MathUtils.clipNormalized(theta));
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
@Override
|
|
291
|
+
public Vec3D bisect(Vec2D b) {
|
|
292
|
+
Vec2D diff = this.sub(b);
|
|
293
|
+
Vec2D sum = this.add(b);
|
|
294
|
+
float dot = diff.dot(sum);
|
|
295
|
+
return new Vec3D(diff.x, diff.y, -dot / 2);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Sets all vector components to 0.
|
|
300
|
+
*
|
|
301
|
+
* @return itself
|
|
302
|
+
*/
|
|
303
|
+
public final Vec2D clear() {
|
|
304
|
+
x = y = 0;
|
|
305
|
+
return this;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
@Override
|
|
309
|
+
public int compareTo(ReadonlyVec2D o) {
|
|
310
|
+
if (this.equals(o)) {
|
|
311
|
+
return 0;
|
|
312
|
+
}
|
|
313
|
+
int result = (this.magSquared() < o.magSquared()) ? -1 : 1;
|
|
314
|
+
return result;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Constraints this vector to the perimeter of the given polygon. Unlike the
|
|
319
|
+
* {@link #constrain(Rect)} version of this method, this version DOES NOT
|
|
320
|
+
* check containment automatically. If you want to only constrain a point if
|
|
321
|
+
* its (for example) outside the polygon, then check containment with
|
|
322
|
+
* {@link Polygon2D#containsPoint(ReadonlyVec2D)} first before calling this
|
|
323
|
+
* method.
|
|
324
|
+
*
|
|
325
|
+
* @param poly
|
|
326
|
+
* @return itself
|
|
327
|
+
*/
|
|
328
|
+
public Vec2D constrain(Polygon2D poly) {
|
|
329
|
+
float minD = Float.MAX_VALUE;
|
|
330
|
+
Vec2D q = null;
|
|
331
|
+
for (Line2D l : poly.getEdges()) {
|
|
332
|
+
Vec2D c = l.closestPointTo(this);
|
|
333
|
+
float d = c.distanceToSquared(this);
|
|
334
|
+
if (d < minD) {
|
|
335
|
+
q = c;
|
|
336
|
+
minD = d;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (q != null) {
|
|
340
|
+
x = q.x;
|
|
341
|
+
y = q.y;
|
|
342
|
+
}
|
|
343
|
+
return this;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Forcefully fits the vector in the given rectangle.
|
|
348
|
+
*
|
|
349
|
+
* @param r
|
|
350
|
+
* @return itself
|
|
351
|
+
*/
|
|
352
|
+
public Vec2D constrain(Rect r) {
|
|
353
|
+
x = MathUtils.clip(x, r.x, r.x + r.width);
|
|
354
|
+
y = MathUtils.clip(y, r.y, r.y + r.height);
|
|
355
|
+
return this;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Forcefully fits the vector in the given rectangle defined by the points.
|
|
360
|
+
*
|
|
361
|
+
* @param min
|
|
362
|
+
* @param max
|
|
363
|
+
* @return itself
|
|
364
|
+
*/
|
|
365
|
+
public Vec2D constrain(Vec2D min, Vec2D max) {
|
|
366
|
+
x = MathUtils.clip(x, min.x, max.x);
|
|
367
|
+
y = MathUtils.clip(y, min.y, max.y);
|
|
368
|
+
return this;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
@Override
|
|
372
|
+
public final Vec2D copy() {
|
|
373
|
+
return new Vec2D(this);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
@Override
|
|
377
|
+
public float cross(ReadonlyVec2D v) {
|
|
378
|
+
return (x * v.y()) - (y * v.x());
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
@Override
|
|
382
|
+
public final float distanceTo(ReadonlyVec2D v) {
|
|
383
|
+
if (v != null) {
|
|
384
|
+
float dx = x - v.x();
|
|
385
|
+
float dy = y - v.y();
|
|
386
|
+
return (float) Math.sqrt(dx * dx + dy * dy);
|
|
387
|
+
} else {
|
|
388
|
+
return Float.NaN;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
@Override
|
|
393
|
+
public final float distanceToSquared(ReadonlyVec2D v) {
|
|
394
|
+
if (v != null) {
|
|
395
|
+
float dx = x - v.x();
|
|
396
|
+
float dy = y - v.y();
|
|
397
|
+
return dx * dx + dy * dy;
|
|
398
|
+
} else {
|
|
399
|
+
return Float.NaN;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
@Override
|
|
404
|
+
public final float dot(ReadonlyVec2D v) {
|
|
405
|
+
return x * v.x() + y * v.y();
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Returns true if the Object v is of type ReadonlyVec2D and all of the data
|
|
410
|
+
* members of v are equal to the corresponding data members in this vector.
|
|
411
|
+
*
|
|
412
|
+
* @param obj the object with which the comparison is made
|
|
413
|
+
* @return true or false
|
|
414
|
+
*/
|
|
415
|
+
|
|
416
|
+
@Override
|
|
417
|
+
public boolean equals(Object obj) {
|
|
418
|
+
if (obj instanceof ReadonlyVec2D) {
|
|
419
|
+
final ReadonlyVec2D other = (ReadonlyVec2D) obj;
|
|
420
|
+
if (!((Float) x).equals(other.x())) {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
return ((Float) y).equals(other.y());
|
|
424
|
+
}
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Returns a hash code value based on the data values in this object. Two
|
|
430
|
+
* different Vec2D objects with identical data values (i.e., Vec2D.equals
|
|
431
|
+
* returns true) will return the same hash code value. Two objects with
|
|
432
|
+
* different data members may return the same hash value, although this is
|
|
433
|
+
* not likely.
|
|
434
|
+
*
|
|
435
|
+
* @return the hash code value of this vector.
|
|
436
|
+
*/
|
|
437
|
+
|
|
438
|
+
@Override
|
|
439
|
+
public int hashCode() {
|
|
440
|
+
int hash = 7;
|
|
441
|
+
hash = 97 * hash + Float.floatToIntBits(this.x);
|
|
442
|
+
hash = 97 * hash + Float.floatToIntBits(this.y);
|
|
443
|
+
return hash;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Returns true if all of the data members of ReadonlyVec2D v are equal to
|
|
448
|
+
* the corresponding data members in this vector.
|
|
449
|
+
*
|
|
450
|
+
* @param v the vector with which the comparison is made
|
|
451
|
+
* @return true or false
|
|
452
|
+
*/
|
|
453
|
+
public boolean equals(ReadonlyVec2D v) {
|
|
454
|
+
final ReadonlyVec2D other = (ReadonlyVec2D) v;
|
|
455
|
+
if (!((Float) x).equals(other.x())) {
|
|
456
|
+
return false;
|
|
457
|
+
}
|
|
458
|
+
return ((Float) y).equals(other.y());
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
@Override
|
|
462
|
+
public boolean equalsWithTolerance(ReadonlyVec2D v, float tolerance) {
|
|
463
|
+
if (v instanceof ReadonlyVec2D){
|
|
464
|
+
float diff = x - v.x();
|
|
465
|
+
if (Float.isNaN(diff)) {
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
if ((diff < 0 ? -diff : diff) > tolerance) {
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
diff = y - v.y();
|
|
472
|
+
if (Float.isNaN(diff)) {
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
475
|
+
return ((diff < 0 ? -diff : diff) < tolerance);
|
|
476
|
+
}
|
|
477
|
+
return false;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Replaces the vector components with integer values of their current
|
|
482
|
+
* values
|
|
483
|
+
*
|
|
484
|
+
* @return itself
|
|
485
|
+
*/
|
|
486
|
+
public final Vec2D floor() {
|
|
487
|
+
x = MathUtils.floor(x);
|
|
488
|
+
y = MathUtils.floor(y);
|
|
489
|
+
return this;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Replaces the vector components with the fractional part of their current
|
|
494
|
+
* values
|
|
495
|
+
*
|
|
496
|
+
* @return itself
|
|
497
|
+
*/
|
|
498
|
+
public final Vec2D frac() {
|
|
499
|
+
x -= MathUtils.floor(x);
|
|
500
|
+
y -= MathUtils.floor(y);
|
|
501
|
+
return this;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
*
|
|
506
|
+
* @return
|
|
507
|
+
*/
|
|
508
|
+
@Override
|
|
509
|
+
public final Vec2D getAbs() {
|
|
510
|
+
return new Vec2D(this).abs();
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
@Override
|
|
514
|
+
public Vec2D getCartesian() {
|
|
515
|
+
return copy().toCartesian();
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
*
|
|
520
|
+
* @param id
|
|
521
|
+
* @return
|
|
522
|
+
*/
|
|
523
|
+
@Override
|
|
524
|
+
public float getComponent(Axis id) {
|
|
525
|
+
switch (id) {
|
|
526
|
+
case X:
|
|
527
|
+
return x;
|
|
528
|
+
case Y:
|
|
529
|
+
return y;
|
|
530
|
+
}
|
|
531
|
+
return 0;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
*
|
|
536
|
+
* @param id
|
|
537
|
+
* @return
|
|
538
|
+
*/
|
|
539
|
+
@Override
|
|
540
|
+
public final float getComponent(int id) {
|
|
541
|
+
switch (id) {
|
|
542
|
+
case 0:
|
|
543
|
+
return x;
|
|
544
|
+
case 1:
|
|
545
|
+
return y;
|
|
546
|
+
}
|
|
547
|
+
throw new IllegalArgumentException("index must be 0 or 1");
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/**
|
|
551
|
+
*
|
|
552
|
+
* @param poly
|
|
553
|
+
* @return
|
|
554
|
+
*/
|
|
555
|
+
public final Vec2D getConstrained(Polygon2D poly) {
|
|
556
|
+
return new Vec2D(this).constrain(poly);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
@Override
|
|
560
|
+
public final Vec2D getConstrained(Rect r) {
|
|
561
|
+
return new Vec2D(this).constrain(r);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
@Override
|
|
565
|
+
public final Vec2D getFloored() {
|
|
566
|
+
return new Vec2D(this).floor();
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
@Override
|
|
570
|
+
public final Vec2D getFrac() {
|
|
571
|
+
return new Vec2D(this).frac();
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
@Override
|
|
575
|
+
public final Vec2D getInverted() {
|
|
576
|
+
return new Vec2D(-x, -y);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
@Override
|
|
580
|
+
public final Vec2D getLimited(float lim) {
|
|
581
|
+
if (magSquared() > lim * lim) {
|
|
582
|
+
return getNormalizedTo(lim);
|
|
583
|
+
}
|
|
584
|
+
return new Vec2D(this);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
@Override
|
|
588
|
+
public Vec2D getMapped(ScaleMap map) {
|
|
589
|
+
return new Vec2D((float) map.getClippedValueFor(x),
|
|
590
|
+
(float) map.getClippedValueFor(y));
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
@Override
|
|
594
|
+
public final Vec2D getNormalized() {
|
|
595
|
+
return new Vec2D(this).normalize();
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
@Override
|
|
599
|
+
public final Vec2D getNormalizedTo(float len) {
|
|
600
|
+
return new Vec2D(this).normalizeTo(len);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
*
|
|
605
|
+
* @return
|
|
606
|
+
*/
|
|
607
|
+
@Override
|
|
608
|
+
public final Vec2D getPerpendicular() {
|
|
609
|
+
return new Vec2D(this).perpendicular();
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
@Override
|
|
613
|
+
public Vec2D getPolar() {
|
|
614
|
+
return copy().toPolar();
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/**
|
|
618
|
+
*
|
|
619
|
+
* @return
|
|
620
|
+
*/
|
|
621
|
+
@Override
|
|
622
|
+
public final Vec2D getReciprocal() {
|
|
623
|
+
return copy().reciprocal();
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
*
|
|
628
|
+
* @param normal
|
|
629
|
+
* @return
|
|
630
|
+
*/
|
|
631
|
+
@Override
|
|
632
|
+
public final Vec2D getReflected(ReadonlyVec2D normal) {
|
|
633
|
+
return copy().reflect(normal);
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
@Override
|
|
637
|
+
public final Vec2D getRotated(float theta) {
|
|
638
|
+
return new Vec2D(this).rotate(theta);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
@Override
|
|
642
|
+
public Vec2D getRoundedTo(float prec) {
|
|
643
|
+
return copy().roundTo(prec);
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
@Override
|
|
647
|
+
public Vec2D getSignum() {
|
|
648
|
+
return new Vec2D(this).signum();
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
@Override
|
|
652
|
+
public final float heading() {
|
|
653
|
+
return (float) Math.atan2(y, x);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
@Override
|
|
657
|
+
public Vec2D interpolateTo(ReadonlyVec2D v, float f) {
|
|
658
|
+
return new Vec2D(x + (v.x() - x) * f, y + (v.y() - y) * f);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
@Override
|
|
662
|
+
public Vec2D interpolateTo(ReadonlyVec2D v, float f, InterpolateStrategy s) {
|
|
663
|
+
return new Vec2D(s.interpolate(x, v.x(), f), s.interpolate(y, v.y(), f));
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
*
|
|
668
|
+
* @param v
|
|
669
|
+
* @param f
|
|
670
|
+
* @return
|
|
671
|
+
*/
|
|
672
|
+
public final Vec2D interpolateTo(Vec2D v, float f) {
|
|
673
|
+
return new Vec2D(x + (v.x - x) * f, y + (v.y - y) * f);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/**
|
|
677
|
+
*
|
|
678
|
+
* @param v
|
|
679
|
+
* @param f
|
|
680
|
+
* @param s
|
|
681
|
+
* @return
|
|
682
|
+
*/
|
|
683
|
+
public Vec2D interpolateTo(Vec2D v, float f, InterpolateStrategy s) {
|
|
684
|
+
return new Vec2D(s.interpolate(x, v.x, f), s.interpolate(y, v.y, f));
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
/**
|
|
688
|
+
* Interpolates the vector towards the given target vector, using linear
|
|
689
|
+
* interpolation
|
|
690
|
+
*
|
|
691
|
+
* @param v target vector
|
|
692
|
+
* @param f interpolation factor (should be in the range 0..1)
|
|
693
|
+
* @return itself, result overrides current vector
|
|
694
|
+
*/
|
|
695
|
+
public final Vec2D interpolateToSelf(ReadonlyVec2D v, float f) {
|
|
696
|
+
x += (v.x() - x) * f;
|
|
697
|
+
y += (v.y() - y) * f;
|
|
698
|
+
return this;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
/**
|
|
702
|
+
* Interpolates the vector towards the given target vector, using the given
|
|
703
|
+
* {@link InterpolateStrategy}
|
|
704
|
+
*
|
|
705
|
+
* @param v target vector
|
|
706
|
+
* @param f interpolation factor (should be in the range 0..1)
|
|
707
|
+
* @param s InterpolateStrategy instance
|
|
708
|
+
* @return itself, result overrides current vector
|
|
709
|
+
*/
|
|
710
|
+
public Vec2D interpolateToSelf(ReadonlyVec2D v, float f,
|
|
711
|
+
InterpolateStrategy s) {
|
|
712
|
+
x = s.interpolate(x, v.x(), f);
|
|
713
|
+
y = s.interpolate(y, v.y(), f);
|
|
714
|
+
return this;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/**
|
|
718
|
+
* Scales vector uniformly by factor -1 ( v = -v ), overrides coordinates
|
|
719
|
+
* with result
|
|
720
|
+
*
|
|
721
|
+
* @return itself
|
|
722
|
+
*/
|
|
723
|
+
public final Vec2D invert() {
|
|
724
|
+
x *= -1;
|
|
725
|
+
y *= -1;
|
|
726
|
+
return this;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
@Override
|
|
730
|
+
public boolean isInCircle(ReadonlyVec2D sO, float sR) {
|
|
731
|
+
float d = sub(sO).magSquared();
|
|
732
|
+
return (d <= sR * sR);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* Simplified
|
|
737
|
+
* @param r
|
|
738
|
+
* @return
|
|
739
|
+
*/
|
|
740
|
+
|
|
741
|
+
@Override
|
|
742
|
+
public boolean isInRectangle(Rect r) {
|
|
743
|
+
if (x < r.x || x > r.x + r.width) {
|
|
744
|
+
return false;
|
|
745
|
+
}
|
|
746
|
+
return (y >= r.y || y <= r.y + r.height);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
@Override
|
|
750
|
+
public boolean isInTriangle(Vec2D a, Vec2D b, Vec2D c) {
|
|
751
|
+
Vec2D v1 = sub(a).normalize();
|
|
752
|
+
Vec2D v2 = sub(b).normalize();
|
|
753
|
+
Vec2D v3 = sub(c).normalize();
|
|
754
|
+
|
|
755
|
+
double total_angles = Math.acos(v1.dot(v2));
|
|
756
|
+
total_angles += Math.acos(v2.dot(v3));
|
|
757
|
+
total_angles += Math.acos(v3.dot(v1));
|
|
758
|
+
|
|
759
|
+
return (MathUtils.abs((float) total_angles - MathUtils.TWO_PI) <= 0.005f);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
@Override
|
|
763
|
+
public final boolean isMajorAxis(float tol) {
|
|
764
|
+
float ax = MathUtils.abs(x);
|
|
765
|
+
float ay = MathUtils.abs(y);
|
|
766
|
+
float itol = 1 - tol;
|
|
767
|
+
if (ax > itol) {
|
|
768
|
+
return (ay < tol);
|
|
769
|
+
} else if (ay > itol) {
|
|
770
|
+
return (ax < tol);
|
|
771
|
+
}
|
|
772
|
+
return false;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
@Override
|
|
776
|
+
public final boolean isZeroVector() {
|
|
777
|
+
return MathUtils.abs(x) < MathUtils.EPS
|
|
778
|
+
&& MathUtils.abs(y) < MathUtils.EPS;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
/**
|
|
782
|
+
*
|
|
783
|
+
* @param j
|
|
784
|
+
* @return
|
|
785
|
+
*/
|
|
786
|
+
public final Vec2D jitter(float j) {
|
|
787
|
+
return jitter(j, j);
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
/**
|
|
791
|
+
* Adds random jitter to the vector in the range -j ... +j using the default
|
|
792
|
+
* {@link Random} generator of {@link MathUtils}.
|
|
793
|
+
*
|
|
794
|
+
* @param jx maximum x jitter
|
|
795
|
+
* @param jy maximum y jitter
|
|
796
|
+
* @return itself
|
|
797
|
+
*/
|
|
798
|
+
public final Vec2D jitter(float jx, float jy) {
|
|
799
|
+
x += MathUtils.normalizedRandom() * jx;
|
|
800
|
+
y += MathUtils.normalizedRandom() * jy;
|
|
801
|
+
return this;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
*
|
|
806
|
+
* @param rnd
|
|
807
|
+
* @param j
|
|
808
|
+
* @return
|
|
809
|
+
*/
|
|
810
|
+
public final Vec2D jitter(Random rnd, float j) {
|
|
811
|
+
return jitter(rnd, j, j);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/**
|
|
815
|
+
*
|
|
816
|
+
* @param rnd
|
|
817
|
+
* @param jx
|
|
818
|
+
* @param jy
|
|
819
|
+
* @return
|
|
820
|
+
*/
|
|
821
|
+
public final Vec2D jitter(Random rnd, float jx, float jy) {
|
|
822
|
+
x += MathUtils.normalizedRandom(rnd) * jx;
|
|
823
|
+
y += MathUtils.normalizedRandom(rnd) * jy;
|
|
824
|
+
return this;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
/**
|
|
828
|
+
*
|
|
829
|
+
* @param rnd
|
|
830
|
+
* @param jv
|
|
831
|
+
* @return
|
|
832
|
+
*/
|
|
833
|
+
public final Vec2D jitter(Random rnd, Vec2D jv) {
|
|
834
|
+
return jitter(rnd, jv.x, jv.y);
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
/**
|
|
838
|
+
*
|
|
839
|
+
* @param jv
|
|
840
|
+
* @return
|
|
841
|
+
*/
|
|
842
|
+
public final Vec2D jitter(Vec2D jv) {
|
|
843
|
+
return jitter(jv.x, jv.y);
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
/**
|
|
847
|
+
* Limits the vector's magnitude to the length given
|
|
848
|
+
*
|
|
849
|
+
* @param lim new maximum magnitude
|
|
850
|
+
* @return itself
|
|
851
|
+
*/
|
|
852
|
+
public final Vec2D limit(float lim) {
|
|
853
|
+
if (magSquared() > lim * lim) {
|
|
854
|
+
return normalize().scaleSelf(lim);
|
|
855
|
+
}
|
|
856
|
+
return this;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
@Override
|
|
860
|
+
public final float magnitude() {
|
|
861
|
+
return (float) Math.sqrt(x * x + y * y);
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
@Override
|
|
865
|
+
public final float magSquared() {
|
|
866
|
+
return x * x + y * y;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
@Override
|
|
870
|
+
public final Vec2D max(ReadonlyVec2D v) {
|
|
871
|
+
return new Vec2D(MathUtils.max(x, v.x()), MathUtils.max(y, v.y()));
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
/**
|
|
875
|
+
* Adjusts the vector components to the maximum values of both vectors
|
|
876
|
+
*
|
|
877
|
+
* @param v
|
|
878
|
+
* @return itself
|
|
879
|
+
*/
|
|
880
|
+
public final Vec2D maxSelf(ReadonlyVec2D v) {
|
|
881
|
+
x = MathUtils.max(x, v.x());
|
|
882
|
+
y = MathUtils.max(y, v.y());
|
|
883
|
+
return this;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
@Override
|
|
887
|
+
public final Vec2D min(ReadonlyVec2D v) {
|
|
888
|
+
return new Vec2D(MathUtils.min(x, v.x()), MathUtils.min(y, v.y()));
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
/**
|
|
892
|
+
* Adjusts the vector components to the minimum values of both vectors
|
|
893
|
+
*
|
|
894
|
+
* @param v
|
|
895
|
+
* @return itself
|
|
896
|
+
*/
|
|
897
|
+
public final Vec2D minSelf(ReadonlyVec2D v) {
|
|
898
|
+
x = MathUtils.min(x, v.x());
|
|
899
|
+
y = MathUtils.min(y, v.y());
|
|
900
|
+
return this;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
/**
|
|
904
|
+
* Normalizes the vector so that its magnitude = 1
|
|
905
|
+
*
|
|
906
|
+
* @return itself
|
|
907
|
+
*/
|
|
908
|
+
public final Vec2D normalize() {
|
|
909
|
+
float mag = x * x + y * y;
|
|
910
|
+
if (mag > 0) {
|
|
911
|
+
mag = 1f / (float) Math.sqrt(mag);
|
|
912
|
+
x *= mag;
|
|
913
|
+
y *= mag;
|
|
914
|
+
}
|
|
915
|
+
return this;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
/**
|
|
919
|
+
* Normalizes the vector to the given length.
|
|
920
|
+
*
|
|
921
|
+
* @param len desired length
|
|
922
|
+
* @return itself
|
|
923
|
+
*/
|
|
924
|
+
public final Vec2D normalizeTo(float len) {
|
|
925
|
+
float mag = (float) Math.sqrt(x * x + y * y);
|
|
926
|
+
if (mag > 0) {
|
|
927
|
+
mag = len / mag;
|
|
928
|
+
x *= mag;
|
|
929
|
+
y *= mag;
|
|
930
|
+
}
|
|
931
|
+
return this;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
/**
|
|
935
|
+
*
|
|
936
|
+
* @return
|
|
937
|
+
*/
|
|
938
|
+
public final Vec2D perpendicular() {
|
|
939
|
+
float t = x;
|
|
940
|
+
x = -y;
|
|
941
|
+
y = t;
|
|
942
|
+
return this;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
/**
|
|
946
|
+
*
|
|
947
|
+
* @return
|
|
948
|
+
*/
|
|
949
|
+
public final float positiveHeading() {
|
|
950
|
+
double dist = Math.sqrt(x * x + y * y);
|
|
951
|
+
if (y >= 0) {
|
|
952
|
+
return (float) Math.acos(x / dist);
|
|
953
|
+
} else {
|
|
954
|
+
return (float) (Math.acos(-x / dist) + MathUtils.PI);
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
/**
|
|
959
|
+
*
|
|
960
|
+
* @return
|
|
961
|
+
*/
|
|
962
|
+
public final Vec2D reciprocal() {
|
|
963
|
+
x = 1f / x;
|
|
964
|
+
y = 1f / y;
|
|
965
|
+
return this;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
/**
|
|
969
|
+
*
|
|
970
|
+
* @param normal
|
|
971
|
+
* @return
|
|
972
|
+
*/
|
|
973
|
+
public final Vec2D reflect(ReadonlyVec2D normal) {
|
|
974
|
+
return set(normal.scale(this.dot(normal) * 2).subSelf(this));
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
/**
|
|
978
|
+
* Rotates the vector by the given angle around the Z axis.
|
|
979
|
+
*
|
|
980
|
+
* @param theta
|
|
981
|
+
* @return itself
|
|
982
|
+
*/
|
|
983
|
+
public final Vec2D rotate(float theta) {
|
|
984
|
+
float co = (float) Math.cos(theta);
|
|
985
|
+
float si = (float) Math.sin(theta);
|
|
986
|
+
float xx = co * x - si * y;
|
|
987
|
+
y = si * x + co * y;
|
|
988
|
+
x = xx;
|
|
989
|
+
return this;
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
/**
|
|
993
|
+
*
|
|
994
|
+
* @param prec
|
|
995
|
+
* @return
|
|
996
|
+
*/
|
|
997
|
+
public Vec2D roundTo(float prec) {
|
|
998
|
+
x = MathUtils.roundTo(x, prec);
|
|
999
|
+
y = MathUtils.roundTo(y, prec);
|
|
1000
|
+
return this;
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
@Override
|
|
1004
|
+
public final Vec2D scale(float s) {
|
|
1005
|
+
return new Vec2D(x * s, y * s);
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
@Override
|
|
1009
|
+
public final Vec2D scale(float a, float b) {
|
|
1010
|
+
return new Vec2D(x * a, y * b);
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
/**
|
|
1014
|
+
*
|
|
1015
|
+
* @param s
|
|
1016
|
+
* @return
|
|
1017
|
+
*/
|
|
1018
|
+
@Override
|
|
1019
|
+
public final Vec2D scale(ReadonlyVec2D s) {
|
|
1020
|
+
return s.copy().scaleSelf(this);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
@Override
|
|
1024
|
+
public final Vec2D scale(Vec2D s) {
|
|
1025
|
+
return new Vec2D(x * s.x, y * s.y);
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
/**
|
|
1029
|
+
* Scales vector uniformly and overrides coordinates with result
|
|
1030
|
+
*
|
|
1031
|
+
* @param s scale factor
|
|
1032
|
+
* @return itself
|
|
1033
|
+
*/
|
|
1034
|
+
public final Vec2D scaleSelf(float s) {
|
|
1035
|
+
x *= s;
|
|
1036
|
+
y *= s;
|
|
1037
|
+
return this;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
/**
|
|
1041
|
+
* Scales vector non-uniformly by vector {a,b,c} and overrides coordinates
|
|
1042
|
+
* with result
|
|
1043
|
+
*
|
|
1044
|
+
* @param a scale factor for X coordinate
|
|
1045
|
+
* @param b scale factor for Y coordinate
|
|
1046
|
+
* @return itself
|
|
1047
|
+
*/
|
|
1048
|
+
public final Vec2D scaleSelf(float a, float b) {
|
|
1049
|
+
x *= a;
|
|
1050
|
+
y *= b;
|
|
1051
|
+
return this;
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
/**
|
|
1055
|
+
* Scales vector non-uniformly by vector v and overrides coordinates with
|
|
1056
|
+
* result
|
|
1057
|
+
*
|
|
1058
|
+
* @param s scale vector
|
|
1059
|
+
* @return itself
|
|
1060
|
+
*/
|
|
1061
|
+
public final Vec2D scaleSelf(Vec2D s) {
|
|
1062
|
+
x *= s.x;
|
|
1063
|
+
y *= s.y;
|
|
1064
|
+
return this;
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
/**
|
|
1068
|
+
* Overrides coordinates with the given values
|
|
1069
|
+
*
|
|
1070
|
+
* @param x
|
|
1071
|
+
* @param y
|
|
1072
|
+
* @return itself
|
|
1073
|
+
*/
|
|
1074
|
+
public final Vec2D set(float x, float y) {
|
|
1075
|
+
this.x = x;
|
|
1076
|
+
this.y = y;
|
|
1077
|
+
return this;
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
/**
|
|
1081
|
+
*
|
|
1082
|
+
* @param v
|
|
1083
|
+
* @return
|
|
1084
|
+
*/
|
|
1085
|
+
public final Vec2D set(ReadonlyVec2D v) {
|
|
1086
|
+
x = v.x();
|
|
1087
|
+
y = v.y();
|
|
1088
|
+
return this;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
/**
|
|
1092
|
+
* Overrides coordinates with the ones of the given vector
|
|
1093
|
+
*
|
|
1094
|
+
* @param v vector to be copied
|
|
1095
|
+
* @return itself
|
|
1096
|
+
*/
|
|
1097
|
+
public final Vec2D set(Vec2D v) {
|
|
1098
|
+
x = v.x;
|
|
1099
|
+
y = v.y;
|
|
1100
|
+
return this;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
/**
|
|
1104
|
+
*
|
|
1105
|
+
* @param id
|
|
1106
|
+
* @param val
|
|
1107
|
+
* @return
|
|
1108
|
+
*/
|
|
1109
|
+
public final Vec2D setComponent(Axis id, float val) {
|
|
1110
|
+
switch (id) {
|
|
1111
|
+
case X:
|
|
1112
|
+
x = val;
|
|
1113
|
+
break;
|
|
1114
|
+
case Y:
|
|
1115
|
+
y = val;
|
|
1116
|
+
break;
|
|
1117
|
+
}
|
|
1118
|
+
return this;
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
/**
|
|
1122
|
+
*
|
|
1123
|
+
* @param id
|
|
1124
|
+
* @param val
|
|
1125
|
+
* @return
|
|
1126
|
+
*/
|
|
1127
|
+
public final Vec2D setComponent(int id, float val) {
|
|
1128
|
+
switch (id) {
|
|
1129
|
+
case 0:
|
|
1130
|
+
x = val;
|
|
1131
|
+
break;
|
|
1132
|
+
case 1:
|
|
1133
|
+
y = val;
|
|
1134
|
+
break;
|
|
1135
|
+
default:
|
|
1136
|
+
throw new IllegalArgumentException(
|
|
1137
|
+
"component id needs to be 0 or 1");
|
|
1138
|
+
}
|
|
1139
|
+
return this;
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
/**
|
|
1143
|
+
*
|
|
1144
|
+
* @param x
|
|
1145
|
+
* @return
|
|
1146
|
+
*/
|
|
1147
|
+
public Vec2D setX(float x) {
|
|
1148
|
+
this.x = x;
|
|
1149
|
+
return this;
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
/**
|
|
1153
|
+
*
|
|
1154
|
+
* @param y
|
|
1155
|
+
* @return
|
|
1156
|
+
*/
|
|
1157
|
+
public Vec2D setY(float y) {
|
|
1158
|
+
this.y = y;
|
|
1159
|
+
return this;
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
/**
|
|
1163
|
+
* Replaces all vector components with the signum of their original values.
|
|
1164
|
+
* In other words if a components value was negative its new value will be
|
|
1165
|
+
* -1, if zero => 0, if positive => +1
|
|
1166
|
+
*
|
|
1167
|
+
* @return itself
|
|
1168
|
+
*/
|
|
1169
|
+
public final Vec2D signum() {
|
|
1170
|
+
x = (x < 0 ? -1 : x == 0 ? 0 : 1);
|
|
1171
|
+
y = (y < 0 ? -1 : y == 0 ? 0 : 1);
|
|
1172
|
+
return this;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
/**
|
|
1176
|
+
* Rounds the vector to the closest major axis. Assumes the vector is
|
|
1177
|
+
* normalized.
|
|
1178
|
+
*
|
|
1179
|
+
* @return itself
|
|
1180
|
+
*/
|
|
1181
|
+
public final Vec2D snapToAxis() {
|
|
1182
|
+
if (MathUtils.abs(x) < 0.5f) {
|
|
1183
|
+
x = 0;
|
|
1184
|
+
} else {
|
|
1185
|
+
x = x < 0 ? -1 : 1;
|
|
1186
|
+
y = 0;
|
|
1187
|
+
}
|
|
1188
|
+
if (MathUtils.abs(y) < 0.5f) {
|
|
1189
|
+
y = 0;
|
|
1190
|
+
} else {
|
|
1191
|
+
y = y < 0 ? -1 : 1;
|
|
1192
|
+
x = 0;
|
|
1193
|
+
}
|
|
1194
|
+
return this;
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
@Override
|
|
1198
|
+
public final Vec2D sub(float a, float b) {
|
|
1199
|
+
return new Vec2D(x - a, y - b);
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
/**
|
|
1203
|
+
*
|
|
1204
|
+
* @param v
|
|
1205
|
+
* @return
|
|
1206
|
+
*/
|
|
1207
|
+
@Override
|
|
1208
|
+
public final Vec2D sub(ReadonlyVec2D v) {
|
|
1209
|
+
return new Vec2D(x - v.x(), y - v.y());
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
@Override
|
|
1213
|
+
public final Vec2D sub(Vec2D v) {
|
|
1214
|
+
return new Vec2D(x - v.x, y - v.y);
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
/**
|
|
1218
|
+
* Subtracts vector {a,b,c} and overrides coordinates with result.
|
|
1219
|
+
*
|
|
1220
|
+
* @param a X coordinate
|
|
1221
|
+
* @param b Y coordinate
|
|
1222
|
+
* @return itself
|
|
1223
|
+
*/
|
|
1224
|
+
public final Vec2D subSelf(float a, float b) {
|
|
1225
|
+
x -= a;
|
|
1226
|
+
y -= b;
|
|
1227
|
+
return this;
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
/**
|
|
1231
|
+
* Subtracts vector v and overrides coordinates with result.
|
|
1232
|
+
*
|
|
1233
|
+
* @param v vector to be subtracted
|
|
1234
|
+
* @return itself
|
|
1235
|
+
*/
|
|
1236
|
+
public final Vec2D subSelf(Vec2D v) {
|
|
1237
|
+
x -= v.x;
|
|
1238
|
+
y -= v.y;
|
|
1239
|
+
return this;
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
@Override
|
|
1243
|
+
public final Vec2D tangentNormalOfEllipse(Vec2D eO, Vec2D eR) {
|
|
1244
|
+
Vec2D p = this.sub(eO);
|
|
1245
|
+
|
|
1246
|
+
float xr2 = eR.x * eR.x;
|
|
1247
|
+
float yr2 = eR.y * eR.y;
|
|
1248
|
+
|
|
1249
|
+
return new Vec2D(p.x / xr2, p.y / yr2).normalize();
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
@Override
|
|
1253
|
+
public final Vec3D to3DXY() {
|
|
1254
|
+
return new Vec3D(x, y, 0);
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1257
|
+
@Override
|
|
1258
|
+
public final Vec3D to3DXZ() {
|
|
1259
|
+
return new Vec3D(x, 0, y);
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
@Override
|
|
1263
|
+
public final Vec3D to3DYZ() {
|
|
1264
|
+
return new Vec3D(0, x, y);
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
/**
|
|
1268
|
+
*
|
|
1269
|
+
* @return
|
|
1270
|
+
*/
|
|
1271
|
+
@Override
|
|
1272
|
+
public float[] toArray() {
|
|
1273
|
+
return new float[]{
|
|
1274
|
+
x, y
|
|
1275
|
+
};
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
/**
|
|
1279
|
+
*
|
|
1280
|
+
* @return
|
|
1281
|
+
*/
|
|
1282
|
+
public final Vec2D toCartesian() {
|
|
1283
|
+
float xx = (float) (x * Math.cos(y));
|
|
1284
|
+
y = (float) (x * Math.sin(y));
|
|
1285
|
+
x = xx;
|
|
1286
|
+
return this;
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
/**
|
|
1290
|
+
*
|
|
1291
|
+
* @return
|
|
1292
|
+
*/
|
|
1293
|
+
public final Vec2D toPolar() {
|
|
1294
|
+
float r = (float) Math.sqrt(x * x + y * y);
|
|
1295
|
+
y = (float) Math.atan2(y, x);
|
|
1296
|
+
x = r;
|
|
1297
|
+
return this;
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
/**
|
|
1301
|
+
*
|
|
1302
|
+
* @return
|
|
1303
|
+
*/
|
|
1304
|
+
@Override
|
|
1305
|
+
public String toString() {
|
|
1306
|
+
StringBuilder sb = new StringBuilder(32);
|
|
1307
|
+
sb.append("{x:").append(x).append(", y:").append(y).append("}");
|
|
1308
|
+
return sb.toString();
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
/**
|
|
1312
|
+
*
|
|
1313
|
+
* @return
|
|
1314
|
+
*/
|
|
1315
|
+
@Override
|
|
1316
|
+
public final float x() {
|
|
1317
|
+
return x;
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
/**
|
|
1321
|
+
*
|
|
1322
|
+
* @return
|
|
1323
|
+
*/
|
|
1324
|
+
@Override
|
|
1325
|
+
public final float y() {
|
|
1326
|
+
return y;
|
|
1327
|
+
}
|
|
1328
|
+
}
|