toxiclibs 0.4.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +16 -0
- data/.mvn/extensions.xml +8 -0
- data/.mvn/wrapper/maven-wrapper.properties +1 -0
- data/.travis.yml +23 -0
- data/CHANGELOG.md +7 -0
- data/COPYING.md +14 -0
- data/Gemfile +10 -0
- data/LICENSE +675 -0
- data/README.md +9 -7
- data/Rakefile +25 -81
- data/examples/README.md +5 -0
- 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/ReplicaBold.ttf +0 -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 +74 -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 +43 -0
- data/examples/physics_type.rb +77 -0
- data/examples/povmesh/data/mask.jpg +0 -0
- data/examples/povmesh/ftest.rb +59 -0
- data/examples/povmesh/mesh_align.rb +47 -0
- data/examples/povmesh/tentacle.rb +71 -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/examples/spherical_harmonics_mesh.rb +50 -0
- data/examples/test_rect.rb +32 -0
- data/lib/toxiclibs.jar +0 -0
- data/lib/toxiclibs.rb +72 -22
- data/lib/toxiclibs/version.rb +1 -1
- data/pom.rb +63 -0
- data/pom.xml +124 -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/audio/AudioBuffer.java +229 -0
- data/src/toxi/audio/AudioSource.java +288 -0
- data/src/toxi/audio/DecompressInputStream.java +159 -0
- data/src/toxi/audio/IIRFilter.java +197 -0
- data/src/toxi/audio/JOALUtil.java +388 -0
- data/src/toxi/audio/MultiTimbralManager.java +162 -0
- data/src/toxi/audio/SoundListener.java +154 -0
- data/src/toxi/audio/SynthUtil.java +109 -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 +127 -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 +28 -0
- metadata +442 -31
data/README.md
CHANGED
@@ -1,13 +1,15 @@
|
|
1
|
-
##
|
2
|
-
|
1
|
+
## Toxiclibs for JRubyArt
|
2
|
+
|
3
|
+
![travis build](https://travis-ci.org/ruby-processing/toxicgem.svg)
|
4
|
+
|
3
5
|
### Installing
|
4
6
|
```bash
|
5
7
|
gem install toxiclibs
|
6
8
|
```
|
7
9
|
|
8
|
-
### NB:
|
10
|
+
### NB: Use version 0.4 for ruby-processing
|
9
11
|
|
10
|
-
Here I have created create a gem to use Karsten Schmidts (aka toxi, @postspectacular) toxiclibs jars in JRubyArt. To compile the gem follow the instructions for [JRubyArt][]. Most parts of toxiclibs API is exposed in the latest version, (but only a few examples are included) in principle it should be possible to make all available!!! For this demonstration I have used up to date source code for version 21, since [toxis final release][] may never materialise (he's probably got more interesting things to do). There are reported to be number of outstanding bugs with toxiclibs, if they affect you report it [here][] (or better fix them yourself and submit a pull request).
|
12
|
+
Here I have created create a gem to use Karsten Schmidts (aka toxi, @postspectacular) toxiclibs jars in JRubyArt. To compile the gem follow the instructions for [JRubyArt][]. Most parts of toxiclibs API is exposed in the latest version, (but only a few examples are included) in principle it should be possible to make all available!!! For this demonstration I have used up to date source code for version 21, since [toxis final release][] may never materialise (he's probably got more interesting things to do). There are reported to be number of outstanding bugs with toxiclibs, if they affect you report it [here][] (or better fix them yourself and submit a pull request). Version 0.5.0+ features java code updated to use java lambda (jdk8) and was compiled against processing-3.0.1 core.jar. Added features are export Mesh to PShape and export Mesh to [povray mesh2](http://www.povray.org/documentation/3.7.0/r3_4.html#r3_4_5_2_4).
|
11
13
|
|
12
14
|
![grayscott image](http://4.bp.blogspot.com/-d4MiL4_0Njk/VFJMv6VUicI/AAAAAAAAEgY/fFAfrXDxNXM/s400/grayscott.png)
|
13
15
|
|
@@ -23,9 +25,7 @@ Here I have created create a gem to use Karsten Schmidts (aka toxi, @postspectac
|
|
23
25
|
|
24
26
|
### Licensing
|
25
27
|
|
26
|
-
I should be clear that toxiclibs
|
27
|
-
|
28
|
-
Copyright (c) 2010 Karsten Schmidt
|
28
|
+
I should be clear that the original toxiclibs is the work of Karsten Schmidt see [Copyright[]
|
29
29
|
|
30
30
|
This demo & library is free software you can redistribute it and/or
|
31
31
|
modify it under the terms of the GNU Lesser General Public
|
@@ -39,3 +39,5 @@ version 2.1 of the License, or (at your option) any later version.
|
|
39
39
|
[Toxiclibs Documentation]:http://toxiclibs.org/
|
40
40
|
[Example Usage]:https://github.com/ruby-processing/toxicgem/tree/master/examples
|
41
41
|
[here]:https://github.com/ruby-processing/toxiclibs/issues
|
42
|
+
[Copyright]:https://github.com/ruby-processing/toxiclibs/COPYING.md
|
43
|
+
|
data/Rakefile
CHANGED
@@ -1,94 +1,38 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rake'
|
3
|
-
require 'rake/clean'
|
4
|
-
require 'rubygems/package_task'
|
5
|
-
require 'rdoc/task'
|
6
|
-
require 'rake/testtask'
|
7
|
-
require 'rspec/core/rake_task'
|
8
1
|
require_relative 'lib/toxiclibs/version'
|
9
2
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
s.description = 'A gem wrapper for some toxiclibs jars'
|
17
|
-
s.license = 'GPLv3'
|
18
|
-
s.authors = ['Karsten Schmidt', 'Martin Prout']
|
19
|
-
s.email = 'martin_p@lineone.net'
|
20
|
-
s.homepage = 'https://github.com/ruby-processing/toxiclibs'
|
21
|
-
s.files = %w(LICENSE.md README.md Rakefile) + FileList['lib/**/*.rb', 'example/**/*.rb']
|
22
|
-
s.files << 'lib/toxiclibs.jar'
|
23
|
-
s.require_path = 'lib'
|
24
|
-
s.add_development_dependency "rake", "~> 10.3"
|
25
|
-
s.add_development_dependency "rake-compiler", "~> 0.9"
|
26
|
-
s.requirements << 'A decent graphics card'
|
27
|
-
s.requirements << 'java runtime >= 1.7+'
|
28
|
-
s.requirements << 'jruby_art = 0.2+'
|
29
|
-
end
|
30
|
-
|
31
|
-
# -*- ruby -*-
|
32
|
-
|
33
|
-
require 'java'
|
34
|
-
require 'rake/javaextensiontask'
|
35
|
-
|
36
|
-
# -*- encoding: utf-8 -*-
|
37
|
-
require 'psych'
|
38
|
-
|
39
|
-
def copy_jars(name, dest)
|
40
|
-
conf = '~/.jruby_art/config.yml'
|
41
|
-
begin
|
42
|
-
path = File.expand_path(conf)
|
43
|
-
rp_config = (Psych.load_file(path))
|
44
|
-
source= "#{rp_config["PROCESSING_ROOT"]}/core/library/"
|
45
|
-
rescue
|
46
|
-
raise "WARNING: you must set PROCESSING_ROOT in #{conf} compile"
|
3
|
+
def create_manifest
|
4
|
+
title = 'Implementation-Title: toxiclibs (java extension for toxicgem) '
|
5
|
+
version = format('Implementation-Version: %s', Toxiclibs::VERSION)
|
6
|
+
file = File.open('MANIFEST.MF', 'w') do |f|
|
7
|
+
f.puts(title)
|
8
|
+
f.puts(version)
|
47
9
|
end
|
48
|
-
body = proc {
|
49
|
-
Dir["#{source}/core.jar"].each do |f|
|
50
|
-
puts "Copying #{f} To #{dest}"
|
51
|
-
FileUtils.cp f, dest
|
52
|
-
end
|
53
|
-
}
|
54
|
-
Rake::Task.define_task(name, &body)
|
55
10
|
end
|
56
11
|
|
57
|
-
|
12
|
+
task default: [:init, :compile, :gem]
|
58
13
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
ext.name = 'toxiclibs'
|
63
|
-
ext.debug = true
|
64
|
-
ext.lib_dir = 'lib'
|
65
|
-
ext.source_version='1.7'
|
66
|
-
ext.target_version='1.7'
|
14
|
+
desc 'Create Manifest'
|
15
|
+
task :init do
|
16
|
+
create_manifest
|
67
17
|
end
|
68
18
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
p.need_zip = true
|
19
|
+
desc 'Build gem'
|
20
|
+
task :gem do
|
21
|
+
sh "gem build toxiclibs.gemspec"
|
73
22
|
end
|
74
23
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
rdoc.title = "Toxiclibs Docs"
|
81
|
-
rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
|
82
|
-
rdoc.options << '--line-numbers'
|
24
|
+
desc 'Compile'
|
25
|
+
task :compile do
|
26
|
+
sh "mvn package"
|
27
|
+
sh "mvn dependency:copy"
|
28
|
+
sh "mv target/toxiclibs.jar lib"
|
83
29
|
end
|
84
30
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
31
|
+
desc 'clean'
|
32
|
+
task :clean do
|
33
|
+
Dir['./**/*.%w{jar gem}'].each do |path|
|
34
|
+
puts "Deleting #{path} ..."
|
35
|
+
File.delete(path)
|
36
|
+
end
|
37
|
+
FileUtils.rm_rf('./target')
|
92
38
|
end
|
93
|
-
|
94
|
-
|
data/examples/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'toxiclibs'
|
2
|
+
require_relative 'attractor'
|
3
|
+
require_relative 'particle'
|
4
|
+
|
5
|
+
attr_reader :particles, :attractor, :physics
|
6
|
+
|
7
|
+
def settings
|
8
|
+
size 640, 360
|
9
|
+
end
|
10
|
+
|
11
|
+
def setup
|
12
|
+
sketch_title "Attract Repel"
|
13
|
+
@physics = Physics::VerletPhysics2D.new
|
14
|
+
physics.setDrag(0.01)
|
15
|
+
@particles = (0..50).map { Particle.new(TVec2D.new(rand(width), rand(height))) }
|
16
|
+
@attractor = Attractor.new(TVec2D.new(width / 2, height / 2))
|
17
|
+
end
|
18
|
+
|
19
|
+
def draw
|
20
|
+
background(255)
|
21
|
+
physics.update
|
22
|
+
attractor.display
|
23
|
+
particles.each(&:display)
|
24
|
+
if mouse_pressed?
|
25
|
+
attractor.lock
|
26
|
+
attractor.set(mouse_x, mouse_y)
|
27
|
+
else
|
28
|
+
attractor.unlock
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
# The Nature of Code
|
4
|
+
# Daniel Shiffman
|
5
|
+
# http://natureofcode.com
|
6
|
+
class Attractor < Physics::VerletParticle2D
|
7
|
+
extend Forwardable
|
8
|
+
def_delegators(:@app, :fill, :ellipse, :physics, :width)
|
9
|
+
attr_accessor :r
|
10
|
+
|
11
|
+
def initialize(loc)
|
12
|
+
super(loc)
|
13
|
+
@app = $app
|
14
|
+
@r = 24
|
15
|
+
physics.add_particle(self)
|
16
|
+
physics.add_behavior(Physics::AttractionBehavior2D.new(self, width, 0.1))
|
17
|
+
end
|
18
|
+
|
19
|
+
def display
|
20
|
+
fill(0)
|
21
|
+
ellipse(x, y, r * 2, r * 2)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
# The Nature of Code
|
4
|
+
# Daniel Shiffman
|
5
|
+
# http://natureofcode.com
|
6
|
+
|
7
|
+
# class Spore extends the class "VerletParticle2D"
|
8
|
+
class Particle < Physics::VerletParticle2D
|
9
|
+
extend Forwardable
|
10
|
+
def_delegators(:@app, :fill, :stroke, :stroke_weight, :ellipse, :physics)
|
11
|
+
attr_reader :r
|
12
|
+
|
13
|
+
def initialize(loc)
|
14
|
+
super(loc)
|
15
|
+
@app = $app
|
16
|
+
@r = 8
|
17
|
+
physics.add_particle(self)
|
18
|
+
physics.add_behavior(Physics::AttractionBehavior2D.new(self, r * 4, -1))
|
19
|
+
end
|
20
|
+
|
21
|
+
def display
|
22
|
+
fill 127
|
23
|
+
stroke 0
|
24
|
+
stroke_weight 2
|
25
|
+
ellipse x, y, r * 2, r * 2
|
26
|
+
end
|
27
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,76 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2010 Daniel Shiffman
|
3
|
+
#
|
4
|
+
# This demo & library is free software you can redistribute it and/or
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
6
|
+
# License as published by the Free Software Foundation either
|
7
|
+
# version 2.1 of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# http://creativecommons.org/licenses/LGPL/2.1/
|
10
|
+
#
|
11
|
+
# This library 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 GNU
|
14
|
+
# Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
17
|
+
# License along with this library if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19
|
+
class Cluster
|
20
|
+
attr_reader :nodes, :diameter, :physics
|
21
|
+
|
22
|
+
# We initialize a with a number of nodes, a diameter, and centerpoint
|
23
|
+
def initialize(physics, n, d, center)
|
24
|
+
@physics = physics
|
25
|
+
@diameter = d
|
26
|
+
@nodes = (0..n).map { Node.new(center.add(TVec2D.random_vector)) }
|
27
|
+
# Connect all the nodes with a Spring
|
28
|
+
nodes[1..nodes.size - 1].each_with_index do |pi, i|
|
29
|
+
nodes[0..i].each do |pj|
|
30
|
+
physics.add_spring(Physics::VerletSpring2D.new(pi, pj, diameter, 0.01))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def display
|
36
|
+
nodes.each(&:display)
|
37
|
+
end
|
38
|
+
# This functons connects one cluster to another
|
39
|
+
# Each point of one cluster connects to each point of the other cluster
|
40
|
+
# The connection is a "VerletMinDistanceSpring"
|
41
|
+
# A VerletMinDistanceSpring is a spring which only enforces its rest length if the
|
42
|
+
# current distance is less than its rest length. This is handy if you just want to
|
43
|
+
# ensure objects are at least a certain distance from each other, but don't
|
44
|
+
# care if it's bigger than the enforced minimum.
|
45
|
+
|
46
|
+
def connect(other)
|
47
|
+
other_nodes = other.nodes
|
48
|
+
nodes.each do |pi|
|
49
|
+
other_nodes.each do |pj|
|
50
|
+
physics.add_spring(Physics::VerletMinDistanceSpring2D.new(pi, pj, (diameter + other.diameter) * 0.5, 0.05))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Draw all the internal connections
|
56
|
+
def internal_connections(app)
|
57
|
+
app.stroke(200, 0, 0, 80)
|
58
|
+
nodes[0..nodes.size - 1].each_with_index do |pi, i|
|
59
|
+
nodes[i + 1..nodes.size - 1].each do |pj|
|
60
|
+
app.line(pi.x, pi.y, pj.x, pj.y)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Draw all the connections between this and another Cluster
|
66
|
+
def show_connections(app, other)
|
67
|
+
app.stroke(200, 200, 0, 20)
|
68
|
+
app.stroke_weight(2)
|
69
|
+
other_nodes = other.nodes
|
70
|
+
nodes.each do |pi|
|
71
|
+
other_nodes[0..other_nodes.size - 1].each do |pj|
|
72
|
+
app.line(pi.x, pi.y, pj.x, pj.y)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'jruby_art'
|
2
|
+
require 'toxiclibs'
|
3
|
+
require_relative 'cluster'
|
4
|
+
require_relative 'node'
|
5
|
+
|
6
|
+
#
|
7
|
+
# Copyright (c) 2010 Daniel Shiffman
|
8
|
+
#
|
9
|
+
# This demo & library is free software you can redistribute it and/or
|
10
|
+
# modify it under the terms of the GNU Lesser General Public
|
11
|
+
# License as published by the Free Software Foundation either
|
12
|
+
# version 2.1 of the License, or (at your option) any later version.
|
13
|
+
#
|
14
|
+
# http://creativecommons.org/licenses/LGPL/2.1/
|
15
|
+
#
|
16
|
+
# This library is distributed in the hope that it will be useful,
|
17
|
+
# but WITHOUT ANY WARRANTY without even the implied warranty of
|
18
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
19
|
+
# Lesser General Public License for more details.
|
20
|
+
#
|
21
|
+
# You should have received a copy of the GNU Lesser General Public
|
22
|
+
# License along with this library if not, write to the Free Software
|
23
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
24
|
+
|
25
|
+
attr_reader :physics, :clusters, :show_physics, :show_particles, :f
|
26
|
+
|
27
|
+
def settings
|
28
|
+
size(640, 360)
|
29
|
+
end
|
30
|
+
|
31
|
+
def setup
|
32
|
+
sketch_title 'Force Directed Graph'
|
33
|
+
@f = create_font('Georgia', 12, true)
|
34
|
+
@show_physics = true
|
35
|
+
@show_particles = true
|
36
|
+
# Initialize the physics
|
37
|
+
@physics = Physics::VerletPhysics2D.new
|
38
|
+
physics.set_world_bounds(Toxi::Rect.new(10, 10, width - 20, height - 20))
|
39
|
+
# Spawn a new random graph
|
40
|
+
new_graph
|
41
|
+
end
|
42
|
+
|
43
|
+
# Spawn a new random graph
|
44
|
+
def new_graph
|
45
|
+
# Clear physics
|
46
|
+
physics.clear
|
47
|
+
center = TVec2D.new(width / 2, height / 2)
|
48
|
+
@clusters = (0..8).map { Cluster.new(physics, rand(3..8), rand(20..100), center) }
|
49
|
+
# All clusters connect to all clusters
|
50
|
+
clusters.each_with_index do |ci, i|
|
51
|
+
clusters[i + 1..clusters.size - 1].each do |cj|
|
52
|
+
ci.connect(cj)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def draw
|
58
|
+
# Update the physics world
|
59
|
+
physics.update
|
60
|
+
background(255)
|
61
|
+
# Display all points
|
62
|
+
clusters.each(&:display) if show_particles
|
63
|
+
# If we want to see the physics
|
64
|
+
if show_physics
|
65
|
+
clusters.each_with_index do |ci, i|
|
66
|
+
ci.internal_connections self
|
67
|
+
# Cluster connections to other clusters
|
68
|
+
clusters[1 + i..clusters.size - 1].each do |cj|
|
69
|
+
ci.show_connections(self, cj)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
# Instructions
|
74
|
+
fill(0)
|
75
|
+
text_font(f)
|
76
|
+
text("'p' to display or hide particles\n'c' to display or hide connections\n'n' for new graph", 10, 20)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Key press commands
|
80
|
+
def key_pressed
|
81
|
+
case key
|
82
|
+
when 'c'
|
83
|
+
@show_physics = !show_physics
|
84
|
+
@show_particles = true unless show_physics
|
85
|
+
when 'p'
|
86
|
+
@show_particles = !show_particles
|
87
|
+
@show_physics = true unless show_particles
|
88
|
+
when 'n'
|
89
|
+
new_graph
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
# The Nature of Code
|
4
|
+
# Daniel Shiffman
|
5
|
+
# http://natureofcode.com
|
6
|
+
# Force directed graph
|
7
|
+
# Heavily based on: http://code.google.com/p/fidgen/
|
8
|
+
# Notice how we are using inheritance here!
|
9
|
+
# We could have just stored a reference to a VerletParticle object
|
10
|
+
# inside the Node class, but inheritance is a nice alternative
|
11
|
+
class Node < Physics::VerletParticle2D
|
12
|
+
extend Forwardable
|
13
|
+
def_delegators(:@app, :fill, :stroke, :stroke_weight, :ellipse)
|
14
|
+
def initialize(pos)
|
15
|
+
super(pos)
|
16
|
+
@app = $app
|
17
|
+
end
|
18
|
+
|
19
|
+
# All we're doing really is adding a display function to a VerletParticle
|
20
|
+
def display
|
21
|
+
fill(50, 200, 200, 150)
|
22
|
+
stroke(50, 200, 200)
|
23
|
+
stroke_weight(2)
|
24
|
+
ellipse(x, y, 16, 16)
|
25
|
+
end
|
26
|
+
end
|