Package import"zappem.net/pub/graphics/polymark"
Documentationhttps://pkg.go.dev/zappem.net/pub/graphics/polymark
Sourceshttps://github.com/tinkerator/polymark

polymark - render shapes and text as polygons

Overview

For line graphics and plotters/lasers/cnc devices, it is convenient to be able to render shapes as outlines. This package converts desired shapes into such outlines in the form of polygon.Shapes.

Example

The package contains an examples/lines.go program to demonstrate the capabilities of the polymark package. For example,

$ go run examples/lines.go --n=3 --wide=10 --m=5 --width 400 --height 400
2025/06/15 09:58:50 wrote result to "image.png"

generates a 400x400 pixel image:

polygon outlines

The default options for example/lines.go:

$ go run examples/lines.go 
2025/06/20 08:35:12 wrote result to "image.png"

generates the following 500x500 pixel image:

default outlines

The default options for example/lines.go with the --ids and --fill arguments:

$ go run examples/lines.go --ids --fill
2025/06/20 08:35:12 wrote result to "image.png"

generates the following 500x500 pixel image with the solid parts of the shapes filled and each polygon of outline numerically identified:

filled outlines

Use go run examples/lines.go --help to see all of the flag options.

Tests

The package contains a simple set of tests that can be run as follows:

$ git clone https://github.com/tinkerator/polymark.git
$ cd polymark
$ go test -v
=== RUN   TestCircle
--- PASS: TestCircle (0.00s)
=== RUN   TestLine
    polymark_test.go:121: [ 0]  got="..##################################..."
    polymark_test.go:121: [ 1]  got=".##................................##.."
    polymark_test.go:121: [ 2]  got="##..................................##."
    polymark_test.go:121: [ 3]  got="#....................................#."
    polymark_test.go:121: [ 4]  got="#....................................#."
    polymark_test.go:121: [ 5]  got="##..................................##."
    polymark_test.go:121: [ 6]  got=".##................................##.."
    polymark_test.go:121: [ 7]  got="..##################################..."
    polymark_test.go:121: [ 8]  got="......................................."
--- PASS: TestLine (0.00s)
=== RUN   TestText
    polymark_test.go:160: [ 0]  got="....######....."
    polymark_test.go:160: [ 1]  got="...#..######..."
    polymark_test.go:160: [ 2]  got="..#.##....#.#.."
    polymark_test.go:160: [ 3]  got=".#.#.......#.#."
    polymark_test.go:160: [ 4]  got=".##........#.#."
    polymark_test.go:160: [ 5]  got="##..........##."
    polymark_test.go:160: [ 6]  got="##############."
    polymark_test.go:160: [ 7]  got="##############."
    polymark_test.go:160: [ 8]  got="##............."
    polymark_test.go:160: [ 9]  got="##............."
    polymark_test.go:160: [10]  got="#.#............"
    polymark_test.go:160: [11]  got=".##.........##."
    polymark_test.go:160: [12]  got=".#.#.......#.#."
    polymark_test.go:160: [13]  got="..#.#....##.#.."
    polymark_test.go:160: [14]  got="...######..#..."
    polymark_test.go:160: [15]  got=".....######...."
    polymark_test.go:160: [16]  got="..............."
    polymark_test.go:187: [ 0]  got="...####.."
    polymark_test.go:187: [ 1]  got=".#####.#."
    polymark_test.go:187: [ 2]  got=".#.#..##."
    polymark_test.go:187: [ 3]  got="##..#..#."
    polymark_test.go:187: [ 4]  got="##...###."
    polymark_test.go:187: [ 5]  got="##....##."
    polymark_test.go:187: [ 6]  got="#.#......"
    polymark_test.go:187: [ 7]  got=".####...."
    polymark_test.go:187: [ 8]  got="........."
    polymark_test.go:226: [ 0]  got="##............."
    polymark_test.go:226: [ 1]  got="##............."
    polymark_test.go:226: [ 2]  got="##............."
    polymark_test.go:226: [ 3]  got="##............."
    polymark_test.go:226: [ 4]  got="##............."
    polymark_test.go:226: [ 5]  got="##............."
    polymark_test.go:226: [ 6]  got="##............."
    polymark_test.go:226: [ 7]  got="##.######......"
    polymark_test.go:226: [ 8]  got="###########...."
    polymark_test.go:226: [ 9]  got="#####....###..."
    polymark_test.go:226: [10]  got="###.......###.."
    polymark_test.go:226: [11]  got="##.........##.."
    polymark_test.go:226: [12]  got="##.........#.#."
    polymark_test.go:226: [13]  got="##..........##."
    polymark_test.go:226: [14]  got="##..........##."
    polymark_test.go:226: [15]  got="##..........##."
    polymark_test.go:226: [16]  got="##..........##."
    polymark_test.go:226: [17]  got="##.........#.#."
    polymark_test.go:226: [18]  got="##.........##.."
    polymark_test.go:226: [19]  got="###.......###.."
    polymark_test.go:226: [20]  got="####....####..."
    polymark_test.go:226: [21]  got="###########...."
    polymark_test.go:226: [22]  got="##..######....."
    polymark_test.go:226: [23]  got="..............."
