File:Hilbert curve 3.svg

From Wikimedia Commons, the free media repository

Jump to: navigation, search

Hilbert_curve_3.svg(SVG file, nominally 512 × 512 pixels, file size: 619 B)

[edit] Summary

Description
English: First, second, and third order Hilbert Curves overlayed, with the lines getting thinner and darker as the order increases.
Date

13 July 2008(2008-07-13)

Source

Own work by uploader, generated by an original program described below

Author

Geoff Richards (Qef)

Permission
(Reusing this image)
See below.
Other versions

[edit] Source code

This SVG image, as well as the other two versions draw to lower orders, were generated by running the following Lua program. It uses the L-system described in the Wikipedia article on Hilbert curves, using simple string replacement to generate a complete turtle-graphics program, which is then run to generate SVG path instructions.

local IMG_SZ, DEPTH = 512, 3

local fh = assert(io.open("Hilbert_curve.svg", "wb"))
fh:write('<?xml version="1.0" encoding="UTF-8"?>\n',
         '<svg version="1.0" width="', IMG_SZ, '" height="', IMG_SZ,
         '" xmlns="http://www.w3.org/2000/svg">\n')

local L_SYSTEM_RULES = {    -- these are from the Wikipedia article
    L = "+RF-LFL-FR+",
    R = "-LF+RFR+FL-",
}
local ANGLE_COMMANDS = {    -- angle expressed in units of 90 degrees
    [0] = "h",
    [1] = "v",
    [2] = "h-",
    [3] = "v-",
}
local STROKE_STYLE = {      -- each order drawn with different stroke style
    [1] = "stroke:#f00;stroke-width:6;fill:none",
    [2] = "stroke:#00f;stroke-width:4;fill:none",
    [3] = "stroke:#000;stroke-width:2;fill:none",
    [4] = "stroke:#000;stroke-width:1;fill:none",
    [5] = "stroke:#000;stroke-width:0.5;fill:none",
}

function turtle_graphics (input, startpos, line_len)
    local output = "M" .. startpos .. "," .. startpos
    local angle = 0
    for i = 1, input:len() do
        local cmd = input:sub(i, i)
        if cmd == "F" then
            output = output .. ANGLE_COMMANDS[angle] .. line_len
        elseif cmd == "+" then
            angle = (angle + 1) % 4
        elseif cmd == "-" then
            angle = (angle - 1) % 4
        end
    end
    return output
end

local line_len = IMG_SZ / 2
for d = 1, DEPTH do
    local lsys = "L"
    for _ = 1, d do
        -- Apply the production rules.  Note that both 'L' and 'R' rules are
        -- applied simultaneously.
        lsys = lsys:gsub("([LR])", function (orig)
            return L_SYSTEM_RULES[orig]
        end)
    end
    fh:write(' <path style="', STROKE_STYLE[d], '" d="',
             turtle_graphics(lsys, line_len / 2, line_len), '"/>\n')
    line_len = line_len / 2
end

fh:write('</svg>\n')

[edit] Licensing

PD-icon.svg This image has been released into the public domain by its author, Qef. This applies worldwide.

In some countries this may not be legally possible; if so:
Qef grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.


Alemannisch | العربية | Беларуская (тарашкевіца) | Български | Català | Česky | Deutsch | Ελληνικά | English | Español | Eesti | فارسی | Suomi | Français | עברית | Italiano | 日本語 | 한국어 | Lietuvių | Македонски | Malti | Plattdüütsch | Nederlands | Polski | Русский | Српски / Srpski | Svenska | தமிழ் | ไทย | Türkçe | Українська | Vèneto | Tiếng Việt | 中文 | ‪中文(简体)‬ | ‪中文(繁體)‬ | +/−

File history

Click on a date/time to view the file as it appeared at that time.

Date/TimeThumbnailDimensionsUserComment
current15:18, 13 July 2008Thumbnail for version as of 15:18, 13 July 2008512×512 (619 B)Qef (Talk | contribs) ({{Information |Description={{en|1=First, second, and third order Hilbert Curves overlayed, with the lines getting thinner and darker as the order increases.}} |Source=Own work by uploader, generated by an original program described below |Author=Geoff Ric)

Global file usage

The following other wikis use this file: