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,149 @@
|
|
|
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.mesh2d;
|
|
29
|
+
|
|
30
|
+
import java.util.ArrayList;
|
|
31
|
+
import java.util.Collection;
|
|
32
|
+
import java.util.HashSet;
|
|
33
|
+
import java.util.LinkedList;
|
|
34
|
+
import java.util.List;
|
|
35
|
+
import toxi.geom.Polygon2D;
|
|
36
|
+
import toxi.geom.Triangle2D;
|
|
37
|
+
import toxi.geom.Vec2D;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
*
|
|
41
|
+
* @author tux
|
|
42
|
+
*/
|
|
43
|
+
public class Voronoi {
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
*
|
|
47
|
+
*/
|
|
48
|
+
public static float DEFAULT_SIZE = 10000;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
*/
|
|
53
|
+
protected DelaunayTriangulation delaunay;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
*/
|
|
58
|
+
protected DelaunayTriangle initialTriangle;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
*/
|
|
63
|
+
protected List<Vec2D> sites = new ArrayList<>();
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
*/
|
|
68
|
+
public Voronoi() {
|
|
69
|
+
this(DEFAULT_SIZE);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
*
|
|
74
|
+
* @param size
|
|
75
|
+
*/
|
|
76
|
+
public Voronoi(float size) {
|
|
77
|
+
initialTriangle = new DelaunayTriangle(
|
|
78
|
+
new DelaunayVertex(-size, -size), new DelaunayVertex(size,
|
|
79
|
+
-size), new DelaunayVertex(0, size));
|
|
80
|
+
this.delaunay = new DelaunayTriangulation(initialTriangle);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
*
|
|
85
|
+
* @param p
|
|
86
|
+
*/
|
|
87
|
+
public void addPoint(Vec2D p) {
|
|
88
|
+
sites.add(p.copy());
|
|
89
|
+
delaunay.delaunayPlace(new DelaunayVertex(p.x, p.y));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
*
|
|
94
|
+
* @param points
|
|
95
|
+
*/
|
|
96
|
+
public void addPoints(Collection<? extends Vec2D> points) {
|
|
97
|
+
points.stream().forEach((p) -> {
|
|
98
|
+
addPoint(p);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
*
|
|
104
|
+
* @return
|
|
105
|
+
*/
|
|
106
|
+
public List<Polygon2D> getRegions() {
|
|
107
|
+
List<Polygon2D> regions = new LinkedList<>();
|
|
108
|
+
HashSet<DelaunayVertex> done = new HashSet<>(
|
|
109
|
+
initialTriangle);
|
|
110
|
+
delaunay.stream().forEach((DelaunayTriangle triangle) -> {
|
|
111
|
+
triangle.stream().filter((site) -> !(done.contains(site))).map((site) -> {
|
|
112
|
+
done.add(site);
|
|
113
|
+
return site;
|
|
114
|
+
}).map((site) -> delaunay.surroundingTriangles(
|
|
115
|
+
site, triangle)).map((List<DelaunayTriangle> list) -> {
|
|
116
|
+
Polygon2D poly = new Polygon2D();
|
|
117
|
+
list.stream().map((tri) -> tri.getCircumcenter()).forEach((circumeter) -> {
|
|
118
|
+
poly.add(new Vec2D((float) circumeter.coord(0),
|
|
119
|
+
(float) circumeter.coord(1)));
|
|
120
|
+
});
|
|
121
|
+
return poly;
|
|
122
|
+
}).forEach((poly) -> {
|
|
123
|
+
regions.add(poly);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
return regions;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
*
|
|
131
|
+
* @return
|
|
132
|
+
*/
|
|
133
|
+
public List<Vec2D> getSites() {
|
|
134
|
+
return sites;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
*
|
|
139
|
+
* @return
|
|
140
|
+
*/
|
|
141
|
+
public List<Triangle2D> getTriangles() {
|
|
142
|
+
List<Triangle2D> tris = new ArrayList<>();
|
|
143
|
+
for (DelaunayTriangle t : delaunay) {
|
|
144
|
+
tris.add(new Triangle2D(t.get(0).toVec2D(), t.get(1).toVec2D(), t
|
|
145
|
+
.get(2).toVec2D()));
|
|
146
|
+
}
|
|
147
|
+
return tris;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* jgeom: Geometry Library fo Java
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2005 Samuel Gerber
|
|
5
|
+
*
|
|
6
|
+
* This program is free software; you can redistribute it and/or
|
|
7
|
+
* modify it under the terms of the GNU General Public License
|
|
8
|
+
* as published by the Free Software Foundation; either version 2
|
|
9
|
+
* of the License, or (at your option) any later version.
|
|
10
|
+
*
|
|
11
|
+
* This program is distributed in the hope that it will be useful,
|
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
* GNU General Public License for more details.
|
|
15
|
+
*
|
|
16
|
+
* You should have received a copy of the GNU General Public License
|
|
17
|
+
* along with this program; if not, write to the Free Software
|
|
18
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
19
|
+
*/
|
|
20
|
+
package toxi.geom.nurbs;
|
|
21
|
+
|
|
22
|
+
import toxi.geom.Polygon2D;
|
|
23
|
+
import toxi.geom.Vec3D;
|
|
24
|
+
import toxi.geom.Vec4D;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A Basic implementation of a NurbsCurve.
|
|
28
|
+
*
|
|
29
|
+
* @author sg
|
|
30
|
+
* @version 1.0
|
|
31
|
+
*/
|
|
32
|
+
public class BasicNurbsCurve implements NurbsCurve, Cloneable {
|
|
33
|
+
|
|
34
|
+
private Vec4D[] cpoly;
|
|
35
|
+
private KnotVector uKnots;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Create a Nurbs Curve from the given Controlpoints, Knots and degree.<br>
|
|
39
|
+
* [TODO Validate Input, part of it is done by creating the KnotVector]
|
|
40
|
+
*
|
|
41
|
+
* @param cps
|
|
42
|
+
* Array of Controlpoints
|
|
43
|
+
* @param uK
|
|
44
|
+
* Knot values
|
|
45
|
+
* @param degree
|
|
46
|
+
* Degree of the Nurbs Curve
|
|
47
|
+
*/
|
|
48
|
+
public BasicNurbsCurve(Vec4D[] cps, float[] uK, int degree) {
|
|
49
|
+
this(cps, new KnotVector(uK, degree));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Generate a Nurbs from the given Controlpoints and the given Knotvector.<br>
|
|
54
|
+
* [TODO validate input]
|
|
55
|
+
*
|
|
56
|
+
* @param cps
|
|
57
|
+
* Array of Controlpoints
|
|
58
|
+
* @param uKnots
|
|
59
|
+
* Knotvector of the Nurbs
|
|
60
|
+
*/
|
|
61
|
+
public BasicNurbsCurve(Vec4D[] cps, KnotVector uKnots) {
|
|
62
|
+
cpoly = cps;
|
|
63
|
+
this.uKnots = uKnots;
|
|
64
|
+
if (uKnots.length() != uKnots.getDegree() + cpoly.length + 1) {
|
|
65
|
+
throw new IllegalArgumentException(
|
|
66
|
+
"Nurbs Curve has wrong knot number");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@Override
|
|
71
|
+
public Vec4D[][] curveDerivCpts(int d, int r1, int r2) {
|
|
72
|
+
|
|
73
|
+
Vec4D[][] result = new Vec4D[d + 1][r2 - r1 + 1];
|
|
74
|
+
|
|
75
|
+
int degree = uKnots.getDegree();
|
|
76
|
+
|
|
77
|
+
// k=0 => control points
|
|
78
|
+
int r = r2 - r1;
|
|
79
|
+
for (int i = 0; i <= r; i++) {
|
|
80
|
+
result[0][i] = cpoly[i];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// k=1 => 1st derivative, k=2 => 2nd derivative, etc...
|
|
84
|
+
for (int k = 1; k <= d; k++) {
|
|
85
|
+
int tmp = degree - k + 1;
|
|
86
|
+
for (int i = 0; i <= (r - k); i++) {
|
|
87
|
+
Vec4D cw = new Vec4D(result[k - 1][i + 1]);
|
|
88
|
+
cw.subSelf(result[k - 1][i]);
|
|
89
|
+
cw.scaleSelf(tmp);
|
|
90
|
+
cw.scaleSelf(1 / (uKnots.get(r1 + i + degree + 1) - uKnots
|
|
91
|
+
.get(r1 + i + k)));
|
|
92
|
+
result[k][i] = cw;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
*
|
|
100
|
+
* @param u
|
|
101
|
+
* @param grade
|
|
102
|
+
* @return
|
|
103
|
+
*/
|
|
104
|
+
@Override
|
|
105
|
+
public Vec3D[] derivativesOnCurve(float u, int grade) {
|
|
106
|
+
return derivativesOnCurve(u, grade, new Vec3D[grade + 1]);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
*
|
|
111
|
+
* @param u
|
|
112
|
+
* @param grade
|
|
113
|
+
* @param derivs
|
|
114
|
+
* @return
|
|
115
|
+
*/
|
|
116
|
+
@Override
|
|
117
|
+
public Vec3D[] derivativesOnCurve(float u, int grade, Vec3D[] derivs) {
|
|
118
|
+
|
|
119
|
+
int span = uKnots.findSpan(u);
|
|
120
|
+
int degree = uKnots.getDegree();
|
|
121
|
+
|
|
122
|
+
// TODO: compute derivatives also for NURBS
|
|
123
|
+
// currently supports only non-rational B-Splines
|
|
124
|
+
float derivVals[][] = uKnots.derivBasisFunctions(span, u, grade);
|
|
125
|
+
|
|
126
|
+
// Zero values
|
|
127
|
+
for (int k = (degree + 1); k <= grade; k++) {
|
|
128
|
+
derivs[k] = new Vec3D();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
for (int k = 0; k <= grade; k++) {
|
|
132
|
+
Vec3D d = new Vec3D();
|
|
133
|
+
for (int j = 0; j <= degree; j++) {
|
|
134
|
+
Vec4D v = cpoly[(span - degree) + j];
|
|
135
|
+
float s = derivVals[k][j];
|
|
136
|
+
d.addSelf(v.x * s, v.y * s, v.z * s);
|
|
137
|
+
}
|
|
138
|
+
derivs[k] = d;
|
|
139
|
+
}
|
|
140
|
+
return derivs;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
@Override
|
|
144
|
+
public Vec4D[] getControlPoints() {
|
|
145
|
+
return cpoly;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@Override
|
|
149
|
+
public int getDegree() {
|
|
150
|
+
return uKnots.getDegree();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@Override
|
|
154
|
+
public float[] getKnots() {
|
|
155
|
+
return uKnots.getArray();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
*
|
|
160
|
+
* @return
|
|
161
|
+
*/
|
|
162
|
+
@Override
|
|
163
|
+
public KnotVector getKnotVector() {
|
|
164
|
+
return uKnots;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
@Override
|
|
168
|
+
public Vec3D pointOnCurve(float u) {
|
|
169
|
+
return pointOnCurve(u, new Vec3D());
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
@Override
|
|
173
|
+
public Vec3D pointOnCurve(float u, Vec3D out) {
|
|
174
|
+
int span = uKnots.findSpan(u);
|
|
175
|
+
int degree = uKnots.getDegree();
|
|
176
|
+
|
|
177
|
+
// for periodic knot vectors the usable parameter range is
|
|
178
|
+
// span >= degree and span <= no control points (n+1)
|
|
179
|
+
if (span < degree) {
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (span > uKnots.getN()) {
|
|
184
|
+
return out;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
double[] bf = uKnots.basisFunctions(span, u);
|
|
188
|
+
Vec4D cw = new Vec4D();
|
|
189
|
+
for (int i = 0; i <= degree; i++) {
|
|
190
|
+
cw.addSelf(cpoly[(span - degree) + i].getWeighted().scaleSelf(
|
|
191
|
+
(float) bf[i]));
|
|
192
|
+
}
|
|
193
|
+
return cw.unweightInto(out);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
*
|
|
198
|
+
* @param res
|
|
199
|
+
* @return
|
|
200
|
+
*/
|
|
201
|
+
@Override
|
|
202
|
+
public Polygon2D toPolygon2D(int res) {
|
|
203
|
+
float delta = 1f / (res - 1);
|
|
204
|
+
Polygon2D poly = new Polygon2D();
|
|
205
|
+
for (int i = 0; i < res; i++) {
|
|
206
|
+
poly.add(pointOnCurve(i * delta).to2DXY());
|
|
207
|
+
}
|
|
208
|
+
return poly;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* jgeom: Geometry Library fo Java
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2005 Samuel Gerber
|
|
5
|
+
*
|
|
6
|
+
* This program is free software; you can redistribute it and/or
|
|
7
|
+
* modify it under the terms of the GNU General Public License
|
|
8
|
+
* as published by the Free Software Foundation; either version 2
|
|
9
|
+
* of the License, or (at your option) any later version.
|
|
10
|
+
*
|
|
11
|
+
* This program is distributed in the hope that it will be useful,
|
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
* GNU General Public License for more details.
|
|
15
|
+
*
|
|
16
|
+
* You should have received a copy of the GNU General Public License
|
|
17
|
+
* along with this program; if not, write to the Free Software
|
|
18
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
19
|
+
*/
|
|
20
|
+
package toxi.geom.nurbs;
|
|
21
|
+
|
|
22
|
+
import toxi.geom.Vec3D;
|
|
23
|
+
import toxi.geom.Vec4D;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A Basic NurbsSurface implementation.
|
|
27
|
+
*
|
|
28
|
+
* @author sg
|
|
29
|
+
* @version 1.2
|
|
30
|
+
*/
|
|
31
|
+
public class BasicNurbsSurface implements NurbsSurface {
|
|
32
|
+
|
|
33
|
+
private KnotVector uKnots;
|
|
34
|
+
private KnotVector vKnots;
|
|
35
|
+
private ControlNet cpnet;
|
|
36
|
+
|
|
37
|
+
// private List<TrimCurve> trimms = new LinkedList<TrimCurve>();
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Create a Nurbs Surface from the given {@link ControlNet} and the knot
|
|
41
|
+
* values of degree p in u direction and of degree q in v direction.
|
|
42
|
+
*
|
|
43
|
+
* @param cps
|
|
44
|
+
* ControlNet of the Nurbs
|
|
45
|
+
* @param uK
|
|
46
|
+
* Knot values in u direction
|
|
47
|
+
* @param vK
|
|
48
|
+
* Knot values in v direction
|
|
49
|
+
* @param p
|
|
50
|
+
* degree in u direction
|
|
51
|
+
* @param q
|
|
52
|
+
* degree in v direction
|
|
53
|
+
*/
|
|
54
|
+
public BasicNurbsSurface(ControlNet cps, float[] uK, float[] vK, int p,
|
|
55
|
+
int q) throws IllegalArgumentException {
|
|
56
|
+
this(cps, new KnotVector(uK, p), new KnotVector(vK, q));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Create a Nurbs form the Controlnet and the two Knot vectors.
|
|
61
|
+
*
|
|
62
|
+
* @param net
|
|
63
|
+
* Contorl net of Nurbs
|
|
64
|
+
* @param u
|
|
65
|
+
* KnotVector in u direction
|
|
66
|
+
* @param v
|
|
67
|
+
* KnotVector in v direction
|
|
68
|
+
*/
|
|
69
|
+
public BasicNurbsSurface(ControlNet net, KnotVector u, KnotVector v)
|
|
70
|
+
throws IllegalArgumentException {
|
|
71
|
+
cpnet = net;
|
|
72
|
+
uKnots = u;
|
|
73
|
+
vKnots = v;
|
|
74
|
+
validate();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// public void addTrimCurve(TrimCurve tc) {
|
|
78
|
+
// trimms.add(tc);
|
|
79
|
+
// }
|
|
80
|
+
|
|
81
|
+
@Override
|
|
82
|
+
public ControlNet getControlNet() {
|
|
83
|
+
return cpnet;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// public List<TrimCurve> getTrimCurves() {
|
|
87
|
+
// return trimms;
|
|
88
|
+
// }
|
|
89
|
+
|
|
90
|
+
@Override
|
|
91
|
+
public int getUDegree() {
|
|
92
|
+
return uKnots.getDegree();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@Override
|
|
96
|
+
public float[] getUKnots() {
|
|
97
|
+
return uKnots.getArray();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
*
|
|
102
|
+
* @return
|
|
103
|
+
*/
|
|
104
|
+
@Override
|
|
105
|
+
public KnotVector getUKnotVector() {
|
|
106
|
+
return uKnots;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@Override
|
|
110
|
+
public int getVDegree() {
|
|
111
|
+
return vKnots.getDegree();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@Override
|
|
115
|
+
public float[] getVKnots() {
|
|
116
|
+
return vKnots.getArray();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
*
|
|
121
|
+
* @return
|
|
122
|
+
*/
|
|
123
|
+
@Override
|
|
124
|
+
public KnotVector getVKnotVector() {
|
|
125
|
+
return vKnots;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
*
|
|
130
|
+
* @param u
|
|
131
|
+
* @param v
|
|
132
|
+
* @return
|
|
133
|
+
*/
|
|
134
|
+
@Override
|
|
135
|
+
public Vec3D pointOnSurface(double u, double v) {
|
|
136
|
+
return pointOnSurface((float) u, (float) v, new Vec3D());
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@Override
|
|
140
|
+
public Vec3D pointOnSurface(float u, float v) {
|
|
141
|
+
return pointOnSurface(u, v, new Vec3D());
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@Override
|
|
145
|
+
public Vec3D pointOnSurface(float u, float v, Vec3D out) {
|
|
146
|
+
|
|
147
|
+
// Piegl -> Algorithm A4.3 -> page 134
|
|
148
|
+
|
|
149
|
+
int uspan = uKnots.findSpan(u);
|
|
150
|
+
double[] bfu = uKnots.basisFunctions(uspan, u);
|
|
151
|
+
|
|
152
|
+
int vspan = vKnots.findSpan(v);
|
|
153
|
+
double[] bfv = vKnots.basisFunctions(vspan, v);
|
|
154
|
+
|
|
155
|
+
int p = uKnots.getDegree();
|
|
156
|
+
int q = vKnots.getDegree();
|
|
157
|
+
Vec4D[] tmp = new Vec4D[q + 1];
|
|
158
|
+
for (int l = 0; l <= q; l++) {
|
|
159
|
+
Vec4D pw = new Vec4D();
|
|
160
|
+
for (int k = 0; k <= p; k++) {
|
|
161
|
+
pw.addSelf(cpnet.get(uspan - p + k, vspan - q + l)
|
|
162
|
+
.getWeighted().scaleSelf((float) bfu[k]));
|
|
163
|
+
}
|
|
164
|
+
tmp[l] = pw;
|
|
165
|
+
}
|
|
166
|
+
Vec4D sw = new Vec4D();
|
|
167
|
+
for (int l = 0; l <= q; l++) {
|
|
168
|
+
sw.addSelf(tmp[l].scaleSelf((float) bfv[l]));
|
|
169
|
+
}
|
|
170
|
+
return sw.unweightInto(out);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
@Override
|
|
174
|
+
public Vec4D[][][][] surfaceDerivCpts(int d, int r1, int r2, int s1, int s2) {
|
|
175
|
+
|
|
176
|
+
Vec4D[][][][] result = new Vec4D[d + 1][d + 1][r2 - r1 + 1][s2 - s1 + 1];
|
|
177
|
+
int degreeU = uKnots.getDegree();
|
|
178
|
+
int degreeV = vKnots.getDegree();
|
|
179
|
+
|
|
180
|
+
int du = d < degreeU ? d : degreeU;
|
|
181
|
+
int dv = d < degreeV ? d : degreeV;
|
|
182
|
+
int r = r2 - r1;
|
|
183
|
+
int s = s2 - s1;
|
|
184
|
+
Vec4D[][] cps = cpnet.getControlPoints();
|
|
185
|
+
Vec4D[] ucps = new Vec4D[cpnet.uLength()];
|
|
186
|
+
for (int j = s1; j <= s2; j++) {
|
|
187
|
+
for (int idxu = 0; idxu < cpnet.uLength(); idxu++) {
|
|
188
|
+
ucps[idxu] = cps[idxu][j];
|
|
189
|
+
}
|
|
190
|
+
Vec4D[][] tmp = new BasicNurbsCurve(ucps, uKnots).curveDerivCpts(
|
|
191
|
+
du, r1, r2);
|
|
192
|
+
for (int k = 0; k <= du; k++) {
|
|
193
|
+
final Vec4D[][] resk0 = result[k][0];
|
|
194
|
+
for (int i = 0; i <= (r - k); i++) {
|
|
195
|
+
resk0[i][j - s1] = tmp[k][i];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
for (int k = 0; k <= du; k++) {
|
|
201
|
+
final Vec4D[][] resk0 = result[k][0];
|
|
202
|
+
for (int i = 0; i <= (r - k); i++) {
|
|
203
|
+
final int length = resk0[i].length;
|
|
204
|
+
final Vec4D[] resk0i = resk0[i];
|
|
205
|
+
Vec4D[] vcps = new Vec4D[length];
|
|
206
|
+
System.arraycopy(resk0i, 0, vcps, 0, length);
|
|
207
|
+
final int dd = (d - k) < dv ? (d - k) : dv;
|
|
208
|
+
Vec4D[][] tmp = new BasicNurbsCurve(vcps, vKnots)
|
|
209
|
+
.curveDerivCpts(dd, 0, s);
|
|
210
|
+
for (int l = 1; l <= dd; l++) {
|
|
211
|
+
final Vec4D[] reskli = result[k][l][i];
|
|
212
|
+
final Vec4D[] tmpL = tmp[l];
|
|
213
|
+
for (int j = 0; j <= (s - 1); j++) {
|
|
214
|
+
reskli[j] = tmpL[j];
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private void validate() {
|
|
223
|
+
if (uKnots.length() != uKnots.getDegree() + cpnet.uLength() + 1) {
|
|
224
|
+
throw new IllegalArgumentException(
|
|
225
|
+
"Nurbs Surface has wrong Knot number in u Direction");
|
|
226
|
+
}
|
|
227
|
+
if (vKnots.length() != vKnots.getDegree() + cpnet.vLength() + 1) {
|
|
228
|
+
throw new IllegalArgumentException(
|
|
229
|
+
"Nurbs Surface has wrong Knot number in v Direction");
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
}
|
|
233
|
+
}
|