Skip to content

Instantly share code, notes, and snippets.

@karlwilcox
Created March 28, 2021 14:17
Show Gist options
  • Save karlwilcox/c9767057dc4ede1d4c3e310ba33d022a to your computer and use it in GitHub Desktop.
Save karlwilcox/c9767057dc4ede1d4c3e310ba33d022a to your computer and use it in GitHub Desktop.
Generate Variant edge types for drawshield (assumes directory called 'edges' in current dir)
<?php
$subArg = '';
function subFunc( $match ) {
global $subArg;
if ( $match[0]{2} == '}' ) {
return $subArg;
} else {
$val = floatVal(substr($match[0],3));
switch ( $match[0]{2} ) {
case '*': return sprintf("%.3f", ($subArg * $val));
case '/': return sprintf("%.3f", ($subArg / $val));
}
}
return $match; // should not happen
}
function makeEdges() {
global $subArg;
$lineSpecs = array (
'angled' => '0:100:i:o:h50v-{S}h50:O1',
'angled-upper' => '0:100:o:i:h50v{S}h50:O1',
'arched' => '1:{D}:i:i:c {D/2},-{S*2} {D/2},-{S*2} {D},0:R1',
'battled-ghibelline' => '*:{S*4}:i:i:h{S} v-{S*2} c0,0 {S},{S*0.37} {S},{S*0.9} 0,-{S*0.58} {S},-{S*0.90} {S},-{S*0.9} v{S*2} h{S}:U1',
'embattled-arrondi' => '*:{S*4}:i:i:h{S} v-{S} c0,-{S} {S*2},-{S} {S*2},0 v{S} h{S}:U1',
'cupolaed' => '*:{S*4}:i:i:h{S} v-{S} h{S/2} c0,-{S/2} {S},-{S/2} {S},0 h{S/2} v{S} h{S}:U1',
'gabled' => '*:{S*4}:i:i:h{S} v-{S} h{S/2} l{S/2},-{S/2} l{S/2},{S/2} h{S/2} v{S} h{S}:U1',
'battled-mine-dumps' => '*:{S*4}:i:i:h{S*3} l{S/2},{S} h{S*3} l{S/2},-{S}:O1',
'battled-counter' => '*:{S*4}:i:i:h{S}v-{S}h{S*2}v{S}h{S}:R1',
'battled-brettesse' => '*:{S*4}:i:i:h{S}v-{S}h{S*2}v{S}h{S}',
'battled-embattled' => '*:{S*4}:i:i:l{S*0.34},0 0,-{S/3} {S*0.66},0 0,-{S/3} {S*0.67},0 0,-{S/3} {S*0.66},0 0,{S/3} {S*0.67},0 0,{S/3} {S*0.66},0 0,{S/3} {S*.34},0:U1',
'bevilled' => '0:{S}:i:o:h{S}l-{S},-{S}h{S}:O1',
'bevilled-upper' => '0:{S}:o:i:h{S}l-{S},{S}h{S}:O1',
'thorny' => '*:{S*2}:-:-:c 0,-{S*1.08} -{S*0.32},-{S*1.08} -{S*0.32},-{S*1.08} h {S*1.5} c 0,0 {S*0.32},0 {S*0.32},{S*1.08} 0,{S*1.08} -{S*0.32},{S*1.08} -{S*0.32},{S*1.08} h {S*1.5} c 0,0 {S*0.32},0 {S*0.32},-{S*1.08} ',
'indented-pommetty' => '*:{S*1.8}:-:-:l
{S*0.5},-{S*1.80}
c
-{S*0.10},0
-{S*0.20},-{S*0.10}
-{S*0.20},-{S*0.20}
0,-{S*0.10}
{S*0.10},-{S*0.20}
{S*0.20},-{S*0.20}
{S*0.10},0
{S*0.20},{S*0.10}
{S*0.20},{S*0.20}
0,{S*0.10}
-{S*0.10},{S*0.20}
-{S*0.20},{S*0.20}
l
{S*0.80},{S*3.60}
c
-{S*0.10},0
-{S*0.20},{S*0.10}
-{S*0.20},{S*0.20}
0,{S*0.10}
{S*0.10},{S*0.20}
{S*0.20},{S*0.20}
{S*0.10},0
{S*0.20},-{S*0.10}
{S*0.20},-{S*0.20}
0,-{S*0.10}
-{S*0.10},-{S*0.20}
-{S*0.20},-{S*0.20}
l
{S*0.5},-{S*1.80}',
'trefle' => '*:{S*2.16}:-:-:c
{S*0.1974684},{S*0.0549}
{S*0.3983884},{S*0.1098}
{S*0.4820684},-{S*0.2125}
l
-{S*0.04647},-{S*0.0232}
c
-{S*0.05227},{S*0.0967}
-{S*0.15391},{S*0.1626}
-{S*0.2708},{S*0.1626}
-{S*0.170061},0
-{S*0.308},-{S*0.1392}
-{S*0.308},-{S*0.3107}
0,-{S*0.1717}
{S*0.137939},-{S*0.3108}
{S*0.308},-{S*0.3108}
{S*0.05318},0
{S*0.10309},{S*0.0136}
{S*0.14684},{S*0.0374}
l
{S*0.03085},-{S*0.021}
c
-{S*0.05572},-{S*0.0563}
-{S*0.0902},-{S*0.134}
-{S*0.0902},-{S*0.2198}
0,-{S*0.1716}
{S*0.13776},-{S*0.3106}
{S*0.30782},-{S*0.3106}
{S*0.17025},0
{S*0.30801},{S*0.139}
{S*0.30801},{S*0.3106}
0,{S*0.0913}
-{S*0.03884},{S*0.1731}
-{S*0.10091},{S*0.2299}
l
{S*0.03158},{S*0.0109}
c
{S*0.04374},-{S*0.0238}
{S*0.0824},-{S*0.0374}
{S*0.13556},-{S*0.0374}
{S*0.17006},0
{S*0.30796},{S*0.1391}
{S*0.30796},{S*0.3108}
0,{S*0.1715}
-{S*0.1379},{S*0.3107}
-{S*0.30796},{S*0.3107}
-{S*0.10634},0
-20,-{S*0.0545}
-{S*0.25535},-{S*0.137}
l
-{S*0.03866},{S*0.0183}
c
{S*0.18259},{S*0.5837}
{S*0.70417},-{S*0.1997}
{S*0.86427},{S*0.3955}
l
-{S*0.0448},{S*0.0062}
c
-{S*0.0558},-{S*0.0563}
-{S*0.1327},-{S*0.091}
-{S*0.2178},-{S*0.091}
-{S*0.1701},0
-{S*0.30796},{S*0.1391}
-{S*0.30796},{S*0.3108}
0,{S*0.1715}
{S*0.13786},{S*0.3105}
{S*0.30796},{S*0.3105}
{S*0.0531},0
{S*0.1031},-{S*0.0134}
{S*0.1468},-{S*0.0374}
l
{S*0.0044},{S*0.0018}
c
-{S*0.0685},{S*0.057}
-{S*0.1122},{S*0.1432}
-{S*0.1122},{S*0.2398}
0,{S*0.1715}
{S*0.1379},{S*0.3107}
{S*0.308},{S*0.3107}
{S*0.1701},0
{S*0.3081},-{S*0.1392}
{S*0.3081},-{S*0.3107}
0,-{S*0.0966}
-{S*0.0436},-{S*0.1828}
-{S*0.1123},-{S*0.2398}
l
{S*0.0132},-{S*0.0085}
c
{S*0.0464},{S*0.0285}
{S*0.1011},{S*0.0448}
{S*0.1595},{S*0.0448}
{S*0.1701},0
{S*0.308},-{S*0.139}
{S*0.308},-{S*0.3105}
0,-{S*0.1717}
-{S*0.1379},-{S*0.3108}
-{S*0.308},-{S*0.3108}
-{S*0.0849},0
-{S*0.1619},{S*0.0347}
-{S*0.2177},{S*0.091}
l
-{S*0.0443},{S*0.0027}
c
{S*0.0697},-{S*0.3222}
{S*0.270},-{S*0.2673}
{S*0.4738},-{S*0.2125}',
'fir-tree-topped' => '*:{S*3}:-:-:l
{S*0.397022},-{S*0.6288}
-{S*0.69447},{S*0.2902}
{S*1.14526},-{S*1.6169}
{S*1.20623},{S*1.6169}
-{S*0.5931},-{S*0.2902}
{S*0.8217},{S*1.2574}
-{S*0.727},-{S*0.2902}
{S*0.9499},{S*1.2574}
{S*0.8892},-{S*1.2574}
-{S*0.621},{S*0.2902}
{S*0.4286},-{S*0.6286}',
'liljakoro' => '*:{S*2}:-:-:c
-{S*0.000524},-{S*0.1511}
{S*0.0893876},-{S*0.2784}
{S*0.2493766},-{S*0.2768}
{S*0.016},{S*0.002}
{S*0.16161},{S*0.1682}
{S*0.31457},{S*0.112}
-{S*0.03798},-{S*0.4685}
-{S*0.43945},-{S*0.4418}
-{S*0.615358},-{S*0.2477}
-{S*0.054997},-{S*0.2281}
{S*0.109767},-{S*0.391}
{S*0.312168},-{S*0.3922}
{S*0.20242},-{S*0.002}
{S*0.24169},{S*0.1825}
{S*0.32832},{S*0.1631}
-{S*0.2617},-{S*0.5081}
-{S*0.22113},-{S*0.945}
{S*0.16809},-{S*1.3099}
{S*0.38919},{S*0.3649}
{S*0.43039},{S*0.8018}
{S*0.16858},{S*1.3099}
{S*0.08661},{S*0.0194}
{S*0.12591},-{S*0.1644}
{S*0.32841},-{S*0.1631}
{S*0.2023},{S*0.0019}
{S*0.3671},{S*0.1641}
{S*0.3121},{S*0.3922}
-{S*0.1758},-{S*0.1941}
-{S*0.57738},-{S*0.2208}
-{S*0.61535},{S*0.2477}
{S*0.15295},{S*0.0562}
{S*0.15465},-{S*0.1105}
{S*0.31455},-{S*0.112}
{S*0.016},-{S*0.0019}
{S*0.2499},{S*0.1257}
{S*0.2494},{S*0.2768}
-{S*0.0012},{S*0.1433}
-{S*0.1263},{S*0.2581}
-{S*0.2935},{S*0.2538}
-{S*0.1672},-{S*0.0046}
-{S*0.1217},-{S*0.1679}
-{S*0.26624},-{S*0.1439}
-{S*0.08877},{S*0.3546}
{S*0.26674},{S*0.5856}
{S*0.57344},{S*0.3659}
-{S*0.1887},{S*0.4147}
-{S*0.1255},{S*0.984}
{S*0.2213},{S*1.1611}
{S*0.3468},-{S*0.1771}
{S*0.4173},-{S*0.7464}
{S*0.2285},-{S*1.1611}
{S*0.3068},{S*0.2197}
{S*0.6623},-{S*0.0113}
{S*0.5735},-{S*0.3659}
-{S*0.1446},-{S*0.024}
-{S*0.099},{S*0.1393}
-{S*0.2664},{S*0.1439}
-{S*0.167},{S*0.0043}
-{S*0.2928},-{S*0.1105}
-{S*0.2934},-{S*0.2538}',
'vallikoro' => '*:{S*2}:-:-:l-{S/4},-{S/4} {S*0.75},-{S} {S*0.75},{S} -{S/2},{S/2} {S*0.75},{S} {S*0.75},-{S} -{S/4},-{S/4}:O1',
'hakulikoro' => '*:{S*1.5}:-:-:l-{S/8},-{S/2} {S/2},-{S/2} {S/2},{S/2} -{S/4},{S} {S/2},{S/2} {S/2},-{S/2} -{S/8},-{S/2}:O1',
'ristikoro' => '*:{S*2}:-:-:v-{S/2}h{S/2}v-{S/2}h{S/2}v{S/2}h{S/2}v{S/2}h-{S/2}v{S/2}h{S/2}v{S/2}h{S/2}v-{S/2}h{S/2}v-{S/2}h-{S/2}:O1',
'dancetty' => '*:{S*4}:i:i:l{S*2},-{S*2} {S*2},{S*2}:R1',
'dancetty-floretty' => '*:160:-:-:l32.7,-52.1 c 0,0 -11.4,-7.2 -30,14.3 -3.371,-32.4 21.5,-30.1 32.2,-22.2 10.7,7.8 -29.84,-18 5.4,-43 35.3,25 -5.2,50.8 5.5,43 10.7,-7.9 35.6,-10.2 32.2,22.2 -18.6,-21.5 -30,-14.3 -30,-14.3 21.6,34.8 43.1,69.6 65,104.2 0,0 -12,7.2 -30.3,-14.3 -3.4,32.4 21.3,30.1 32.3,22.2 11,-7.8 -29.9,18 5,43 36,-25 -5,-50.8 6,-43 11,7.9 35,10.2 32,-22.2 -19,21.5 -30,14.3 -30,14.3 l32,-52.1',
'double-arched' => '2:{D/2}:i:i:q {D/4},-{S*2} {D/2},0:R1',
// 'dovetailed' => '*:{S*2}:i:i:l{S*0.95},0 -{S*0.9},-{S} {S*1.9},0 -{S*0.9},{S} {S*0.95},0',
'dovetailed' => '*:{S*4}:i:i:l{S*1.9},0 -{S*1.8},-{S*2} {S*3.8},0 -{S*1.8},{S*2} {S*1.9},0',
'embattled' => '*:{S*4}:i:i:h{S}v-{S}h{S*2}v{S}h{S}:U1',
// 'engrailed' => '*:{S*2}:o:o:a{S*2},{S*5},0,0,0 {S*2},0',
'engrailed' => '*:{S*4}:o:o:a{S*4},{S*10},0,0,0 {S*4},0',
'escartelly' => '0:{S*2}:i:i:v-{S}h{S*2}v{S}:R1',
// 'indented' => '*:{S*2}:-:-:l{S/2},-{S/2} {S},{S} {S/2},-{S/2}',
'indented' => '*:{S*4}:-:-:l{S},-{S} {S*2},{S*2} {S},-{S}',
// 'invected' => '*:{S*2}:i:i:a{S*2},{S*5},0,0,1,{S*2},0',
'invected' => '*:{S*4}:i:i:a{S*4},{S*10},0,0,1,{S*4},0',
'nebuly' => '*:{S*3.5}:-:-:a{S*0.95},{S/2},0,1,0,{S*0.95},0a{S*0.95},{S/2},0,1,1,{S*0.95},0a{S*0.95},{S/2},0,1,0,{S*0.95},0a{S*0.95},{S/2},0,1,1,{S*0.95},0',
'none' => '0:{D}:-:-:h{D}', // dummy values, not actually used
'nowy' => '0:{S*3}:i:i:q{S*1.5},-{S*2} {S*3},0:R1',
// 'potenty' => '*:{S*2}:-:-:h-{S/2}v-{S/2}h{S*1.5}v{S/2}h-{S/2}v{S/2}h{S*1.5}v-{S/2}',
'potenty' => '*:{S*4}:-:-:h-{S}v-{S}h{S*3}v{S}h-{S}v{S}h{S*3}v-{S}',
// 'raguly' => '*:{S*2}:i:i:l{S*0.5},0 -{S*0.2},-{S} {S},0 {S*0.2},{S} {S*0.5},0',
'raguly' => '*:{S*4}:i:i:l{S},0 -{S*0.4},-{S*2} {S*2},0 {S*0.4},{S*2} {S},0',
// 'rayonny' => '*:{S}:o:o:a{S/4},{S*0.4}-30,0,0,{S/4},{S/2}a{S/4},{S*0.4}-30,0,1,{S/4},{S/2}a{S/4},{S*0.4},30,0,0,{S/4},-{S/2}a{S/4},{S*0.4},30,0,1,{S/4},-{S/2}',
'rayonny' => '*:{S*2}:o:o:a{S/2},{S*0.8}-30,0,0,{S/2},{S}a{S/2},{S*0.8}-30,0,1,{S/2},{S}a{S/2},{S*0.8},30,0,0,{S/2},-{S}a{S/2},{S*0.8},30,0,1,{S/2},-{S}',
'urdy' => '*:{S*2}:-:-:v{S/2}l{S/2},{S/2} l{S/2},-{S/2}v-{S}l{S/2},-{S/2} l{S/2},{S/2}v{S/2}',
'wavy' => '*:{S*3}:-:-:q{S*0.75},-{S} {S*1.5},0 q{S*0.75},{S} {S*1.5},0',
'twigged' => '*:{S*1.5}:-:-:
l-{S/4},-{S/4}
c-{S/8},-{S/8} {S/8},-{S*0.375} {S/4},-{S/4}
l{S*0.198},{S*0.198}
l0,-{S*0.544}
c0,-{S*0.177} {S*0.354},-{S*0.177} {S*0.354},0
l0,{S*0.544}
l{S*0.198},-{S*0.198}
c{S/8},-{S/8} {S*0.375},{S*0.177} {S/4},{S/4}
l-{S/2},{S/2}
c-{S/8},{S/8} {S/8},{S*0.375} {S/4},{S/4}
l{S*0.198},-{S*0.198}
l0,{S*0.544}
c0,{S*0.177} {S*0.354},{S*0.177} {S*0.354},0
l0,-{S*0.544}
l{S*0.198},{S*0.198}
c{S/8},{S/8} {S*0.375},-{S/8} {S/4},-{S/4}
l-{S/4},-{S/4}
',
'erable' => '*:{S*2.1}:-:-:l{S*0.90},0
0,{S*-0.30}
{S*-0.4},{S*0.10}
{S*0.10},{S*-0.2}
{S*-0.25},{S*-0.30}
{S*0.10},{S*-0.10}
{S*-0.2},{S*-0.30}
{S*0.30},{S*-0.10}
{S*0.30},{S*0.10}
{S*-0.2},{S*-0.4}
{S*0.2},{S*0.10}
{S*0.30},{S*-0.30}
{S*0.30},{S*0.30}
{S*0.2},{S*-0.10}
{S*-0.2},{S*0.4}
{S*0.30},{S*-0.10}
{S*0.30},{S*0.10}
{S*-0.2},{S*0.30}
{S*0.10},{S*0.10}
{S*-0.25},{S*0.30}
{S*0.10},{S*0.2}
{S*-0.4},{S*-0.10}
0,{S*0.30}
{S*0.90},0
0,{S*0.30}
{S*-0.4},{S*-0.10}
{S*0.10},{S*0.2}
{S*-0.25},{S*0.30}
{S*0.10},{S*0.10}
{S*-0.2},{S*0.30}
{S*0.30},{S*0.10}
{S*0.30},{S*-0.10}
{S*-0.2},{S*0.4}
{S*0.2},{S*-0.10}
{S*0.30},{S*0.30}
{S*0.30},{S*-0.30}
{S*0.2},{S*0.10}
{S*-0.2},{S*-0.4}
{S*0.30},{S*0.10}
{S*0.30},{S*-0.10}
{S*-0.2},{S*-0.30}
{S*0.10},{S*-0.10}
{S*-0.25},{S*-0.30}
{S*0.10},{S*-0.2}
{S*-0.4},{S*0.10}
0,{S*-0.30}',
// {S*0.90},0',
'meander' => '*:{S*2}:-:-:
h{S*1.75}v-{S*1.5}h-{S*1.25}
v{S}h{S*0.75}v-{S*0.5}
h-{S*0.25}v{S*0.25}h-{S*0.25}
v-{S*0.5}h{S*0.75}v{S}
h-{S*1.25}v-{S*1.5}h{S*1.75}
v{S*1.75}'
// 'meander' => '*:{S}:-:-:
// h{S*0.875}v-{S*0.75}h-{S*0.625}
// v{S*0.5}h{S*0.375}v-{S*0.25}
// h-{S*0.125}v{S*0.125}h-{S*0.125}
// v-{S*0.25}h{S*0.375}v{S*0.5}
// h-{S*0.625}v-{S*0.75}h{S*0.875}
// v{S*0.875}'
);
$xmlHead = <<<END1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
viewBox="0 0 1000 1200"
width="1000"
height="1200"
preserveAspectRatio="xMidYMid meet"
version="1.1">
END1;
foreach($lineSpecs as $name => $lineSpec) {
$output = $xmlHead;
$subArg = 60;
$lineSpec = preg_replace_callback('/{S.*?}/', 'subFunc', $lineSpec);
list($repeat,$length,$defaultStart,$defaultEnd,$spec,$options) = explode(':',$lineSpec . ': ' ); // options are optional(!)
$output .= "<path stroke-width=\"1\" fill=\"none\" stroke=\"black\" d=\"M0,0 ";
$subArg = 200;
$path = preg_replace_callback('/{D.*?}/', 'subFunc', $spec);
$output .= $path . "\" />\n</svg>\n";
file_put_contents('edges/' . $name . ".svg", $output);
}
}
makeEdges();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment