npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@rgsoft/turtle

v1.0.1

Published

Turtle graphics and L-Systems library

Downloads

57

Readme

Turtle

Turtle and L-Systems library

L-Systems

The LSystem class is an implementation of the Lindenmayer systems based on an alphabet of symbols and production rules.

const lsystem = new LSystem(axiom, rules);

The axiom is the base sentence from which future sentences will be generated or inferred, and must be composed only by symbols of a defined alphabet. This alphabet is based on the Turtle Graphics movements.

F, G, H, L, M, D, U, +, -, [, ]

The rules is an array of strings or instances of the Rule class, where each one of them defines a production rule for spawning the next generation sentence.

Generation

The generate method in the LSystem class spawns new generations of the current sentence.

const axiom = 'F';
const rules = [
    'F=>F[+F][-G]'
];
const lsystem = new LSystem(axiom, rules);
console.log(lsystem.sentence); // F
lsystem.generate();
console.log(lsystem.sentence); // F[+F][-G]

This method also admits a number argument that indicates the number of generations to generate.

const axiom = 'F';
const rules = [
    'F=>FG'
];
const lsystem = new LSystem(axiom, rules);
console.log(lsystem.sentence); // F
lsystem.generate(4);
console.log(lsystem.sentence); // FGGGG

Rules

The Rule class represents a production rule that allows the generation from a symbol to a string of one or more symbols from the alphabet.

const str = 'F => F[+F][-F]';
const rules = [ new Rule(str) ];
console.log(rule.base); // F
console.log(rule.next); // ['F', '[', '+', 'F', ']', '[', '-', 'F', ']']

The LSystem class uses this class to maintain and generate the sentences.

Turtle Graphics

The Turtle class is a clumsy attempt to use a "sentence" driven drawing engine based on the turtle graphics. The sentences use the same symbols in the LSystem and Rule alphabet, with each symbol having a specific usage.

Symbol | Action -------------| ------ F, G, H| Advances forward a certain amount of steps drawing a line M | Advances forward a certain amount of steps without drawing a line L | Draws a tree leaf U | Upscale drawing (divides current scale by scale ratio, with initial scale is 1) D | Downscale drawing (multiplies current scale by scale ratio, with initial scale is 1) + | Turn right a certain angle - | Turn left a certain angle [ | Saves current context ] | Restores current context

The render method reads each symbol in the string, and performs an action according to the previous table.

const turtle = new Turtle(config);
turtle.render(sentence);

Turtle Config

The config argument for the Turtle class constructor has these properties:

Property | Type | Description -------------|----------------------------|------------ context | CanvasRenderingContext2D | Canvas rendering context used for drawing strokeSize | number | Lenght of each step used stroke or move (may be affected by scaling) strokeWeight | number | Width of the stroke (may be affected by scaling) angle | number | Angle used for each turn (+ and -) scale | ScaleConfig | Scale config

The ScaleConfig has this properties:

Property | Type | Description ------------------|-----------|------------ ratio | number | Scale ratio (between 0 and 1) to be applied when upscaling or downscaling scaleStrokeSize | boolean | Optional (default false), specifies if the stroke length must be scaled scaleStrokeWeight | boolean | Optional (default false), specifies if the stroke weight must be scaled scaleAngle | boolean | Optional (default false), specifies if the angle must be scaled