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
|
+
/*
|
|
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.ReadonlyVec3D;
|
|
23
|
+
import toxi.geom.Vec3D;
|
|
24
|
+
import toxi.geom.Vec4D;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A ControlNet for a NurbsSurface
|
|
28
|
+
*
|
|
29
|
+
* @author sg
|
|
30
|
+
* @version 1.0
|
|
31
|
+
*/
|
|
32
|
+
public class ControlNet {
|
|
33
|
+
|
|
34
|
+
private int nU, nV;
|
|
35
|
+
private Vec4D[][] cps;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Create a ControlNet from the given points the two dimensional array must
|
|
39
|
+
* be a Matrix else an IllegalArgumentException is thrown.
|
|
40
|
+
*
|
|
41
|
+
* @param cpnet
|
|
42
|
+
* "Matrix" of ControlPoints
|
|
43
|
+
*/
|
|
44
|
+
public ControlNet(Vec4D[][] cpnet) throws IllegalArgumentException {
|
|
45
|
+
if (cpnet.length < 1) {
|
|
46
|
+
throw new IllegalArgumentException(
|
|
47
|
+
"Nurbs is not a Surface, to few ControlPoints in u Direction");
|
|
48
|
+
}
|
|
49
|
+
if (cpnet[0].length < 1) {
|
|
50
|
+
throw new IllegalArgumentException(
|
|
51
|
+
"Nurbs is not a Surface, to few ControlPoints in v Direction");
|
|
52
|
+
}
|
|
53
|
+
for (int i = 1; i < cpnet.length; i++) {
|
|
54
|
+
if (cpnet[i].length != cpnet[i - 1].length) {
|
|
55
|
+
throw new IllegalArgumentException(
|
|
56
|
+
"ControlPoint net is not a Matrix");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
nU = cpnet.length;
|
|
61
|
+
nV = cpnet[0].length;
|
|
62
|
+
cps = cpnet;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
* @param origin
|
|
68
|
+
*/
|
|
69
|
+
public void center(ReadonlyVec3D origin) {
|
|
70
|
+
Vec3D centroid = computeCentroid();
|
|
71
|
+
Vec3D delta = origin != null ? origin.sub(centroid) : centroid
|
|
72
|
+
.getInverted();
|
|
73
|
+
for (int i = 0; i < nU; i++) {
|
|
74
|
+
for (int j = 0; j < nV; j++) {
|
|
75
|
+
cps[i][j].addXYZSelf(delta);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
*
|
|
82
|
+
* @return
|
|
83
|
+
*/
|
|
84
|
+
public Vec3D computeCentroid() {
|
|
85
|
+
Vec4D centroid = new Vec4D();
|
|
86
|
+
for (int i = 0; i < nU; i++) {
|
|
87
|
+
for (int j = 0; j < nV; j++) {
|
|
88
|
+
centroid.addSelf(cps[i][j]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return centroid.scaleSelf(1f / (nU * nV)).to3D();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Get the ControlPoint at the position u,v
|
|
96
|
+
*
|
|
97
|
+
* @param u
|
|
98
|
+
* index in u direction
|
|
99
|
+
* @param v
|
|
100
|
+
* index in v direction
|
|
101
|
+
* @return The by u and v indexed ControlPoint
|
|
102
|
+
*/
|
|
103
|
+
public Vec4D get(int u, int v) {
|
|
104
|
+
return cps[u][v];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Get all the control points
|
|
109
|
+
*
|
|
110
|
+
* @return 2D array
|
|
111
|
+
*/
|
|
112
|
+
public Vec4D[][] getControlPoints() {
|
|
113
|
+
return cps;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Set the ControlPoint at the position u,v
|
|
118
|
+
*
|
|
119
|
+
* @param u
|
|
120
|
+
* index in u direction
|
|
121
|
+
* @param v
|
|
122
|
+
* index in v direction
|
|
123
|
+
* @param cp
|
|
124
|
+
* ControlPoint to set at the indexed position
|
|
125
|
+
*/
|
|
126
|
+
public void set(int u, int v, Vec4D cp) {
|
|
127
|
+
cps[u][v].set(cp);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Get number of ControlPoints in u direction
|
|
132
|
+
*
|
|
133
|
+
* @return number of ControlPoints in u direction
|
|
134
|
+
*/
|
|
135
|
+
public int uLength() {
|
|
136
|
+
return nU;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Get number of ControlPoints in v direction
|
|
141
|
+
*
|
|
142
|
+
* @return number of ControlPoints in v direction
|
|
143
|
+
*/
|
|
144
|
+
public int vLength() {
|
|
145
|
+
return nV;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
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 java.util.LinkedList;
|
|
23
|
+
import java.util.List;
|
|
24
|
+
|
|
25
|
+
import toxi.geom.Vec3D;
|
|
26
|
+
import toxi.geom.Vec4D;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Convenience class to create dynamically NurbsCurves.
|
|
30
|
+
*
|
|
31
|
+
* @author sg
|
|
32
|
+
* @version 1.0
|
|
33
|
+
*/
|
|
34
|
+
public class CurveCreator {
|
|
35
|
+
|
|
36
|
+
private final List<Vec4D> cps = new LinkedList<>();
|
|
37
|
+
private NurbsCurve curve = null;
|
|
38
|
+
|
|
39
|
+
private final int degree;
|
|
40
|
+
private int incp = 0;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Create a new CurveCretor object which can create Curves from the given
|
|
44
|
+
* degree
|
|
45
|
+
*
|
|
46
|
+
* @param degree
|
|
47
|
+
* Degree the created NurbsCurve will have.
|
|
48
|
+
*/
|
|
49
|
+
public CurveCreator(int degree) {
|
|
50
|
+
this.degree = degree;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Add a normal Point as ControlPoint to the CurveCreator. The newly added
|
|
55
|
+
* Point has automatically the weight one.
|
|
56
|
+
*
|
|
57
|
+
* @param cp
|
|
58
|
+
* Controlpoint to add with weight one.
|
|
59
|
+
* @return the actual NurbsCurve if any exists, or null otherwise (to less
|
|
60
|
+
* control for the given degree).
|
|
61
|
+
*/
|
|
62
|
+
public NurbsCurve addControlPoint(Vec3D cp) {
|
|
63
|
+
return addControlPoint(new Vec4D(cp, 1));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Add a new Controlpoint to the current CurveCreator.
|
|
68
|
+
*
|
|
69
|
+
* @param cp
|
|
70
|
+
* ControlPoint to add.
|
|
71
|
+
* @return the actual NurbsCurve if any exists, or null otherwise (to less
|
|
72
|
+
* control for the given degree).
|
|
73
|
+
*/
|
|
74
|
+
public NurbsCurve addControlPoint(Vec4D cp) {
|
|
75
|
+
cps.add(cp);
|
|
76
|
+
int np = cps.size();
|
|
77
|
+
int tmp = degree;
|
|
78
|
+
if (np <= degree) {
|
|
79
|
+
if (incp == 0) {
|
|
80
|
+
incp++;
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
tmp = incp++;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
float[] u = new float[np + tmp + 1];
|
|
87
|
+
for (int i = 0; i <= tmp; i++) {
|
|
88
|
+
u[u.length - 1 - i] = 1;
|
|
89
|
+
}
|
|
90
|
+
if (np > degree + 1) {
|
|
91
|
+
float val = 1.0f / (np - degree);
|
|
92
|
+
float step = val;
|
|
93
|
+
for (int i = degree + 1; i < u.length - 1 - degree; i++) {
|
|
94
|
+
u[i] = val;
|
|
95
|
+
val += step;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
curve = new BasicNurbsCurve(cps.toArray(new Vec4D[cps.size()]), u, tmp);
|
|
99
|
+
return curve;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Get the curve NurbsCurve of the CurveCreator
|
|
104
|
+
*
|
|
105
|
+
* @return the actual NurbsCurve if any exists, or null otherwise (to less
|
|
106
|
+
* control for the given degree).
|
|
107
|
+
*/
|
|
108
|
+
public NurbsCurve getCurve() {
|
|
109
|
+
return curve;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
package toxi.geom.nurbs;
|
|
2
|
+
|
|
3
|
+
import java.util.LinkedList;
|
|
4
|
+
|
|
5
|
+
import toxi.geom.Vec4D;
|
|
6
|
+
import toxi.math.MathUtils;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @author sg
|
|
10
|
+
*/
|
|
11
|
+
public final class CurveUtils {
|
|
12
|
+
|
|
13
|
+
private static int[] binomials(int x, int y) {
|
|
14
|
+
int[] bin = new int[y + 1];
|
|
15
|
+
bin[0] = 1;
|
|
16
|
+
for (int i = 1; i <= y; i++) {
|
|
17
|
+
bin[i] = (bin[i - 1] * x) / i;
|
|
18
|
+
x--;
|
|
19
|
+
}
|
|
20
|
+
return bin;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
* @param curve1
|
|
26
|
+
* @param curve2
|
|
27
|
+
* @return
|
|
28
|
+
*/
|
|
29
|
+
public static NurbsCurve connectCurves(NurbsCurve curve1, NurbsCurve curve2) {
|
|
30
|
+
return connectCurves(new NurbsCurve[] {
|
|
31
|
+
curve1, curve2
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
*
|
|
37
|
+
* @param curves
|
|
38
|
+
* @return
|
|
39
|
+
*/
|
|
40
|
+
public static NurbsCurve connectCurves(NurbsCurve[] curves) {
|
|
41
|
+
if (curves.length < 2) {
|
|
42
|
+
throw new IllegalArgumentException("Must be at least 2 curves");
|
|
43
|
+
}
|
|
44
|
+
int degree = curves[0].getDegree();
|
|
45
|
+
LinkedList<Float> knots = new LinkedList<>();
|
|
46
|
+
for (int i = 0; i <= degree; i++) {
|
|
47
|
+
knots.add(0f);
|
|
48
|
+
}
|
|
49
|
+
LinkedList<Vec4D> cps = new LinkedList<>();
|
|
50
|
+
cps.add(curves[0].getControlPoints()[0]);
|
|
51
|
+
for (NurbsCurve curve : curves) {
|
|
52
|
+
float[] u = curve.getKnots();
|
|
53
|
+
if (degree != curve.getDegree()) {
|
|
54
|
+
throw new IllegalArgumentException(
|
|
55
|
+
"Curves must have equal degrees");
|
|
56
|
+
}
|
|
57
|
+
float start = knots.getLast() - u[0];
|
|
58
|
+
for (int j = degree + 1; j < u.length - degree - 1; j++) {
|
|
59
|
+
knots.addLast(start + u[j]);
|
|
60
|
+
}
|
|
61
|
+
final float lastU = start + u[u.length - 1];
|
|
62
|
+
for (int j = 0; j < degree; j++) {
|
|
63
|
+
knots.addLast(lastU);
|
|
64
|
+
}
|
|
65
|
+
Vec4D[] pts = curve.getControlPoints();
|
|
66
|
+
for (int j = 1; j < pts.length; j++) {
|
|
67
|
+
cps.addLast(pts[j]);
|
|
68
|
+
}
|
|
69
|
+
// TODO check start and end point equality
|
|
70
|
+
}
|
|
71
|
+
knots.addLast(knots.getLast());
|
|
72
|
+
|
|
73
|
+
float[] u = new float[knots.size()];
|
|
74
|
+
for (int i = 0; i < u.length; i++) {
|
|
75
|
+
u[i] = knots.get(i);
|
|
76
|
+
}
|
|
77
|
+
return new BasicNurbsCurve(cps.toArray(new Vec4D[cps.size()]), u,
|
|
78
|
+
degree);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
* @param curve
|
|
84
|
+
* @param t
|
|
85
|
+
* @return
|
|
86
|
+
*/
|
|
87
|
+
public static NurbsCurve increaseDegree(NurbsCurve curve, int t) {
|
|
88
|
+
if (t <= 0) {
|
|
89
|
+
throw new IllegalArgumentException(
|
|
90
|
+
"New degree smaller or equal degree of curve");
|
|
91
|
+
}
|
|
92
|
+
Vec4D[] cp = curve.getControlPoints();
|
|
93
|
+
float[] u = curve.getKnots();
|
|
94
|
+
int p = curve.getDegree();
|
|
95
|
+
int seg = curve.getKnotVector().getNumberOfSegments() + 1;
|
|
96
|
+
Vec4D[] cph = new Vec4D[cp.length + t * seg];
|
|
97
|
+
float[] uh = new float[u.length + t * seg];
|
|
98
|
+
|
|
99
|
+
float[][] bezalfs = new float[p + t + 1][p + 1];
|
|
100
|
+
Vec4D[] bpts = new Vec4D[p + 1];
|
|
101
|
+
Vec4D[] ebpts = new Vec4D[p + t + 1];
|
|
102
|
+
Vec4D[] nextbpts = new Vec4D[p - 1];
|
|
103
|
+
float[] alfs = new float[p - 1];
|
|
104
|
+
|
|
105
|
+
double m = u.length - 1;
|
|
106
|
+
int ph = p + t;
|
|
107
|
+
int ph2 = ph / 2;
|
|
108
|
+
bezalfs[0][0] = bezalfs[p + t][p] = 1;
|
|
109
|
+
int[] binph = binomials(ph, ph2);
|
|
110
|
+
int[] binp = binomials(p, p);
|
|
111
|
+
int[] bint = binomials(t, t);
|
|
112
|
+
for (int i = 1; i <= ph2; i++) {
|
|
113
|
+
float inv = 1f / binph[i];
|
|
114
|
+
int mpi = MathUtils.min(p, i);
|
|
115
|
+
for (int j = MathUtils.max(0, i - t); j <= mpi; j++) {
|
|
116
|
+
bezalfs[i][j] = inv * binp[j] * bint[i - j];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
for (int i = ph2 + 1; i < ph; i++) {
|
|
120
|
+
double mpi = MathUtils.min(p, i);
|
|
121
|
+
for (int j = MathUtils.max(0, i - t); j <= mpi; j++) {
|
|
122
|
+
bezalfs[i][j] = bezalfs[ph - i][p - j];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
int mh = ph;
|
|
126
|
+
int kind = ph + 1;
|
|
127
|
+
int r = -1;
|
|
128
|
+
int a = p;
|
|
129
|
+
int b = p + 1;
|
|
130
|
+
int cind = 1;
|
|
131
|
+
float ua = u[0];
|
|
132
|
+
cph[0] = new Vec4D(cp[0]);
|
|
133
|
+
for (int i = 0; i <= ph; i++) {
|
|
134
|
+
uh[i] = ua;
|
|
135
|
+
}
|
|
136
|
+
for (int i = 0; i <= p; i++) {
|
|
137
|
+
bpts[i] = new Vec4D(cp[i]);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
while (b < m) {
|
|
141
|
+
int i = b;
|
|
142
|
+
while (b < m && u[b] == u[b + 1]) {
|
|
143
|
+
b++;
|
|
144
|
+
}
|
|
145
|
+
int mul = b - i + 1;
|
|
146
|
+
mh += mul + t;
|
|
147
|
+
float ub = u[b];
|
|
148
|
+
int oldr = r;
|
|
149
|
+
r = p - mul;
|
|
150
|
+
int lbz = 1;
|
|
151
|
+
if (oldr > 0) {
|
|
152
|
+
lbz = (oldr + 2) / 2;
|
|
153
|
+
}
|
|
154
|
+
int rbz = ph;
|
|
155
|
+
if (r > 0) {
|
|
156
|
+
rbz = ph - (r + 1) / 2;
|
|
157
|
+
float numer = ub - ua;
|
|
158
|
+
for (int k = p; k > mul; k--) {
|
|
159
|
+
alfs[k - mul - 1] = numer / (u[a + k] - ua);
|
|
160
|
+
}
|
|
161
|
+
for (int j = 1; j <= r; j++) {
|
|
162
|
+
int save = r - j;
|
|
163
|
+
int s = mul + j;
|
|
164
|
+
for (int k = p; k >= s; k--) {
|
|
165
|
+
bpts[k].interpolateToSelf(bpts[k - 1], 1 - alfs[k - s]);
|
|
166
|
+
}
|
|
167
|
+
nextbpts[save] = bpts[p];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
for (i = lbz; i <= ph; i++) {
|
|
171
|
+
ebpts[i] = new Vec4D();
|
|
172
|
+
int mpi = MathUtils.min(p, i);
|
|
173
|
+
for (int j = MathUtils.max(0, i - t); j <= mpi; j++) {
|
|
174
|
+
ebpts[i].addScaledSelf(bpts[j], bezalfs[i][j]);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (oldr > 1) {
|
|
178
|
+
int first = kind - 2;
|
|
179
|
+
int last = kind;
|
|
180
|
+
float den = ua - ub;
|
|
181
|
+
for (int tr = 1; tr < oldr; tr++) {
|
|
182
|
+
i = first;
|
|
183
|
+
int j = last;
|
|
184
|
+
int kj = j - kind + 1;
|
|
185
|
+
while (j - i > tr) {
|
|
186
|
+
if (i < cind) {
|
|
187
|
+
float alf = (ub - uh[i]) / (ua - uh[i]);
|
|
188
|
+
cph[i].interpolateToSelf(cph[i - 1], 1 - alf);
|
|
189
|
+
}
|
|
190
|
+
if (j >= lbz) {
|
|
191
|
+
if (j - tr <= kind - ph + oldr) {
|
|
192
|
+
float gam = (ub - uh[j - tr]) / den;
|
|
193
|
+
ebpts[kj].interpolateToSelf(ebpts[kj + 1],
|
|
194
|
+
1 - gam);
|
|
195
|
+
} else {
|
|
196
|
+
float bet = (ub - uh[kind - 1]) / den;
|
|
197
|
+
ebpts[kj].interpolateToSelf(ebpts[kj + 1],
|
|
198
|
+
1 - bet);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
i++;
|
|
202
|
+
j--;
|
|
203
|
+
kj--;
|
|
204
|
+
}
|
|
205
|
+
first--;
|
|
206
|
+
last++;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (a != p) {
|
|
210
|
+
for (i = 0; i < ph - oldr; i++) {
|
|
211
|
+
uh[kind] = ua;
|
|
212
|
+
kind++;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
for (int j = lbz; j <= rbz; j++) {
|
|
216
|
+
cph[cind] = new Vec4D(ebpts[j]);
|
|
217
|
+
cind++;
|
|
218
|
+
}
|
|
219
|
+
if (b < m) {
|
|
220
|
+
for (int j = 0; j < r; j++) {
|
|
221
|
+
bpts[j].set(nextbpts[j]);
|
|
222
|
+
}
|
|
223
|
+
for (int j = r; j <= p; j++) {
|
|
224
|
+
bpts[j].set(cp[b - p + j]);
|
|
225
|
+
}
|
|
226
|
+
a = b;
|
|
227
|
+
b++;
|
|
228
|
+
ua = ub;
|
|
229
|
+
} else {
|
|
230
|
+
for (i = 0; i <= ph; i++) {
|
|
231
|
+
uh[kind + i] = ub;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
int nh = mh - ph - 1;
|
|
236
|
+
float[] uNew = new float[mh + 1];
|
|
237
|
+
System.arraycopy(uh, 0, uNew, 0, uNew.length);
|
|
238
|
+
Vec4D[] cpNew = new Vec4D[nh + 1];
|
|
239
|
+
for (int i = 0; i < cpNew.length; i++) {
|
|
240
|
+
cpNew[i] = new Vec4D(cph[i]);
|
|
241
|
+
}
|
|
242
|
+
return new BasicNurbsCurve(cpNew, uNew, p + t);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
private CurveUtils() {
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
*
|
|
250
|
+
* @param curves
|
|
251
|
+
* @return
|
|
252
|
+
*/
|
|
253
|
+
public NurbsCurve equalizeConnectCurves(NurbsCurve[] curves) {
|
|
254
|
+
// TODO equalize degrees and movw curves so that end of curves[i-1] is
|
|
255
|
+
// the same as start of curves[i];
|
|
256
|
+
return connectCurves(curves);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
}
|