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,431 @@
|
|
|
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.InterpolateStrategy;
|
|
31
|
+
import toxi.math.MathUtils;
|
|
32
|
+
import toxi.math.ScaleMap;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Readonly, immutable interface wrapper for Vec3D instances. Used throughout
|
|
36
|
+
* the library for safety purposes.
|
|
37
|
+
*/
|
|
38
|
+
public interface ReadonlyVec4D {
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Add vector v and returns result as new vector.
|
|
42
|
+
*
|
|
43
|
+
* @param v
|
|
44
|
+
* vector to add
|
|
45
|
+
*
|
|
46
|
+
* @return result as new vector
|
|
47
|
+
*/
|
|
48
|
+
public Vec4D add(ReadonlyVec4D v);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
* @param t
|
|
53
|
+
* @param s
|
|
54
|
+
* @return
|
|
55
|
+
*/
|
|
56
|
+
public Vec4D addScaled(ReadonlyVec4D t, float s);
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Adds vector {a,b,c} and returns result as new vector.
|
|
60
|
+
*
|
|
61
|
+
* @param a
|
|
62
|
+
* X coordinate
|
|
63
|
+
* @param b
|
|
64
|
+
* Y coordinate
|
|
65
|
+
* @param c
|
|
66
|
+
* Z coordinate
|
|
67
|
+
*
|
|
68
|
+
* @return result as new vector
|
|
69
|
+
*/
|
|
70
|
+
public Vec4D addXYZ(float a, float b, float c);
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Returns the (4-space) angle in radians between this vector and the vector
|
|
74
|
+
* parameter; the return value is constrained to the range [0,PI].
|
|
75
|
+
*
|
|
76
|
+
* @param v
|
|
77
|
+
* the other vector
|
|
78
|
+
* @return the angle in radians in the range [0,PI]
|
|
79
|
+
*/
|
|
80
|
+
public float angleBetween(ReadonlyVec4D v);
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Compares the length of the vector with another one.
|
|
84
|
+
*
|
|
85
|
+
* @param v
|
|
86
|
+
* vector to compare with
|
|
87
|
+
*
|
|
88
|
+
* @return -1 if other vector is longer, 0 if both are equal or else +1
|
|
89
|
+
*/
|
|
90
|
+
public int compareTo(ReadonlyVec4D v);
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Copy.
|
|
94
|
+
*
|
|
95
|
+
* @return a new independent instance/copy of a given vector
|
|
96
|
+
*/
|
|
97
|
+
public Vec4D copy();
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Calculates distance to another vector.
|
|
101
|
+
*
|
|
102
|
+
* @param v
|
|
103
|
+
* non-null vector
|
|
104
|
+
*
|
|
105
|
+
* @return distance or Float.NaN if v=null
|
|
106
|
+
*/
|
|
107
|
+
public float distanceTo(ReadonlyVec4D v);
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Calculates the squared distance to another vector.
|
|
111
|
+
*
|
|
112
|
+
* @param v
|
|
113
|
+
* non-null vector
|
|
114
|
+
*
|
|
115
|
+
* @return distance or NaN if v=null
|
|
116
|
+
*
|
|
117
|
+
* @see #magSquared()
|
|
118
|
+
*/
|
|
119
|
+
public float distanceToSquared(ReadonlyVec4D v);
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Computes the scalar product (dot product) with the given vector.
|
|
123
|
+
*
|
|
124
|
+
* @param v
|
|
125
|
+
* the v
|
|
126
|
+
*
|
|
127
|
+
* @return dot product
|
|
128
|
+
*
|
|
129
|
+
* @see <a href="http://en.wikipedia.org/wiki/Dot_product">Wikipedia
|
|
130
|
+
* entry</a>
|
|
131
|
+
*/
|
|
132
|
+
public float dot(ReadonlyVec4D v);
|
|
133
|
+
|
|
134
|
+
/*
|
|
135
|
+
* (non-Javadoc)
|
|
136
|
+
*
|
|
137
|
+
* @see java.lang.Object#equals(java.lang.Object)
|
|
138
|
+
*/
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
*
|
|
142
|
+
* @param obj
|
|
143
|
+
* @return
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
@Override
|
|
147
|
+
public boolean equals(Object obj);
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Compares this vector with the one given. The vectors are deemed equal if
|
|
151
|
+
* the individual differences of all component values are within the given
|
|
152
|
+
* tolerance.
|
|
153
|
+
*
|
|
154
|
+
* @param v
|
|
155
|
+
* the v
|
|
156
|
+
* @param tolerance
|
|
157
|
+
* the tolerance
|
|
158
|
+
*
|
|
159
|
+
* @return true, if equal
|
|
160
|
+
*/
|
|
161
|
+
public boolean equalsWithTolerance(ReadonlyVec4D v, float tolerance);
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Gets the abs.
|
|
165
|
+
*
|
|
166
|
+
* @return the abs
|
|
167
|
+
*/
|
|
168
|
+
public Vec4D getAbs();
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Scales vector uniformly by factor -1 ( v = -v ).
|
|
172
|
+
*
|
|
173
|
+
* @return result as new vector
|
|
174
|
+
*/
|
|
175
|
+
public Vec4D getInvertedXYZ();
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Produces a new vector with all of its coordinates passed through the
|
|
179
|
+
* given {@link ScaleMap}. This version also maps the w coordinate. For
|
|
180
|
+
* mapping only XYZ use the {@link #getMappedXYZ(ScaleMap)} version.
|
|
181
|
+
*
|
|
182
|
+
* @param map
|
|
183
|
+
* @return mapped vector
|
|
184
|
+
*/
|
|
185
|
+
public Vec4D getMapped(ScaleMap map);
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Produces a new vector with only its XYZ coordinates passed through the
|
|
189
|
+
* given {@link ScaleMap}. This version keeps the original w coordinate. For
|
|
190
|
+
* mapping all XYZW, use the {@link #getMapped(ScaleMap)} version.
|
|
191
|
+
*
|
|
192
|
+
* @param map
|
|
193
|
+
* @return mapped vector
|
|
194
|
+
*/
|
|
195
|
+
public Vec4D getMappedXYZ(ScaleMap map);
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Produces the normalized version as a new vector.
|
|
199
|
+
*
|
|
200
|
+
* @return new vector
|
|
201
|
+
*/
|
|
202
|
+
public Vec4D getNormalized();
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Produces a new vector normalized to the given length.
|
|
206
|
+
*
|
|
207
|
+
* @param len
|
|
208
|
+
* new desired length
|
|
209
|
+
*
|
|
210
|
+
* @return new vector
|
|
211
|
+
*/
|
|
212
|
+
public Vec4D getNormalizedTo(float len);
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Gets the rotated around axis.
|
|
216
|
+
*
|
|
217
|
+
* @param axis
|
|
218
|
+
* the axis
|
|
219
|
+
* @param theta
|
|
220
|
+
* the theta
|
|
221
|
+
*
|
|
222
|
+
* @return new result vector
|
|
223
|
+
*/
|
|
224
|
+
public Vec4D getRotatedAroundAxis(ReadonlyVec3D axis, float theta);
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Creates a new vector rotated by the given angle around the X axis.
|
|
228
|
+
*
|
|
229
|
+
* @param theta
|
|
230
|
+
* the theta
|
|
231
|
+
*
|
|
232
|
+
* @return rotated vector
|
|
233
|
+
*/
|
|
234
|
+
public Vec4D getRotatedX(float theta);
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Creates a new vector rotated by the given angle around the Y axis.
|
|
238
|
+
*
|
|
239
|
+
* @param theta
|
|
240
|
+
* the theta
|
|
241
|
+
*
|
|
242
|
+
* @return rotated vector
|
|
243
|
+
*/
|
|
244
|
+
public Vec4D getRotatedY(float theta);
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Creates a new vector rotated by the given angle around the Z axis.
|
|
248
|
+
*
|
|
249
|
+
* @param theta
|
|
250
|
+
* the theta
|
|
251
|
+
*
|
|
252
|
+
* @return rotated vector
|
|
253
|
+
*/
|
|
254
|
+
public Vec4D getRotatedZ(float theta);
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Creates a new vector with its XYZ coordinates rounded to the given
|
|
258
|
+
* precision (grid alignment). The weight component remains unmodified.
|
|
259
|
+
*
|
|
260
|
+
* @param prec
|
|
261
|
+
* @return grid aligned vector
|
|
262
|
+
*/
|
|
263
|
+
public Vec4D getRoundedXYZTo(float prec);
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
*
|
|
267
|
+
* @return
|
|
268
|
+
*/
|
|
269
|
+
public Vec4D getUnweighted();
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
*
|
|
273
|
+
* @return
|
|
274
|
+
*/
|
|
275
|
+
public Vec4D getWeighted();
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Interpolates the vector towards the given target vector, using linear
|
|
279
|
+
* interpolation.
|
|
280
|
+
*
|
|
281
|
+
* @param v
|
|
282
|
+
* target vector
|
|
283
|
+
* @param f
|
|
284
|
+
* interpolation factor (should be in the range 0..1)
|
|
285
|
+
*
|
|
286
|
+
* @return result as new vector
|
|
287
|
+
*/
|
|
288
|
+
public Vec4D interpolateTo(ReadonlyVec4D v, float f);
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Interpolates the vector towards the given target vector, using the given
|
|
292
|
+
* {@link InterpolateStrategy}.
|
|
293
|
+
*
|
|
294
|
+
* @param v
|
|
295
|
+
* target vector
|
|
296
|
+
* @param f
|
|
297
|
+
* interpolation factor (should be in the range 0..1)
|
|
298
|
+
* @param s
|
|
299
|
+
* InterpolateStrategy instance
|
|
300
|
+
*
|
|
301
|
+
* @return result as new vector
|
|
302
|
+
*/
|
|
303
|
+
public Vec4D interpolateTo(ReadonlyVec4D v, float f, InterpolateStrategy s);
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Checks if vector has a magnitude equals or close to zero (tolerance used
|
|
307
|
+
* is {@link MathUtils#EPS}).
|
|
308
|
+
*
|
|
309
|
+
* @return true, if zero vector
|
|
310
|
+
*/
|
|
311
|
+
public boolean isZeroVector();
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Calculates the magnitude/eucledian length of the vector.
|
|
315
|
+
*
|
|
316
|
+
* @return vector length
|
|
317
|
+
*/
|
|
318
|
+
public float magnitude();
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Calculates only the squared magnitude/length of the vector. Useful for
|
|
322
|
+
* inverse square law applications and/or for speed reasons or if the real
|
|
323
|
+
* eucledian distance is not required (e.g. sorting).
|
|
324
|
+
*
|
|
325
|
+
* @return squared magnitude (x^2 + y^2 + z^2)
|
|
326
|
+
*/
|
|
327
|
+
public float magSquared();
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Scales vector uniformly and returns result as new vector.
|
|
331
|
+
*
|
|
332
|
+
* @param s
|
|
333
|
+
* scale factor
|
|
334
|
+
*
|
|
335
|
+
* @return new vector
|
|
336
|
+
*/
|
|
337
|
+
public Vec4D scale(float s);
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Scales vector non-uniformly and returns result as new vector.
|
|
341
|
+
*
|
|
342
|
+
* @param x
|
|
343
|
+
* scale factor for X coordinate
|
|
344
|
+
* @param y
|
|
345
|
+
* scale factor for Y coordinate
|
|
346
|
+
* @param z
|
|
347
|
+
* scale factor for Z coordinate
|
|
348
|
+
* @param w
|
|
349
|
+
*
|
|
350
|
+
* @return new vector
|
|
351
|
+
*/
|
|
352
|
+
public Vec4D scale(float x, float y, float z, float w);
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Scales vector non-uniformly by vector v and returns result as new vector.
|
|
356
|
+
*
|
|
357
|
+
* @param s
|
|
358
|
+
* scale vector
|
|
359
|
+
*
|
|
360
|
+
* @return new vector
|
|
361
|
+
*/
|
|
362
|
+
public Vec4D scale(ReadonlyVec4D s);
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Subtracts vector v and returns result as new vector.
|
|
366
|
+
*
|
|
367
|
+
* @param v
|
|
368
|
+
* vector to be subtracted
|
|
369
|
+
*
|
|
370
|
+
* @return result as new vector
|
|
371
|
+
*/
|
|
372
|
+
public Vec4D sub(ReadonlyVec4D v);
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Subtracts vector {a,b,c} and returns result as new vector.
|
|
376
|
+
*
|
|
377
|
+
* @param a
|
|
378
|
+
* X coordinate
|
|
379
|
+
* @param b
|
|
380
|
+
* Y coordinate
|
|
381
|
+
* @param c
|
|
382
|
+
* Z coordinate
|
|
383
|
+
*
|
|
384
|
+
* @return result as new vector
|
|
385
|
+
*/
|
|
386
|
+
public Vec4D subXYZ(float a, float b, float c);
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
*
|
|
390
|
+
* @return
|
|
391
|
+
*/
|
|
392
|
+
public float[] toArray();
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
*
|
|
396
|
+
* @param out
|
|
397
|
+
* @return
|
|
398
|
+
*/
|
|
399
|
+
public Vec3D unweightInto(Vec3D out);
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
*
|
|
403
|
+
* @return
|
|
404
|
+
*/
|
|
405
|
+
public float w();
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
*
|
|
409
|
+
* @param out
|
|
410
|
+
* @return
|
|
411
|
+
*/
|
|
412
|
+
public Vec3D weightInto(Vec3D out);
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
*
|
|
416
|
+
* @return
|
|
417
|
+
*/
|
|
418
|
+
public float x();
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
*
|
|
422
|
+
* @return
|
|
423
|
+
*/
|
|
424
|
+
public float y();
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
*
|
|
428
|
+
* @return
|
|
429
|
+
*/
|
|
430
|
+
public float z();
|
|
431
|
+
}
|
|
@@ -0,0 +1,720 @@
|
|
|
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 java.util.ArrayList;
|
|
31
|
+
import java.util.List;
|
|
32
|
+
|
|
33
|
+
import javax.xml.bind.annotation.XmlAccessType;
|
|
34
|
+
import javax.xml.bind.annotation.XmlAccessorType;
|
|
35
|
+
import javax.xml.bind.annotation.XmlAttribute;
|
|
36
|
+
import toxi.math.MathUtils;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
* @author tux
|
|
41
|
+
*/
|
|
42
|
+
@XmlAccessorType(XmlAccessType.FIELD)
|
|
43
|
+
public class Rect implements Shape2D {
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Factory method, constructs a new rectangle from a center point and extent
|
|
47
|
+
* vector.
|
|
48
|
+
*
|
|
49
|
+
* @param center
|
|
50
|
+
* @param extent
|
|
51
|
+
* @return new rect
|
|
52
|
+
*/
|
|
53
|
+
public static final Rect fromCenterExtent(ReadonlyVec2D center, Vec2D extent) {
|
|
54
|
+
return new Rect(center.sub(extent), center.add(extent));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Factory method, computes & returns the bounding rect for the given list
|
|
59
|
+
* of points.
|
|
60
|
+
*
|
|
61
|
+
* @param points
|
|
62
|
+
* @return bounding rect
|
|
63
|
+
* @since 0021
|
|
64
|
+
*/
|
|
65
|
+
public static final Rect getBoundingRect(List<? extends Vec2D> points) {
|
|
66
|
+
final Vec2D first = points.get(0);
|
|
67
|
+
final Rect bounds = new Rect(first.x, first.y, 0, 0);
|
|
68
|
+
for (int i = 1, num = points.size(); i < num; i++) {
|
|
69
|
+
bounds.growToContainPoint(points.get(i));
|
|
70
|
+
}
|
|
71
|
+
return bounds;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@XmlAttribute(required = true)
|
|
75
|
+
public float x,
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
*
|
|
79
|
+
*/
|
|
80
|
+
y,
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
*
|
|
84
|
+
*/
|
|
85
|
+
width,
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
*
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
*
|
|
93
|
+
*/
|
|
94
|
+
height;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Constructs an empty rectangle at point 0,0 with no dimensions.
|
|
98
|
+
*/
|
|
99
|
+
public Rect() {
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Constructs a new rectangle using a point and dimensions
|
|
105
|
+
*
|
|
106
|
+
* @param x
|
|
107
|
+
* x of top left
|
|
108
|
+
* @param y
|
|
109
|
+
* y of top left
|
|
110
|
+
* @param width
|
|
111
|
+
* @param height
|
|
112
|
+
*/
|
|
113
|
+
public Rect(float x, float y, float width, float height) {
|
|
114
|
+
this.x = x;
|
|
115
|
+
this.y = y;
|
|
116
|
+
this.width = width;
|
|
117
|
+
this.height = height;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Constructs a new rectangle defined by the two points given.
|
|
122
|
+
*
|
|
123
|
+
* @param p1
|
|
124
|
+
* @param p2
|
|
125
|
+
*/
|
|
126
|
+
public Rect(ReadonlyVec2D p1, ReadonlyVec2D p2) {
|
|
127
|
+
Vec2D tl = Vec2D.min(p1, p2);
|
|
128
|
+
Vec2D br = Vec2D.max(p1, p2);
|
|
129
|
+
x = tl.x;
|
|
130
|
+
y = tl.y;
|
|
131
|
+
width = br.x - x;
|
|
132
|
+
height = br.y - y;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Checks if the given point is within the rectangle's bounds.
|
|
137
|
+
*
|
|
138
|
+
* @param p
|
|
139
|
+
* point to check
|
|
140
|
+
* @return true, if point is contained
|
|
141
|
+
*/
|
|
142
|
+
@Override
|
|
143
|
+
public boolean containsPoint(ReadonlyVec2D p) {
|
|
144
|
+
float px = p.x();
|
|
145
|
+
float py = p.y();
|
|
146
|
+
if (px < x || px > x + width) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return (py >= y || py <= y + height);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Creates a copy of this rectangle
|
|
154
|
+
*
|
|
155
|
+
* @return new instance
|
|
156
|
+
*/
|
|
157
|
+
public Rect copy() {
|
|
158
|
+
return new Rect(x, y, width, height);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Returns true if the Object o is of type Rect and all of the data members
|
|
163
|
+
* of o are equal to the corresponding data members in this rectangle.
|
|
164
|
+
*
|
|
165
|
+
* @param o
|
|
166
|
+
* the Object with which the comparison is made
|
|
167
|
+
* @return true or false
|
|
168
|
+
*/
|
|
169
|
+
@Override
|
|
170
|
+
public boolean equals(Object o) {
|
|
171
|
+
if (o instanceof Rect) {
|
|
172
|
+
Rect r = (Rect) o;
|
|
173
|
+
return (x == r.x && y == r.y && width == r.width && height == r.height);
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@Override
|
|
179
|
+
public final float getArea() {
|
|
180
|
+
return width * height;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Computes the aspect ratio of the rect as width over height.
|
|
185
|
+
*
|
|
186
|
+
* @return aspect ratio
|
|
187
|
+
*/
|
|
188
|
+
public final float getAspect() {
|
|
189
|
+
return width / height;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
*
|
|
194
|
+
* @return
|
|
195
|
+
*/
|
|
196
|
+
public float getBottom() {
|
|
197
|
+
return y + height;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
*
|
|
202
|
+
* @return
|
|
203
|
+
*/
|
|
204
|
+
public Vec2D getBottomLeft() {
|
|
205
|
+
return new Vec2D(x, y + height);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
*
|
|
210
|
+
* @return
|
|
211
|
+
*/
|
|
212
|
+
public final Vec2D getBottomRight() {
|
|
213
|
+
return new Vec2D(x + width, y + height);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
@Override
|
|
217
|
+
public Circle getBoundingCircle() {
|
|
218
|
+
return new Circle(getCentroid(),
|
|
219
|
+
new Vec2D(width, height).magnitude() / 2);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Only provided because the Rect class implements {@link Shape2D}. The
|
|
224
|
+
* bounding rect of a rectangle is itself.
|
|
225
|
+
*
|
|
226
|
+
* @return itself
|
|
227
|
+
*
|
|
228
|
+
* @see toxi.geom.Shape2D#getBounds()
|
|
229
|
+
*/
|
|
230
|
+
@Override
|
|
231
|
+
public Rect getBounds() {
|
|
232
|
+
return this;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Returns the centroid of the rectangle.
|
|
237
|
+
*
|
|
238
|
+
* @return centroid vector
|
|
239
|
+
*/
|
|
240
|
+
public final Vec2D getCentroid() {
|
|
241
|
+
return new Vec2D(x + width * 0.5f, y + height * 0.5f);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
@Override
|
|
245
|
+
public final float getCircumference() {
|
|
246
|
+
return 2 * width + 2 * height;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Returns a vector containing the width and height of the rectangle.
|
|
251
|
+
*
|
|
252
|
+
* @return dimension vector
|
|
253
|
+
*/
|
|
254
|
+
public final Vec2D getDimensions() {
|
|
255
|
+
return new Vec2D(width, height);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Returns one of the rectangles edges as {@link Line2D}. The edge IDs are:
|
|
260
|
+
* <ul>
|
|
261
|
+
* <li>0 - top</li>
|
|
262
|
+
* <li>1 - right</li>
|
|
263
|
+
* <li>2 - bottom</li>
|
|
264
|
+
* <li>3 - left</li>
|
|
265
|
+
* </ul>
|
|
266
|
+
*
|
|
267
|
+
* @param id
|
|
268
|
+
* edge ID
|
|
269
|
+
* @return edge as Line2D
|
|
270
|
+
*/
|
|
271
|
+
public Line2D getEdge(int id) {
|
|
272
|
+
Line2D edge = null;
|
|
273
|
+
switch (id) {
|
|
274
|
+
// top
|
|
275
|
+
case 0:
|
|
276
|
+
edge = new Line2D(x, y, x + width, y);
|
|
277
|
+
break;
|
|
278
|
+
// right
|
|
279
|
+
case 1:
|
|
280
|
+
edge = new Line2D(x + width, y, x + width, y + height);
|
|
281
|
+
break;
|
|
282
|
+
// bottom
|
|
283
|
+
case 2:
|
|
284
|
+
edge = new Line2D(x, y + height, x + width, y + height);
|
|
285
|
+
break;
|
|
286
|
+
// left
|
|
287
|
+
case 3:
|
|
288
|
+
edge = new Line2D(x, y, x, y + height);
|
|
289
|
+
break;
|
|
290
|
+
default:
|
|
291
|
+
throw new IllegalArgumentException("edge ID needs to be 0...3");
|
|
292
|
+
}
|
|
293
|
+
return edge;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
@Override
|
|
297
|
+
public List<Line2D> getEdges() {
|
|
298
|
+
List<Line2D> edges = new ArrayList<>();
|
|
299
|
+
for (int i = 0; i < 4; i++) {
|
|
300
|
+
edges.add(getEdge(i));
|
|
301
|
+
}
|
|
302
|
+
return edges;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
*
|
|
307
|
+
* @return
|
|
308
|
+
*/
|
|
309
|
+
public float getLeft() {
|
|
310
|
+
return x;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Computes the normalized position of the given point within this
|
|
315
|
+
* rectangle, so that a point at the top-left corner becomes {0,0} and
|
|
316
|
+
* bottom-right {1,1}. The original point is not modified. Together with
|
|
317
|
+
* {@link #getUnmappedPointInRect(Vec2D)} this function can be used to map a
|
|
318
|
+
* point from one rectangle to another.
|
|
319
|
+
*
|
|
320
|
+
* @param p
|
|
321
|
+
* point to be mapped
|
|
322
|
+
* @return mapped Vec2D
|
|
323
|
+
*/
|
|
324
|
+
public Vec2D getMappedPointInRect(Vec2D p) {
|
|
325
|
+
return new Vec2D((p.x - x) / width, (p.y - y) / height);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Creates a random point within the rectangle.
|
|
330
|
+
*
|
|
331
|
+
* @return Vec2D
|
|
332
|
+
*/
|
|
333
|
+
@Override
|
|
334
|
+
public Vec2D getRandomPoint() {
|
|
335
|
+
return new Vec2D(MathUtils.random(x, x + width), MathUtils.random(y, y
|
|
336
|
+
+ height));
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
*
|
|
341
|
+
* @return
|
|
342
|
+
*/
|
|
343
|
+
public float getRight() {
|
|
344
|
+
return x + width;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
*
|
|
349
|
+
* @return
|
|
350
|
+
*/
|
|
351
|
+
public float getTop() {
|
|
352
|
+
return y;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
*
|
|
357
|
+
* @return
|
|
358
|
+
*/
|
|
359
|
+
public final Vec2D getTopLeft() {
|
|
360
|
+
return new Vec2D(x, y);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
*
|
|
365
|
+
* @return
|
|
366
|
+
*/
|
|
367
|
+
public Vec2D getTopRight() {
|
|
368
|
+
return new Vec2D(x + width, y);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Inverse operation of {@link #getMappedPointInRect(Vec2D)}. Given a
|
|
373
|
+
* normalized point it computes the position within this rectangle, so that
|
|
374
|
+
* a point at {0,0} becomes the top-left corner and {1,1} bottom-right. The
|
|
375
|
+
* original point is not modified. Together with
|
|
376
|
+
* {@link #getUnmappedPointInRect(Vec2D)} this function can be used to map a
|
|
377
|
+
* point from one rectangle to another.
|
|
378
|
+
*
|
|
379
|
+
* @param p
|
|
380
|
+
* point to be mapped
|
|
381
|
+
* @return mapped Vec2D
|
|
382
|
+
*/
|
|
383
|
+
public Vec2D getUnmappedPointInRect(Vec2D p) {
|
|
384
|
+
return new Vec2D(p.x * width + x, p.y * height + y);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
*
|
|
389
|
+
* @param p
|
|
390
|
+
* @return
|
|
391
|
+
*/
|
|
392
|
+
public Rect growToContainPoint(ReadonlyVec2D p) {
|
|
393
|
+
if (!containsPoint(p)) {
|
|
394
|
+
if (p.x() < x) {
|
|
395
|
+
width = getRight() - p.x();
|
|
396
|
+
x = p.x();
|
|
397
|
+
} else if (p.x() > getRight()) {
|
|
398
|
+
width = p.x() - x;
|
|
399
|
+
}
|
|
400
|
+
if (p.y() < y) {
|
|
401
|
+
height = getBottom() - p.y();
|
|
402
|
+
y = p.y();
|
|
403
|
+
} else if (p.y() > getBottom()) {
|
|
404
|
+
height = p.y() - y;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return this;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Returns a hash code value based on the data values in this object. Two
|
|
412
|
+
* different Rect objects with identical data values (i.e., Rect.equals
|
|
413
|
+
* returns true) will return the same hash code value. Two objects with
|
|
414
|
+
* different data members may return the same hash value, although this is
|
|
415
|
+
* not likely.
|
|
416
|
+
*
|
|
417
|
+
* @return the integer hash code value
|
|
418
|
+
*/
|
|
419
|
+
@Override
|
|
420
|
+
public int hashCode() {
|
|
421
|
+
long bits = 1L;
|
|
422
|
+
bits = 31L * bits + VecMathUtil.floatToIntBits(x);
|
|
423
|
+
bits = 31L * bits + VecMathUtil.floatToIntBits(y);
|
|
424
|
+
bits = 31L * bits + VecMathUtil.floatToIntBits(width);
|
|
425
|
+
bits = 31L * bits + VecMathUtil.floatToIntBits(height);
|
|
426
|
+
return (int) (bits ^ (bits >> 32));
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* Creates a new rectangle by forming the intersection of this rectangle and
|
|
431
|
+
* the given other rect. The resulting bounds will be the rectangle of the
|
|
432
|
+
* overlay area or null if the rects do not intersect.
|
|
433
|
+
*
|
|
434
|
+
* @param r
|
|
435
|
+
* intersection partner rect
|
|
436
|
+
* @return new Rect or null
|
|
437
|
+
*/
|
|
438
|
+
public final Rect intersectionRectWith(Rect r) {
|
|
439
|
+
Rect isec = null;
|
|
440
|
+
if (intersectsRect(r)) {
|
|
441
|
+
float x1 = MathUtils.max(x, r.x);
|
|
442
|
+
float y1 = MathUtils.max(y, r.y);
|
|
443
|
+
float x2 = MathUtils.min(getRight(), r.getRight());
|
|
444
|
+
float y2 = MathUtils.min(getBottom(), r.getBottom());
|
|
445
|
+
isec = new Rect(x1, y1, x2 - x1, y2 - y1);
|
|
446
|
+
}
|
|
447
|
+
return isec;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
*
|
|
452
|
+
* @param c
|
|
453
|
+
* @param r
|
|
454
|
+
* @return
|
|
455
|
+
*/
|
|
456
|
+
public boolean intersectsCircle(Vec2D c, float r) {
|
|
457
|
+
float s, d = 0;
|
|
458
|
+
float x2 = x + width;
|
|
459
|
+
float y2 = y + height;
|
|
460
|
+
if (c.x < x) {
|
|
461
|
+
s = c.x - x;
|
|
462
|
+
d = s * s;
|
|
463
|
+
} else if (c.x > x2) {
|
|
464
|
+
s = c.x - x2;
|
|
465
|
+
d += s * s;
|
|
466
|
+
}
|
|
467
|
+
if (c.y < y) {
|
|
468
|
+
s = c.y - y;
|
|
469
|
+
d += s * s;
|
|
470
|
+
} else if (c.y > y2) {
|
|
471
|
+
s = c.y - y2;
|
|
472
|
+
d += s * s;
|
|
473
|
+
}
|
|
474
|
+
return d <= r * r;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Checks if the rectangle intersects with the given ray and if so computes
|
|
479
|
+
* the first intersection point. The method takes a min/max distance
|
|
480
|
+
* interval along the ray in which the intersection must occur.
|
|
481
|
+
*
|
|
482
|
+
* @param ray
|
|
483
|
+
* intersection ray
|
|
484
|
+
* @param minDist
|
|
485
|
+
* minimum distance
|
|
486
|
+
* @param maxDist
|
|
487
|
+
* max distance
|
|
488
|
+
* @return intersection point or null if no intersection in the given
|
|
489
|
+
* interval
|
|
490
|
+
*/
|
|
491
|
+
public ReadonlyVec2D intersectsRay(Ray2D ray, float minDist, float maxDist) {
|
|
492
|
+
Vec2D invDir = ray.getDirection().reciprocal();
|
|
493
|
+
boolean signDirX = invDir.x < 0;
|
|
494
|
+
boolean signDirY = invDir.y < 0;
|
|
495
|
+
Vec2D min = getTopLeft();
|
|
496
|
+
Vec2D max = getBottomRight();
|
|
497
|
+
Vec2D bbox = signDirX ? max : min;
|
|
498
|
+
float tmin = (bbox.x - ray.x) * invDir.x;
|
|
499
|
+
bbox = signDirX ? min : max;
|
|
500
|
+
float tmax = (bbox.x - ray.x) * invDir.x;
|
|
501
|
+
bbox = signDirY ? max : min;
|
|
502
|
+
float tymin = (bbox.y - ray.y) * invDir.y;
|
|
503
|
+
bbox = signDirY ? min : max;
|
|
504
|
+
float tymax = (bbox.y - ray.y) * invDir.y;
|
|
505
|
+
if ((tmin > tymax) || (tymin > tmax)) {
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
if (tymin > tmin) {
|
|
509
|
+
tmin = tymin;
|
|
510
|
+
}
|
|
511
|
+
if (tymax < tmax) {
|
|
512
|
+
tmax = tymax;
|
|
513
|
+
}
|
|
514
|
+
if ((tmin < maxDist) && (tmax > minDist)) {
|
|
515
|
+
return ray.getPointAtDistance(tmin);
|
|
516
|
+
}
|
|
517
|
+
return null;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Checks if this rectangle intersects/overlaps the given one.
|
|
522
|
+
*
|
|
523
|
+
* @param r
|
|
524
|
+
* another rect
|
|
525
|
+
* @return true, if intersecting
|
|
526
|
+
*/
|
|
527
|
+
public boolean intersectsRect(Rect r) {
|
|
528
|
+
return !(x > r.x + r.width || x + width < r.x || y > r.y + r.height || y
|
|
529
|
+
+ height < r.y);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
*
|
|
534
|
+
* @param s
|
|
535
|
+
* @return
|
|
536
|
+
*/
|
|
537
|
+
public Rect scale(float s) {
|
|
538
|
+
Vec2D c = getCentroid();
|
|
539
|
+
width *= s;
|
|
540
|
+
height *= s;
|
|
541
|
+
x = c.x - width * 0.5f;
|
|
542
|
+
y = c.y - height * 0.5f;
|
|
543
|
+
return this;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Sets new bounds for this rectangle.
|
|
548
|
+
*
|
|
549
|
+
* @param x
|
|
550
|
+
* x of top left
|
|
551
|
+
* @param y
|
|
552
|
+
* y of top right
|
|
553
|
+
* @param w
|
|
554
|
+
* width
|
|
555
|
+
* @param h
|
|
556
|
+
* height
|
|
557
|
+
* @return itself
|
|
558
|
+
*/
|
|
559
|
+
public final Rect set(float x, float y, float w, float h) {
|
|
560
|
+
this.x = x;
|
|
561
|
+
this.y = y;
|
|
562
|
+
this.width = w;
|
|
563
|
+
this.height = h;
|
|
564
|
+
return this;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
*
|
|
569
|
+
* @param r
|
|
570
|
+
* @return
|
|
571
|
+
*/
|
|
572
|
+
public final Rect set(Rect r) {
|
|
573
|
+
x = r.x;
|
|
574
|
+
y = r.y;
|
|
575
|
+
width = r.width;
|
|
576
|
+
height = r.height;
|
|
577
|
+
return this;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
*
|
|
582
|
+
* @param dim
|
|
583
|
+
* @return
|
|
584
|
+
*/
|
|
585
|
+
public final Rect setDimension(Vec2D dim) {
|
|
586
|
+
width = dim.x;
|
|
587
|
+
height = dim.y;
|
|
588
|
+
return this;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
*
|
|
593
|
+
* @param pos
|
|
594
|
+
* @return
|
|
595
|
+
*/
|
|
596
|
+
public final Rect setPosition(Vec2D pos) {
|
|
597
|
+
x = pos.x;
|
|
598
|
+
y = pos.y;
|
|
599
|
+
return this;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* Adds corner vertices for rounded rectangles polygon construction.
|
|
604
|
+
*
|
|
605
|
+
* @param poly
|
|
606
|
+
* @param o
|
|
607
|
+
* @param radius
|
|
608
|
+
* @param theta
|
|
609
|
+
* @param res
|
|
610
|
+
*/
|
|
611
|
+
private void toPolyArc(Polygon2D poly, Vec2D o, float radius, float theta,
|
|
612
|
+
int res) {
|
|
613
|
+
for (int i = 0; i <= res; i++) {
|
|
614
|
+
poly.add(o.add(Vec2D.fromTheta(theta + i * MathUtils.HALF_PI / res)
|
|
615
|
+
.scaleSelf(radius)));
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/**
|
|
620
|
+
* Creates a {@link Polygon2D} instance of the rect.
|
|
621
|
+
*
|
|
622
|
+
* @return rect as polygon
|
|
623
|
+
*/
|
|
624
|
+
@Override
|
|
625
|
+
public Polygon2D toPolygon2D() {
|
|
626
|
+
Polygon2D poly = new Polygon2D();
|
|
627
|
+
poly.add(new Vec2D(x, y));
|
|
628
|
+
poly.add(new Vec2D(x + width, y));
|
|
629
|
+
poly.add(new Vec2D(x + width, y + height));
|
|
630
|
+
poly.add(new Vec2D(x, y + height));
|
|
631
|
+
return poly;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Turns this rectangle into a rounded rectangle shaped {@link Polygon2D}
|
|
636
|
+
* instance with the given corner radius. The number of corner vertices to
|
|
637
|
+
* be used, can be specified as well.
|
|
638
|
+
*
|
|
639
|
+
* @param radius
|
|
640
|
+
* corner radius
|
|
641
|
+
* @param res
|
|
642
|
+
* number of vertices per corner
|
|
643
|
+
* @return rounded rect as polygon
|
|
644
|
+
*/
|
|
645
|
+
public Polygon2D toPolygon2D(float radius, int res) {
|
|
646
|
+
Polygon2D poly = new Polygon2D();
|
|
647
|
+
toPolyArc(poly, new Vec2D(x + width - radius, y + radius), radius,
|
|
648
|
+
-MathUtils.HALF_PI, res);
|
|
649
|
+
toPolyArc(poly, new Vec2D(x + width - radius, y + height - radius),
|
|
650
|
+
radius, 0, res);
|
|
651
|
+
toPolyArc(poly, new Vec2D(x + radius, y + height - radius), radius,
|
|
652
|
+
MathUtils.HALF_PI, res);
|
|
653
|
+
toPolyArc(poly, new Vec2D(x + radius, y + radius), radius,
|
|
654
|
+
MathUtils.PI, res);
|
|
655
|
+
return poly;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
*
|
|
660
|
+
* @return
|
|
661
|
+
*/
|
|
662
|
+
@Override
|
|
663
|
+
public String toString() {
|
|
664
|
+
return "rect: {x:" + x + ", y:" + y + ", width:" + width + ", height:"
|
|
665
|
+
+ height + "}";
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
*
|
|
670
|
+
* @param dx
|
|
671
|
+
* @param dy
|
|
672
|
+
* @return
|
|
673
|
+
*/
|
|
674
|
+
public Rect translate(float dx, float dy) {
|
|
675
|
+
x += dx;
|
|
676
|
+
y += dy;
|
|
677
|
+
return this;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
/**
|
|
681
|
+
*
|
|
682
|
+
* @param offset
|
|
683
|
+
* @return
|
|
684
|
+
*/
|
|
685
|
+
public Rect translate(ReadonlyVec2D offset) {
|
|
686
|
+
x += offset.x();
|
|
687
|
+
y += offset.y();
|
|
688
|
+
return this;
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
/**
|
|
692
|
+
* @deprecated use {@link #unionRectWith(Rect)} instead. Also note, that
|
|
693
|
+
* {@link #unionRectWith(Rect)} does NOT modify the original
|
|
694
|
+
* Rect anymore, but produces a new Rect instance.
|
|
695
|
+
* @param r
|
|
696
|
+
* @return new Rect
|
|
697
|
+
*/
|
|
698
|
+
@Deprecated
|
|
699
|
+
public final Rect union(Rect r) {
|
|
700
|
+
return unionRectWith(r);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* Creates a new rectangle by forming an union of this rectangle and the
|
|
705
|
+
* given other Rect. The resulting bounds will be inclusive of both.
|
|
706
|
+
*
|
|
707
|
+
* @param r
|
|
708
|
+
* @return new Rect
|
|
709
|
+
*/
|
|
710
|
+
public final Rect unionRectWith(Rect r) {
|
|
711
|
+
float x1 = MathUtils.min(x, r.x);
|
|
712
|
+
float x2 = MathUtils.max(x + width, r.x + r.width);
|
|
713
|
+
float w = x2 - x1;
|
|
714
|
+
float y1 = MathUtils.min(y, r.y);
|
|
715
|
+
float y2 = MathUtils.max(y + height, r.y + r.height);
|
|
716
|
+
float h = y2 - y1;
|
|
717
|
+
return new Rect(x1, y1, w, h);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
}
|