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,148 @@
|
|
|
1
|
+
package toxi.geom;
|
|
2
|
+
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
import java.util.List;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Standard multi-segment bezier curve implementation with optional automatic
|
|
8
|
+
* handle alignment between segments. Also provides curve tangent calculation
|
|
9
|
+
* feature. Can be used to create closed curves. Usage of this class is very
|
|
10
|
+
* similar to {@link Spline3D}.
|
|
11
|
+
*/
|
|
12
|
+
public class BezierCurve3D {
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @param a
|
|
17
|
+
* @param b
|
|
18
|
+
* @param c
|
|
19
|
+
* @param d
|
|
20
|
+
* @param t
|
|
21
|
+
* @return
|
|
22
|
+
*/
|
|
23
|
+
public static Vec3D computePointInSegment(Vec3D a, Vec3D b, Vec3D c,
|
|
24
|
+
Vec3D d, float t) {
|
|
25
|
+
float it = 1.0f - t;
|
|
26
|
+
float it2 = it * it;
|
|
27
|
+
float t2 = t * t;
|
|
28
|
+
return a.scale(it2 * it).addSelf(b.scale(3 * t * it2))
|
|
29
|
+
.addSelf(c.scale(3 * t2 * it)).addSelf(d.scale(t2 * t));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
*
|
|
34
|
+
* @param a
|
|
35
|
+
* @param b
|
|
36
|
+
* @param c
|
|
37
|
+
* @param d
|
|
38
|
+
* @param t
|
|
39
|
+
* @return
|
|
40
|
+
*/
|
|
41
|
+
public static Vec3D computeTangentInSegment(Vec3D a, Vec3D b, Vec3D c,
|
|
42
|
+
Vec3D d, float t) {
|
|
43
|
+
float t2 = t * t;
|
|
44
|
+
float x = (3 * t2 * (-a.x + 3 * b.x - 3 * c.x + d.x) + 6 * t
|
|
45
|
+
* (a.x - 2 * b.x + c.x) + 3 * (-a.x + b.x));
|
|
46
|
+
float y = (3 * t2 * (-a.y + 3 * b.y - 3 * c.y + d.y) + 6 * t
|
|
47
|
+
* (a.y - 2 * b.y + c.y) + 3 * (-a.y + b.y));
|
|
48
|
+
float z = (3 * t2 * (-a.z + 3 * b.z - 3 * c.z + d.z) + 6 * t
|
|
49
|
+
* (a.z - 2 * b.z + c.z) + 3 * (-a.z + b.z));
|
|
50
|
+
return new Vec3D(x, y, z).normalize();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private final List<Vec3D> points;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
*/
|
|
58
|
+
public BezierCurve3D() {
|
|
59
|
+
points = new ArrayList<Vec3D>();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
*
|
|
64
|
+
* @param points
|
|
65
|
+
*/
|
|
66
|
+
public BezierCurve3D(List<Vec3D> points) {
|
|
67
|
+
this.points = points;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
*
|
|
72
|
+
* @param p
|
|
73
|
+
* @return
|
|
74
|
+
*/
|
|
75
|
+
public BezierCurve3D add(Vec3D p) {
|
|
76
|
+
points.add(p);
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
*
|
|
82
|
+
*/
|
|
83
|
+
public void alignAllHandles() {
|
|
84
|
+
for (int i = 0, num = points.size() - 1; i < num; i += 3) {
|
|
85
|
+
alignHandlesForPoint(i);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
*
|
|
91
|
+
* @param id
|
|
92
|
+
*/
|
|
93
|
+
public void alignHandlesForPoint(int id) {
|
|
94
|
+
if (id < points.size() - 1) {
|
|
95
|
+
Vec3D c;
|
|
96
|
+
if (id == 0 && isClosed()) {
|
|
97
|
+
c = points.get(points.size() - 2);
|
|
98
|
+
} else {
|
|
99
|
+
c = points.get(id - 1);
|
|
100
|
+
}
|
|
101
|
+
Vec3D d = points.get(id);
|
|
102
|
+
Vec3D e = points.get(id + 1);
|
|
103
|
+
Vec3D cd = d.sub(c);
|
|
104
|
+
Vec3D de = e.sub(d);
|
|
105
|
+
Vec3D cd2 = cd.interpolateTo(de, 0.5f);
|
|
106
|
+
c.set(d.sub(cd2));
|
|
107
|
+
e.set(d.add(de.interpolateToSelf(cd, 0.5f)));
|
|
108
|
+
} else {
|
|
109
|
+
throw new IllegalArgumentException("invalid point index");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* @return true, if the curve is closed. I.e. the first and last control
|
|
115
|
+
* point coincide.
|
|
116
|
+
*/
|
|
117
|
+
public boolean isClosed() {
|
|
118
|
+
return points.get(0).equals(points.get(points.size() - 1));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Computes a list of intermediate curve points for all segments. For each
|
|
123
|
+
* curve segment the given number of points will be produced.
|
|
124
|
+
*
|
|
125
|
+
* @param res
|
|
126
|
+
* number of points per segment
|
|
127
|
+
* @return list of Vec3Ds
|
|
128
|
+
*/
|
|
129
|
+
public LineStrip3D toLineStrip3D(int res) {
|
|
130
|
+
LineStrip3D strip = new LineStrip3D();
|
|
131
|
+
int i = 0;
|
|
132
|
+
int maxRes = res;
|
|
133
|
+
for (int num = points.size(); i < num - 3; i += 3) {
|
|
134
|
+
Vec3D a = points.get(i);
|
|
135
|
+
Vec3D b = points.get(i + 1);
|
|
136
|
+
Vec3D c = points.get(i + 2);
|
|
137
|
+
Vec3D d = points.get(i + 3);
|
|
138
|
+
if (i + 3 > num - 3) {
|
|
139
|
+
maxRes++;
|
|
140
|
+
}
|
|
141
|
+
for (int t = 0; t < maxRes; t++) {
|
|
142
|
+
strip.add(computePointInSegment(a, b, c, d, (float) t / res));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return strip;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
package toxi.geom;
|
|
2
|
+
|
|
3
|
+
import java.awt.Shape;
|
|
4
|
+
import java.awt.geom.Area;
|
|
5
|
+
import java.awt.geom.Ellipse2D;
|
|
6
|
+
import java.awt.geom.Path2D;
|
|
7
|
+
import java.awt.geom.PathIterator;
|
|
8
|
+
import java.awt.geom.Rectangle2D;
|
|
9
|
+
import java.util.ArrayList;
|
|
10
|
+
import java.util.List;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @author tux
|
|
15
|
+
*/
|
|
16
|
+
public class BooleanShapeBuilder {
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
public enum Type {
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
UNION,
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
*/
|
|
31
|
+
INTERSECTION,
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
DIFFERENCE,
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
XOR;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private int bezierRes;
|
|
45
|
+
|
|
46
|
+
private final Area area;
|
|
47
|
+
private final Type type;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
* @param type
|
|
52
|
+
*/
|
|
53
|
+
public BooleanShapeBuilder(Type type) {
|
|
54
|
+
this(type, 8);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
*
|
|
59
|
+
* @param type
|
|
60
|
+
* @param bezierRes
|
|
61
|
+
*/
|
|
62
|
+
public BooleanShapeBuilder(Type type, int bezierRes) {
|
|
63
|
+
this.type = type;
|
|
64
|
+
this.bezierRes = bezierRes;
|
|
65
|
+
area = new Area();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
*
|
|
70
|
+
* @param s
|
|
71
|
+
* @return
|
|
72
|
+
*/
|
|
73
|
+
public BooleanShapeBuilder addShape(Shape2D s) {
|
|
74
|
+
return combineWithArea(new Area(convertToAWTShape(s)));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
*
|
|
79
|
+
* @param a
|
|
80
|
+
* @return
|
|
81
|
+
*/
|
|
82
|
+
public BooleanShapeBuilder combineWithArea(Area a) {
|
|
83
|
+
switch (type) {
|
|
84
|
+
case UNION:
|
|
85
|
+
area.add(a);
|
|
86
|
+
break;
|
|
87
|
+
case INTERSECTION:
|
|
88
|
+
area.intersect(a);
|
|
89
|
+
break;
|
|
90
|
+
case DIFFERENCE:
|
|
91
|
+
area.subtract(a);
|
|
92
|
+
break;
|
|
93
|
+
case XOR:
|
|
94
|
+
area.exclusiveOr(a);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
*
|
|
102
|
+
* @return
|
|
103
|
+
*/
|
|
104
|
+
public List<Polygon2D> computeShapes() {
|
|
105
|
+
List<Polygon2D> shapes = new ArrayList<Polygon2D>();
|
|
106
|
+
PathIterator i = area.getPathIterator(null);
|
|
107
|
+
float[] buf = new float[6];
|
|
108
|
+
Vec2D prev = new Vec2D();
|
|
109
|
+
Polygon2D s = null;
|
|
110
|
+
while (!i.isDone()) {
|
|
111
|
+
int id = i.currentSegment(buf);
|
|
112
|
+
switch (id) {
|
|
113
|
+
case PathIterator.SEG_MOVETO:
|
|
114
|
+
s = new Polygon2D();
|
|
115
|
+
shapes.add(s);
|
|
116
|
+
prev.set(buf[0], buf[1]);
|
|
117
|
+
s.add(prev.copy());
|
|
118
|
+
break;
|
|
119
|
+
case PathIterator.SEG_LINETO:
|
|
120
|
+
prev.set(buf[0], buf[1]);
|
|
121
|
+
s.add(prev.copy());
|
|
122
|
+
break;
|
|
123
|
+
case PathIterator.SEG_CUBICTO:
|
|
124
|
+
Vec2D pa = new Vec2D(buf[0], buf[1]);
|
|
125
|
+
Vec2D pb = new Vec2D(buf[2], buf[3]);
|
|
126
|
+
Vec2D pc = new Vec2D(buf[4], buf[5]);
|
|
127
|
+
for (int t = 0; t <= bezierRes; t++) {
|
|
128
|
+
s.add(BezierCurve2D.computePointInSegment(prev, pa, pb,
|
|
129
|
+
pc, (float) t / bezierRes));
|
|
130
|
+
}
|
|
131
|
+
prev.set(pc);
|
|
132
|
+
break;
|
|
133
|
+
case PathIterator.SEG_CLOSE:
|
|
134
|
+
break;
|
|
135
|
+
default:
|
|
136
|
+
throw new UnsupportedOperationException(
|
|
137
|
+
"Unsupported path segment type: " + id);
|
|
138
|
+
}
|
|
139
|
+
i.next();
|
|
140
|
+
}
|
|
141
|
+
return shapes;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private Shape convertToAWTShape(Shape2D s) {
|
|
145
|
+
if (s instanceof Rect) {
|
|
146
|
+
Rect r = (Rect) s;
|
|
147
|
+
return new Rectangle2D.Float(r.x, r.y, r.width, r.height);
|
|
148
|
+
}
|
|
149
|
+
if (s instanceof Triangle2D) {
|
|
150
|
+
Triangle2D t = (Triangle2D) s;
|
|
151
|
+
Path2D path = new Path2D.Float();
|
|
152
|
+
path.moveTo(t.a.x, t.a.y);
|
|
153
|
+
path.lineTo(t.b.x, t.b.y);
|
|
154
|
+
path.lineTo(t.c.x, t.c.y);
|
|
155
|
+
path.closePath();
|
|
156
|
+
return path;
|
|
157
|
+
}
|
|
158
|
+
if (s instanceof Ellipse) {
|
|
159
|
+
Ellipse e = (Ellipse) s;
|
|
160
|
+
Vec2D r = e.getRadii();
|
|
161
|
+
return new Ellipse2D.Float(e.x - r.x, e.y - r.y, r.x * 2, r.y * 2);
|
|
162
|
+
}
|
|
163
|
+
if (!(s instanceof Polygon2D)) {
|
|
164
|
+
s = s.toPolygon2D();
|
|
165
|
+
}
|
|
166
|
+
Polygon2D poly = (Polygon2D) s;
|
|
167
|
+
Path2D path = new Path2D.Float();
|
|
168
|
+
Vec2D p = poly.get(0);
|
|
169
|
+
path.moveTo(p.x, p.y);
|
|
170
|
+
for (int i = 1, num = poly.getNumVertices(); i < num; i++) {
|
|
171
|
+
p = poly.get(i);
|
|
172
|
+
path.lineTo(p.x, p.y);
|
|
173
|
+
}
|
|
174
|
+
path.closePath();
|
|
175
|
+
return path;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
*
|
|
180
|
+
* @return
|
|
181
|
+
*/
|
|
182
|
+
public Area getArea() {
|
|
183
|
+
return area;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
package toxi.geom;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @author tux
|
|
6
|
+
*/
|
|
7
|
+
public class BoxIntersector implements Intersector3D {
|
|
8
|
+
|
|
9
|
+
private AABB box;
|
|
10
|
+
private final IsectData3D isec;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @param box
|
|
15
|
+
*/
|
|
16
|
+
public BoxIntersector(AABB box) {
|
|
17
|
+
this.box = box;
|
|
18
|
+
this.isec = new IsectData3D();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @return the box
|
|
23
|
+
*/
|
|
24
|
+
public AABB getBox() {
|
|
25
|
+
return box;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@Override
|
|
29
|
+
public IsectData3D getIntersectionData() {
|
|
30
|
+
return isec;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@Override
|
|
34
|
+
public boolean intersectsRay(Ray3D ray) {
|
|
35
|
+
final Vec3D pos = box.intersectsRay(ray, 0, Float.MAX_VALUE);
|
|
36
|
+
isec.pos = pos;
|
|
37
|
+
isec.isIntersection = pos != null;
|
|
38
|
+
if (isec.isIntersection) {
|
|
39
|
+
isec.normal = box.getNormalForPoint(pos);
|
|
40
|
+
isec.dist = ray.distanceTo(pos);
|
|
41
|
+
}
|
|
42
|
+
return isec.isIntersection;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param box
|
|
47
|
+
* the box to set
|
|
48
|
+
*/
|
|
49
|
+
public void setBox(AABB box) {
|
|
50
|
+
this.box = box;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
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.List;
|
|
31
|
+
|
|
32
|
+
import toxi.math.MathUtils;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* This class overrides {@link Ellipse} to define a 2D circle and provides
|
|
36
|
+
* several utility methods for it, including factory methods to construct
|
|
37
|
+
* circles from points.
|
|
38
|
+
*/
|
|
39
|
+
public class Circle extends Ellipse {
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Factory method to construct a circle which has the two given points lying
|
|
43
|
+
* on its perimeter. If the points are coincident, the circle will have a
|
|
44
|
+
* radius of zero.
|
|
45
|
+
*
|
|
46
|
+
* @param p1
|
|
47
|
+
* @param p2
|
|
48
|
+
* @return new circle instance
|
|
49
|
+
*/
|
|
50
|
+
public static Circle from2Points(Vec2D p1, Vec2D p2) {
|
|
51
|
+
Vec2D m = p1.interpolateTo(p2, 0.5f);
|
|
52
|
+
return new Circle(m, m.distanceTo(p1));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Factory method to construct a circle which has the three given points
|
|
57
|
+
* lying on its perimeter. The function returns null, if the 3 points are
|
|
58
|
+
* co-linear (in which case it's impossible to find a circle).
|
|
59
|
+
*
|
|
60
|
+
* Based on CPP code by Paul Bourke:
|
|
61
|
+
* http://local.wasp.uwa.edu.au/~pbourke/geometry/circlefrom3/
|
|
62
|
+
*
|
|
63
|
+
* @param p1
|
|
64
|
+
* @param p2
|
|
65
|
+
* @param p3
|
|
66
|
+
* @return new circle instance or null
|
|
67
|
+
*/
|
|
68
|
+
public static Circle from3Points(Vec2D p1, Vec2D p2, Vec2D p3) {
|
|
69
|
+
Circle circle = null;
|
|
70
|
+
Vec2D deltaA = p2.sub(p1);
|
|
71
|
+
Vec2D deltaB = p3.sub(p2);
|
|
72
|
+
if (MathUtils.abs(deltaA.x) <= 0.0000001f
|
|
73
|
+
&& MathUtils.abs(deltaB.y) <= 0.0000001f) {
|
|
74
|
+
Vec2D centroid = new Vec2D(p2.x + p3.x, p1.y + p2.y)
|
|
75
|
+
.scaleSelf(0.5f);
|
|
76
|
+
float radius = centroid.distanceTo(p1);
|
|
77
|
+
circle = new Circle(centroid, radius);
|
|
78
|
+
} else {
|
|
79
|
+
float aSlope = deltaA.y / deltaA.x;
|
|
80
|
+
float bSlope = deltaB.y / deltaB.x;
|
|
81
|
+
if (MathUtils.abs(aSlope - bSlope) > 0.0000001f) {
|
|
82
|
+
float x = (aSlope * bSlope * (p1.y - p3.y) + bSlope
|
|
83
|
+
* (p1.x + p2.x) - aSlope * (p2.x + p3.x))
|
|
84
|
+
/ (2 * (bSlope - aSlope));
|
|
85
|
+
float y = -(x - (p1.x + p2.x) / 2) / aSlope + (p1.y + p2.y) / 2;
|
|
86
|
+
Vec2D centroid = new Vec2D(x, y);
|
|
87
|
+
float radius = centroid.distanceTo(p1);
|
|
88
|
+
circle = new Circle(centroid, radius);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return circle;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
*
|
|
96
|
+
* @param vertices
|
|
97
|
+
* @return
|
|
98
|
+
*/
|
|
99
|
+
public static Circle newBoundingCircle(List<Vec2D> vertices) {
|
|
100
|
+
Vec2D origin = new Vec2D();
|
|
101
|
+
float maxD = 0;
|
|
102
|
+
for (Vec2D v : vertices) {
|
|
103
|
+
origin.addSelf(v);
|
|
104
|
+
}
|
|
105
|
+
origin.scaleSelf(1f / vertices.size());
|
|
106
|
+
for (Vec2D v : vertices) {
|
|
107
|
+
float d = origin.distanceToSquared(v);
|
|
108
|
+
if (d > maxD) {
|
|
109
|
+
maxD = d;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return new Circle(origin, (float) Math.sqrt(maxD));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
*
|
|
117
|
+
*/
|
|
118
|
+
public Circle() {
|
|
119
|
+
this(new Vec2D(), 1);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
*
|
|
124
|
+
* @param c
|
|
125
|
+
*/
|
|
126
|
+
public Circle(Circle c) {
|
|
127
|
+
this(c, c.radius.x);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
*
|
|
132
|
+
* @param radius
|
|
133
|
+
*/
|
|
134
|
+
public Circle(float radius) {
|
|
135
|
+
this(0, 0, radius);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
*
|
|
140
|
+
* @param x
|
|
141
|
+
* @param y
|
|
142
|
+
* @param radius
|
|
143
|
+
*/
|
|
144
|
+
public Circle(float x, float y, float radius) {
|
|
145
|
+
super(x, y, radius, radius);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
*
|
|
150
|
+
* @param origin
|
|
151
|
+
* @param radius
|
|
152
|
+
*/
|
|
153
|
+
public Circle(ReadonlyVec2D origin, float radius) {
|
|
154
|
+
super(origin, radius);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/*
|
|
158
|
+
* (non-Javadoc)
|
|
159
|
+
*
|
|
160
|
+
* @see toxi.geom.Ellipse#containsPoint(toxi.geom.Vec2D)
|
|
161
|
+
*/
|
|
162
|
+
@Override
|
|
163
|
+
public boolean containsPoint(ReadonlyVec2D p) {
|
|
164
|
+
return distanceToSquared(p) <= radius.x * radius.x;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
* (non-Javadoc)
|
|
169
|
+
*
|
|
170
|
+
* @see toxi.geom.Ellipse#getCircumference()
|
|
171
|
+
*/
|
|
172
|
+
@Override
|
|
173
|
+
public float getCircumference() {
|
|
174
|
+
return MathUtils.TWO_PI * radius.x;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
*
|
|
179
|
+
* @return
|
|
180
|
+
*/
|
|
181
|
+
public float getRadius() {
|
|
182
|
+
return radius.x;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
*
|
|
187
|
+
* @param p
|
|
188
|
+
* @return
|
|
189
|
+
*/
|
|
190
|
+
public Vec2D[] getTangentPoints(ReadonlyVec2D p) {
|
|
191
|
+
Vec2D m = interpolateTo(p, 0.5f);
|
|
192
|
+
return intersectsCircle(new Circle(m, m.distanceTo(p)));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
*
|
|
197
|
+
* @param c
|
|
198
|
+
* @return
|
|
199
|
+
*/
|
|
200
|
+
public Vec2D[] intersectsCircle(Circle c) {
|
|
201
|
+
Vec2D[] res = null;
|
|
202
|
+
Vec2D delta = c.sub(this);
|
|
203
|
+
float d = delta.magnitude();
|
|
204
|
+
float r1 = radius.x;
|
|
205
|
+
float r2 = c.radius.x;
|
|
206
|
+
if (d <= r1 + r2 && d >= Math.abs(r1 - r2)) {
|
|
207
|
+
float a = (r1 * r1 - r2 * r2 + d * d) / (2.0f * d);
|
|
208
|
+
d = 1 / d;
|
|
209
|
+
Vec2D p = add(delta.scale(a * d));
|
|
210
|
+
float h = (float) Math.sqrt(r1 * r1 - a * a);
|
|
211
|
+
delta.perpendicular().scaleSelf(h * d);
|
|
212
|
+
Vec2D i1 = p.add(delta);
|
|
213
|
+
Vec2D i2 = p.sub(delta);
|
|
214
|
+
res = new Vec2D[] {
|
|
215
|
+
i1, i2
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return res;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
*
|
|
223
|
+
* @param r
|
|
224
|
+
* @return
|
|
225
|
+
*/
|
|
226
|
+
public Circle setRadius(float r) {
|
|
227
|
+
super.setRadii(r, r);
|
|
228
|
+
return this;
|
|
229
|
+
}
|
|
230
|
+
}
|