--- PASS: TestText (0.00s)
=== RUN   TestAlign
    polymark_test.go:266:   0> ".################...##.......................###############........######.....................################...###########....."
    polymark_test.go:266:   1> ".###############....##.......................###############.......#.#######...................###############....##############.."
    polymark_test.go:266:   2> "........##..........##..............................#.............###......##.........................##..........##.........####."
    polymark_test.go:266:   3> "........##..........##..............................#............#...........#........................##..........##...........#.#"
    polymark_test.go:266:   4> "........##..........##..............................#...........##...........##.......................##..........##............##"
    polymark_test.go:266:   5> "........##..........##..............................#...........#.............#.......................##..........##............##"
    polymark_test.go:266:   6> "........##..........##..............................#...........#.............#.......................##..........##............##"
    polymark_test.go:266:   7> "........##..........##..............................#..........#......................................##..........##............#."
    polymark_test.go:266:   8> "........##..........##..............................#..........#......................................##..........##...........##."
    polymark_test.go:266:   9> "........##..........##..............................#..........#......................................##..........##.........###.."
    polymark_test.go:266:  10> "........##..........##..............................#..........#......................................##..........#############..."
    polymark_test.go:266:  11> "........##..........##..............................#..........#......................................##..........###########....."
    polymark_test.go:266:  12> "........##..........##..............................#..........#......................................##..........##......#......."
    polymark_test.go:266:  13> "........##..........##..............................#..........#......................................##..........##.......#......"
    polymark_test.go:266:  14> "........##..........##..............................#..........#......................................##..........##........#....."
    polymark_test.go:266:  15> "........##..........##..............................#...........#.....................................##..........##........#....."
    polymark_test.go:266:  16> "........##..........##..............................#...........#.............#.......................##..........##.........#...."
    polymark_test.go:266:  17> "........##..........##..............................#...........##...........##.......................##..........##.........#...."
    polymark_test.go:266:  18> "........##..........##..............................#............#...........#........................##..........##..........#..."
    polymark_test.go:266:  19> "........##..........##..............................#............##.........##........................##..........##...........#.."
    polymark_test.go:266:  20> "........##..........##..............................#..............#......##..........................##..........##...........#.."
    polymark_test.go:266:  21> "........##..........##############..................#..............#######.#..........................##..........##............##"
    polymark_test.go:266:  22> "........#...........#############...................#................######...........................#...........#.............#."
    polymark_test.go:266:  23> ".................................................................................................................................."
    polymark_test.go:266:  24> ".................................................................................................................................."
    polymark_test.go:266:  25> "##..............##......##...............##..............##..........#######..............##..............##......###########....."
    polymark_test.go:266:  26> "##..............##......##...............##..............##.........##########............##..............##......##############.."
    polymark_test.go:266:  27> "###............###......##...............###............###........###......##............###............###......##.........####."
    polymark_test.go:266:  28> "###............###......##...............###............###.......##..........##..........###............###......##...........#.#"
    polymark_test.go:266:  29> "####..........####......##...............####..........####.......#...........#.#.........####..........####......##............##"
    polymark_test.go:266:  30> "####..........####......##...............####..........####......##............##.........####..........####......##............##"
    polymark_test.go:266:  31> "####..........####......##...............####..........####......##............#..........####..........####......##............##"
    polymark_test.go:266:  32> "##.##........##.##......##...............##.##........##.##.....##........................##.##........##.##......##............#."
    polymark_test.go:266:  33> "##.##........##.##......##...............##.##........##.##.....##........................##.##........##.##......##...........##."
    polymark_test.go:266:  34> "##.##........##.##......##...............##.##........##.##.....##........................##.##........##.##......##.........###.."
    polymark_test.go:266:  35> "##..##......##..##......##...............##..##......##..##.....##........................##..##......##..##......#############..."
    polymark_test.go:266:  36> "##..##......##..##......##...............##..##......##..##.....##........................##..##......##..##......###########....."
    polymark_test.go:266:  37> "##...##....##...##......##...............##...##....##...##.....##........................##...##....##...##......##......#......."
    polymark_test.go:266:  38> "##...##....##...##......##...............##...##....##...##.....##........................##...##....##...##......##.......#......"
    polymark_test.go:266:  39> "##...##....##...##......##...............##...##....##...##.....##........................##...##....##...##......##........#....."
    polymark_test.go:266:  40> "##....##..##....##......##...............##....##..##....##......##.......................##....##..##....##......##........#....."
    polymark_test.go:266:  41> "##....##..##....##......##...............##....##..##....##......##............##.........##....##..##....##......##.........#...."
    polymark_test.go:266:  42> "##....##..##....##......##...............##....##..##....##......#.#...........#..........##....##..##....##......##.........#...."
    polymark_test.go:266:  43> "##.....####.....##......##...............##.....####.....##.......##..........##..........##.....####.....##......##..........#..."
    polymark_test.go:266:  44> "##.....####.....##......##...............##.....####.....##.......##.........##...........##.....####.....##......##...........#.."
    polymark_test.go:266:  45> "##......##......##......##...............##......##......##.........##.....###............##......##......##......##...........#.."
    polymark_test.go:266:  46> "##......##......##......##############...##......##......##.........#########.............##......##......##......##............##"
    polymark_test.go:266:  47> "#.......#.......#.......#############....#.......#.......#............######..............#.......#.......#.......#.............#."
    polymark_test.go:266:  48> ".................................................................................................................................."
    polymark_test.go:266:  49> ".................................................................................................................................."
    polymark_test.go:266:  50> ".................................................................................................................................."
    polymark_test.go:266:  51> ".................................................................................................................................."
    polymark_test.go:266:  52> ".................................................................................................................................."
    polymark_test.go:266:  53> ".###########..........##....................###########..............######..................###########..........###########....."
    polymark_test.go:266:  54> ".##############.......##....................#############...........#.#######................##############.......##############.."
    polymark_test.go:266:  55> ".##.........####......##....................#..........###.........###......##...............##.........####......##.........####."
    polymark_test.go:266:  56> ".##...........#.#.....##....................#............##.......#...........#..............##...........#.#.....##...........#.#"
    polymark_test.go:266:  57> ".##............##.....##....................#.............#......##...........##.............##............##.....##............##"
    polymark_test.go:266:  58> ".##............##.....##....................#.............#......#.............#.............##............##.....##............##"
    polymark_test.go:266:  59> ".##............##.....##....................#.............#......#.............#.............##............##.....##............##"
    polymark_test.go:266:  60> ".##............#......##....................#............##.....#............................##............#......##............#."
    polymark_test.go:266:  61> ".##...........##......##....................#............#......#............................##...........##......##...........##."
    polymark_test.go:266:  62> ".##.........###.......##....................#..........###......#............................##.........###.......##.........###.."
    polymark_test.go:266:  63> ".#############........##....................#############.......#............................#############........#############..."
    polymark_test.go:266:  64> ".##############.......##....................#############.......#............................##############.......###########....."
    polymark_test.go:266:  65> ".##.........####......##....................#..........###......#............................##.........####......##......#......."
    polymark_test.go:266:  66> ".##...........#.#.....##....................#............##.....#............................##...........#.#.....##.......#......"
    polymark_test.go:266:  67> ".##............##.....##....................#.............#.....#............................##............##.....##........#....."
    polymark_test.go:266:  68> ".##............##.....##....................#.............#......#...........................##............##.....##........#....."
    polymark_test.go:266:  69> ".##............##.....##....................#.............#......#.............#.............##............##.....##.........#...."
    polymark_test.go:266:  70> ".##............##.....##....................#.............#......##...........##.............##............##.....##.........#...."
    polymark_test.go:266:  71> ".##............#......##....................#............##.......#...........#..............##............#......##..........#..."
    polymark_test.go:266:  72> ".##...........##......##....................#............#........##.........##..............##...........##......##...........#.."
    polymark_test.go:266:  73> ".##.........###.......##....................#..........###..........#......##................##.........###.......##...........#.."
    polymark_test.go:266:  74> ".#############........##############........#############...........#######.#................#############........##............##"
    polymark_test.go:266:  75> ".###########..........#############.........###########...............######.................###########..........#.............#."
--- PASS: TestAlign (0.00s)
PASS
ok      zappem.net/pub/graphics/polymark        0.005s

Reporting bugs

The polymark package has been developed purely out of self-interest and offers no guarantee of fixes or support. That being said, if you would like to suggest a feature addition or suggest a fix, please use the bug tracker.

License information

See the LICENSE file: the same BSD 3-clause license as that used by golang itself.


Markdown rendering courtesy of gomarkdown/markdown.