celtic-knot Celtic Knot Cartesian Grid Matrix Pattern Generator for Scaleable Vector Graphics

celtic-knot is a Ruby programme that creates simple rectangular celtic knot drawings based upon a given set of parameters.


The drawing is in SVG (Scaleable Vector Graphics) format, which is sent to standard output.


Usage: ./knot [options]
    -h, --help                       Prints this help
    -V, --vertical=VERTICAL          Number of cells vertically.
    -H, --horizontal=HORIZONTAL      Number of cells horizontally.
    -G, --cell-size=CELL_SIZE        Dimensions of each cell in the grid.
    -b, --background-color=BG_COLOR  Background colour.
    -k, --knot-color=KNOT_COLOR      Knot colour.
    -K, --knot-width=KNOT_WIDTH      Knot width.
    -s, --stroke-color=STROKE_COLOR  Stroke colour.
    -S, --stroke-width=STROKE_WIDTH  Stroke width.



Basic knot

$ ./knot \
    --vertical=2 \
    --horizontal=2 \
    --cell-size=96 \
    --knot-color='white' \
    --knot-width=24 \
    --stroke-color=black \
    --stroke-width=8 \
    > examples/basic.svg


Ingƿine knot

$ ./knot \
    --vertical=3 \
    --horizontal=4 \
    --cell-size=96 \
    --background-color='#012169' \
    --knot-color='#C8102E' \
    --knot-width=32 \
    --stroke-color=white \
    --stroke-width=16 \
    > examples/ingwine.svg

Bratach (Banner)

Bratach knot

$ ./knot \
    --vertical=5 \
    --horizontal=6 \
    --cell-size=64 \
    --background-color='#169B62' \
    --knot-color='#FF883E' \
    --knot-width=32 \
    --stroke-color=white \
    --stroke-width=4 \
    > examples/bratach.svg

Converting SVG to Other Formats

The SVG file can be viewed locally in your Web browser or converted into other formats such as PNG using utilities such as ImageMagick's convert. For example:

convert -background none examples/basic.svg examples/basic.png


TODO: Move to API reference docs.

The programme generates SVG output using the Nokogiri library for XML.

The knot is modelled as a two dimensional matrix (Knot::Grid), which itself contains cells (Knot::Cell), which then contains absolutely positioned precalculated points (Knot::Point) that are used for pathing by the drawing engine (Knot.)



The drawing engine.



The grid is a Matrix of cells (arranged as rows and columns.) The grid can be nagivated with absolute coordinates using the position(i, j) method and nearby cells accessed relatively using the rel(i, j) method.


Each cell within the grid contains several cartesian points stored in hashes. These points are precaclulated so that minimal calculations are required when pathing.


Each point is modelled in the cartesian plane as a Vector[x, y].


Models an SVG path.

Class Methods

Knot::Point.midpoint(a, b)

Calculates the midpoint between two points. Used where a desired point has not been precalculated but can instead be derived from another pair of points that are precalculated.

Knot::Point.distance(a, b)

Calculates the distance between two points. Used for calculating radii for arc curves.


2023 Damien Bezborodov