目標は、以下の仕様に従って、ユーロ(ユーロ)記号付きの画像を出力または表示することです(記号の境界は無視します)。
ソース:http : //en.wikipedia.org/wiki/File : Euro_Construction.svg
ルール:
目標は、以下の仕様に従って、ユーロ(ユーロ)記号付きの画像を出力または表示することです(記号の境界は無視します)。
ソース:http : //en.wikipedia.org/wiki/File : Euro_Construction.svg
ルール:
回答:
(プログラムの場合は96、コマンドラインスイッチのプレフィックスの場合は4)
完全にゴルフとハンドトークン化:
$ hexdump -C euro.ps
00000000 68 20 88 78 92 36 92 38 92 8b 88 4b 88 3c 92 ad |h .x.6.8...K.<..|
00000010 88 00 88 00 88 3c 88 2d 88 ce 92 05 88 00 88 00 |.....<.-........|
00000020 88 32 88 d8 88 28 92 06 92 16 88 b9 88 fb 92 6b |.2...(.........k|
00000030 88 b5 88 f1 92 63 88 13 88 f1 92 63 88 17 88 fb |.....c.....c....|
00000040 92 63 92 16 88 b9 88 0f 92 6b 88 b5 88 05 92 63 |.c.......k.....c|
00000050 88 1b 88 05 92 63 88 1f 88 0f 92 63 92 16 92 42 |.....c.....c...B|
00000060
独自の表示用に、ここからコピーを入手できます。
@ThomasWの答えを見て、自分のプログラムを注意深く検討した後、私はそれをさらに改善できることに気付きました。
トークン化されたバージョンはこれと同等です:
h 120 div dup scale
75 60 translate
0 0 60 45 -50 arc
0 0 50 -40 40 arcn
closepath
-71 -5 moveto
-75 -15 lineto
19 -15 lineto
23 -5 lineto
closepath
-71 15 moveto
-75 5 lineto
27 5 lineto
31 15 lineto
closepath
fill
最適化の説明:
まず、最初のソリューションを、全体を囲む1つのパスではなく、より単純なサブパスの結合に変換しました。私はトーマスのパラメータ入力方法を借りましたが、これは私が持っていた方法よりもはるかに優れています。
次に、すべての座標に10を掛け、すべてを四捨五入して、整数の座標だけにしました。また、角度を四捨五入し、2つの大きな角度を同等の負の角度に変換しました。これにより、すべての数値が-128〜127の範囲に収まります。
そして、私はすべてをトークン化しました。各演算子は、それぞれ2バイトのシーケンスで表すことができます。また、各数値は単一の符号付きバイトで表すことができるため、各数値も 2バイトのみになります。私がそれを行うことができなかった唯一の部分h
は開始時でしたが、それも2バイトだけで、h
その後にスペースがあります。
次のように実行します。
gs -dh=200 euro.ps
gs -dh=80 euro.ps
gs -dh=20 euro.ps
エンコードされたユーザーパスを使用して、プログラムサイズを数バイト減らすことができました。これらの各プログラムは最初のものと同等であり、同一の出力を生成します。
92バイト:
hexdump -C euro.ps
00000000 68 20 88 78 92 36 92 38 92 8b 88 4b 88 3c 92 ad |h .x.6.8...K.<..|
00000010 7b 7b 88 b5 88 c4 88 2d 88 3c 30 20 30 88 3c 88 |{{.....-.<0 0.<.|
00000020 2d 88 cf 30 20 30 88 32 88 d8 88 28 88 b9 88 fb |-..0 0.2...(....|
00000030 88 b5 88 f1 88 13 88 f1 88 17 88 fb 88 b9 88 0f |................|
00000040 88 b5 35 88 1b 35 88 1f 88 0f 7d 8e 0b 00 07 08 |..5..5....}.....|
00000050 0a 01 23 03 0a 01 23 03 0a 7d 92 b3 |..#...#..}..|
0000005c
次と同等です:
h 120 div dup scale
75 60 translate
{
{-75 -60 45 60
0 0 60 45 -50
0 0 50 -40 40
-71 -5
-75 -15
19 -15
23 -5
-71 15
-75 5
27 5
31 15}
<00 07 08 0A 01 03 03 03 0A 01 03 03 03 0A>
} ufill
そして、わずかに直感に反する混乱を招く解決策は、たった91人でもう1人のキャラクターを節約します。
$ hexdump -C euro.ps
00000000 68 20 88 78 92 36 92 38 92 8b 88 4b 88 3c 92 ad |h .x.6.8...K.<..|
00000010 5b 5b 8e 1e b5 c4 2d 3c 00 00 3c 2d ce 00 00 32 |[[....-<..<-...2|
00000020 d8 28 b9 fb b5 f1 13 f1 17 fb b9 0f b5 05 1b 05 |.(..............|
00000030 1f 0f 7b 92 38 88 7f 92 50 7b 32 35 36 92 a9 7d |..{.8...P{256..}|
00000040 92 54 7d 92 49 5d 92 32 8e 0b 00 07 08 0a 01 23 |.T}.I].2.......#|
00000050 03 0a 01 23 03 0a 5d 92 32 92 b3 |...#..].2..|
0000005b
次と同等です:
h 120 div dup scale
75 60 translate
[
[
<b5 c4 2d 3c
00 00 3c 2d ce
00 00 32 d8 28
b9 fb
b5 f1
13 f1
17 fb
b9 0f
b5 05
1b 05
1f 0f> {dup 127 gt {256 sub} if} forall
] cvx
<00 07 08 0A 01 23 03 0A 01 23 03 0A>
] cvx
ufill
h
バイナリトークンは自己区切りであるため、その後にスペースは必要ありません。ところで、どのようにコーディングしましたか?標準の16進エディタでそれを行いましたが、これは面倒です。
イェーイ、数学!特定の(やや複雑な)不等式を満たす領域をプロットしています。
e=RegionPlot[(1<Abs@y<3||c)&&{x,y+12}.(d=2{-5Sin@40°-6,m=5Cos@40°})*{x+15,y+1-2Sign@y}.d<0||c&&x<2m/.c->100<x^2+y^2<144,{x,-15,9},{y,-12,12},Frame->0>1,ImageSize->#]&
使用法はe[height]
、たとえばe[100]
:
またはe[200]
:
鋭いエッジがわずかに丸みを帯びていることに気付くかもしれません。これは、領域は空間内の点をサンプリングすることによってのみプロットでき、Mathematicaはデフォルトでは各ピクセルをサンプリングしないためです。サンプリング解像度はPlotPoints->#
、14文字を追加する別のオプション(ピクセルごとに1つのサンプルを使用)を追加することで増加できます 。このオプションを使用して実行することはお勧めしません。実行時間が大幅に増加し、視覚的な魅力がほとんど向上し#/4
ないからです。したがって、(OPの承認後)スコアには含まれません。
以下は、わずかに未使用のバージョンです。
e[height_] := (
angle = 40°;
d = {-5 Sin[angle] - 6, 5 Cos[angle]};
RegionPlot[
(Abs[y] > .5 && Abs[y] < 1.5
||
r > 25 && r < 36)
&&
{x, y + 6}.d > 0
&&
{x + 7.5, y + .5 - Sign[y]}.d < 0
||
r > 25 && r < 36 && x < 5 Cos[angle]
/. r -> x^2 + y^2
,
{x, -7.5, 4.5},
{y, -6, 6},
Frame -> False,
ImageSize -> height
]
);
ゴルフバージョンでは、.5
s を避けるために座標系を2倍にスケーリングしましたが、文字数は実際には同じであることがわかります。
ここで、私が式をどのように計算したかについて説明します。シェイプを2つの領域に分割しました。一つはリングとストライプが含まれており、右側に遮断さBCDE
と傾きと左IJ
及びGH
傾斜(すなわち後でより)。もう1つは同じリングを含んでいますが、単純にpointのx座標で切断されていD
ます。2つの領域の条件はで結合され||
、ここで集合和として機能します。
リングは、と定義されています5 < r < 6
。ここr
で、は原点からの距離です。r²
でも簡単に解決できる(x²+y²
)ので25 < x² + y² < 36
、リング内のすべてのポイントを取得するために使用しています。
ストライプが間にある±.5
と±1.5
。yのモジュラスを取得することにより、両方のストライプを同時に処理できるため、(無限の長さの)ストライプはを満たすだけ.5 < |y| < 1.5
です。繰り返しますが、ストライプとリングの結合を取るために、私はただ使用してい||
ます。
興味深いのは、おそらく「マスク」を取得する方法です。ポイントD
のx座標は5 cos 40°
なので、下端を処理するマスク(リングのみと組み合わせる)はjust x < 5 cos 40°
です。これは&&
、論理的に変換される集合交差を介して適用できます。
他のマスクは本当にトリッキーな部分です。まず、の勾配を取得しましょうBCDE
。私たちは、簡単にポイントを構築することができますC
し、D
など(0, -6)
と5 (cos 40°, sin 40°)
それぞれ。その場合、線に沿って指すベクトルはちょうどD - C = (5 cos 40°, 5 sin 40° + 6)
です。マスクを右側に適用するには、ポイントがそのラインの左側にあるか右側にあるかを判断するだけです(ラインベクトルを呼び出しましょうp
)。これを理解C
するには、関心のあるポイントからベクトルを取り、それをに垂直なベクトルに投影しp
ます。投影のサインは、ポイントのある側を教えてくれます。2Dでの垂直ベクトルの取得は非常に簡単です。座標を反転し、いずれかの符号を反転します。それd
は私のコードの変数です:(-5 sin 40° - 6, 5 cos 40°)
。からC
関心のあるポイントまでのベクトルq = (x, y)
はq - C = (x, y + 6)
です。突起は、間単に内積(又はドット積)であるq
とd
。私がd
それを選んだ方法はたまたま左を指しているので、欲しいd.(q-C) > 0
。この条件は、右側のマスクを適用します。
左手のマスクについては、基本的に同じ考えを使用できます。勾配は同じであるため、同じですd
。fromの代わりにストライプの左下隅からポイントをオフセットするだけですC
。それらには座標(-7.5, 0.5)
(上のストライプ)と(-7.5, -1.5)
(下のストライプ)があります。そのため、2つのストライプに対して2つの独立したルールが必要になります。ただし、下のマスクの影響を受けるすべてのポイントは下のストライプにあるため、負のyを持つことに注意してください。また、上部マスクの影響を受けるすべてのポイントには、正のyがあります。したがって、正と負のSign[y]
どちらを使用してオフセットを切り替えることができます。だから私のオフセットポイントは1
-1
y
(-7.5, -0.5 + Sign[y])
。それ以外の場合、マスクは右側のマスクと同じように機能します。もちろん、今回は予測が負である必要があります。したがって、単純にそれは次のようなものになりますRH-projection > 0 && LH-projection < 0
(これは元々コードに含まれていたものでもあります)。しかし、正と負の数を乗算すると、負の数を与えることがあるため、私たちは、これを短縮することができますので、それだけだRH * LH < 0
(どこRH
とLH
各突起しています)。
それでおしまい。すべてをまとめると、次の論理構造になります。
(
(is_in_circle || is_in_stripe)
&&
is_between_left_and_right_mask
)
||
(
is_in_circle && left_of_edge
)
明確にするために、私の説明の座標は、チャレンジで与えられた構造図を参照しています。上記のように、私のコードは実際にそれらすべてを乗算します2
-バイトを節約するためにそれを変更しましたが、バイト数は実際には同じであり、変更を元に戻すことはできませんでした。整数も見栄えが良い。
RegionPlot
、与えられた条件を満たす空間内のすべての点を単純に色付けする呼び出しです。したがって、それx^2+y^2<1
を与えると単位円が描かれます。ただし、実際の数学の説明を追加します(今晩)。
INPUTh:w=h/12s=w/2.4p=25VDU22,6,29,640;400;p,4,0;1.5*w;p,153,6*w;0;p,4,0;1.5*w;p,159,h/3.1;4.7*w;p;9*s;9*w;p,87,h/3.1;-19*w;p,4,-7.5*w;0;p;s;w;p,85,4.5*s;0;p,81,s;w;p;s;w;p;s;w;p,85,-7.5*w;2*w;p,81,s;w;
http://www.bbcbasic.co.uk/bbcwin/bbcwin.htmlからエミュレータをダウンロードしてください
BBCベーシックでは、すべてのグラフィックスはマシン固有のASCII制御文字を使用して低レベルで処理されます(ただし、一部の高レベルコマンドは一般的なものにも便利です)。ここで使用されるものは22(表示モードの変更)29(変更原点)および25、PLOTステートメントに相当し、XおよびYパラメーターの前に追加のアクションパラメーター(背景/前景に相対/絶対移動で線、円、三角形などを描く)を取ります。
したがって、私がしなければならないことは、VDUコントローラーに大量のキャラクターを送信することだけです。セミコロンで終了する値は16ビットです。その他は8ビットです。VDUコントローラに送信される合計バイト数は91です。ただし、その段階ではサイズがハードコーディングされているため、それ自体は回答とはなりません。
原点の明白な場所は円の中心ですが、実際にはバーの作成に関係するコマンドがさらにあります。そのため、原点を下のバーの下部に1.5シフトし、必要な分数と負の数を減らしました。これは、円の中心を持つ垂直線上に残ります。これは、線Eがこの垂直線から始まるため重要です。
実際には、図面から3つの数値を計算するだけで済みました。Cシェイプの上部内側コーナー(5 cos 40、5 sin 40 + 1.5)=(3.8302,3.1394 + 1.5)=約(12 / 3.1、4.6)および線の勾配E:x / y = 3.8302 /(6 + 3.1394)= 0.4157 =約1 / 2.4
無料の評価版(解釈済み)しか持っていないので、ユーザー入力としてシンボルの高さを使用します。フルバージョン(29.99GBP)を購入した場合、コンパイルしてからコマンドラインを読むことができますw=VAL(@cmd$)/12
。
未ゴルフコード
ゴルフコードにはVDUステートメントが1つしかありませんが、ゴルフコードでは、わかりやすくするためにいくつかに分けています。また、BBCベーシックはリトルエンディアンであるため、この組み合わせp,0,
をゴルフに使用することはできますp;
が、わかりやすくするために、私はそのままにしておきました。
INPUT h
w=h/12 :REM w is the width of the line, which is 1/12 the height of the symbol, hardcoded at 900.
s=w/2.4 :REM s/w is the gradient x/y of line E. s is the horizontal offset of the top and bottom of the ends of horizontal bars
p=25 :REM VDU p,action,x;y; is the equivalent of PLOT action,x,y
VDU 22,6 :REM change mode
VDU 29,640;400; :REM set origin
VDU p,4,0;1.5*w; :REM move to centre of circle
VDU p,153,6*w;0; :REM draw circle in foreground colour
VDU p,4,0;1.5*w; :REM move to centre of circle
VDU p,159,h/3.1;4.6*w; :REM draw circle in background colour, ending at the upper inner point of the C shape.
VDU p,0,9*s;9*w; :REM move relative along slant gradient, 9 spaces in y direction, to define the upper cut on the circle
VDU p,87,h/3.1;-19*w; :REM draw triangle in background colour, based on the last two points and the absolute point specified here (vertical line for lower cut)
VDU p,4,-7.5*w;0; :REM move absolute to bottom left of lower bar
VDU p,0,s;w; :REM move relative to top left of lower bar
VDU p,85,4.5*s;0; :REM draw triangle to bottom right corner of lower bar (absolute)
VDU p,81,s;w; :REM draw triangle to top right of lower bar (relative)
VDU p,0,s;w; :REM move relative to bottom right of upper bar
VDU p,0,s;w; :REM move relative to top right of upper bar
VDU p,85,-7.5*w;2*w; :REM draw triangle to bottom left of upper bar (absolute)
VDU p,81,s;w; :REM draw triangle to top left of upper bar (relative)
n
、次のように、ASCII文字を8x8ビットマップでユーロ記号に再定義できますVDU 23,n,30,33,120,32,120,30,30,0
。ウィキペディアによると、BBC Basicは、主にモバイルデバイス向けにまだ開発中です。
VDU 23,n,30,33,124,32,120,33,30,0
。メモリレーンを下る旅に感謝します。
<svg viewBox=-7.5,-6,12,12
onload=this.style.height=prompt()><clipPath
id=c><path
d=M5-6,1.8,1.5,3.8,3.2V6H-9.4L-7.1,.5-7.5-.5-5.2-6>
</clipPath><g
clip-path=url(#c) fill=none stroke=#000><circle
r=5.5 /><path
d=M-8,1h15M-8-1h15>
これはSVGのみを使用していますが、緩やかなHTML解析に大きく依存しており、HTMLとして提供する必要があります。厳密なSVGには、さらに多くのバイトが必要です。
</svg>
。ああ、そのマークアップは恐ろしいです。あなたが自分を恥じていることを願っています。;-)
</svg>
、線ではなく円だけが表示されます(マークアップJS Bin内ではなく、スタンドアロンファイルに追加される可能性があります)。
evt.target
してthis
、6バイト節約できます。
<style>*,:after,:before{position:absolute;width:20;content:"";background:#fff}#a{margin:150;height:20;border:2px solid;border-radius:20px}#a:after{width:10;height:10;bottom:0;right:-8}p{top:7;left:-6;width:29;height:2;border:solid;border-width:2 0;transform:skewX(-23deg);margin:0;background:0}p:before{width:2;height:4;bottom:-3;left:-.5}p:after{width:16;height:16;bottom:-3;right:-8}</style><div id=a><p><script>document.getElementById('a').style.transform='scale('+(prompt()/24)+')'</script>
公正な最小の答えではありませんが、すべてのcss-minification-fuを呼び出したときにも得ることができるほど小さい
すべての「px」が取り除かれた上記のコードは、FirefoxとIEでは機能しますが、ChromeとSafariでは機能しません。
また、jsfiddleを機能させるためにpxを再度追加する必要がありました。
100:
200:
<style>
*,:after,:before{
position:absolute;
width:20;
content:"";
background:#fff
}
#a{
margin:150;
height:20;
border:2px solid;
border-radius:20px
}
#a:after{
width:10;
height:10;
bottom:0;
right:-8
}
p{
top:7;
left:-6;
width:29;
height:2;
border:solid;
border-width:2 0;
transform:skewX(-23deg);
margin:0;
background:0
}
p:before{
width:2;
height:4;
bottom:-3;
left:-.5
}
p:after{
width:16;
height:16;
bottom:-3;
right:-8
}
</style>
<div id=a><p>
<script>
document.getElementById('a').style.transform='scale('+(prompt()/24)+')'
</script>
skewX
トリックは、私の賛成票を独り占めする可能性があります。
getElementById
すると、6文字が削減されます。その後、あなたは2より減らすためにCSSのIDを使用することができます
p
終了タグは、その後にコンテンツがなくなる場合は省略できます(仕様により)。また、ブラウザが自動クローズするかどうかも確認しますdiv
(仕様では禁止されていますが、FFのフィドルで動作しました)
バイナリトークンを使用した完全なゴルフバージョン:
$ hexdump -C euro_golfed.ps
00000000 68 20 31 32 20 92 36 92 38 92 8b 37 2e 35 20 36 |h 12 .6.8..7.5 6|
00000010 92 ad 35 20 36 0a 31 2e 38 20 2d 31 2e 35 0a 33 |..5 6.1.8 -1.5.3|
00000020 2e 38 20 2d 33 2e 32 0a 33 2e 38 20 2d 36 0a 2d |.8 -3.2.3.8 -6.-|
00000030 39 2e 34 20 2d 36 0a 2d 37 2e 31 20 2d 2e 35 0a |9.4 -6.-7.1 -.5.|
00000040 2d 37 2e 35 20 2e 35 0a 2d 35 2e 32 20 36 92 6b |-7.5 .5.-5.2 6.k|
00000050 37 7b 92 63 7d 92 83 35 2e 35 92 14 30 92 6f 2d |7{.c}..5.5..0.o-|
00000060 38 20 2d 31 0a 2d 38 20 31 92 6b 32 7b 31 35 20 |8 -1.-8 1.k2{15 |
00000070 30 92 85 92 6b 7d 92 83 30 20 30 20 35 2e 35 20 |0...k}..0 0 5.5 |
00000080 30 20 33 36 30 92 05 92 a7 |0 360....|
00000089
ASCIIバージョン:
h 12 div dup scale
7.5 6 translate
5 6
1.8 -1.5
3.8 -3.2
3.8 -6
-9.4 -6
-7.1 -.5
-7.5 .5
-5.2 6
moveto
7{lineto}repeat
clip newpath
5.5 0
-8 -1
-8 1
moveto
2{15 0 rlineto moveto}repeat
0 0 5.5 0 360 arc
stroke
名前を付けて保存しeuro.ps
、Ghostscriptで実行
gs -dh=80 euro.ps
gs -dh=20 euro.ps
PostScriptにはピクセルのようなものはないので、その高さは代わりにポイントで解釈されます。コマンドラインでスイッチの+6を計算しました。
DC
ラインが水平方向のストライプを正しく切断しません。垂直ダウンからD
同じことが、あまりにも、あなたのSVGの答えであるように見える:(下、適切な場所で「円」形状をカットしていません。。
import turtle,sys
from math import *
q=sqrt
h=int(sys.argv[1])/24
t=turtle.Turtle()
z=t.begin_fill
y=t.end_fill
x=t.goto
w=t.towards
v=t.fd
u=t.circle
r=t.seth
o=t.setx
n=t.xcor
t.pu()
x(10*h,0)
t.left(90)
t.circle(10*h,40)
z()
A=w(0,-12*h)
B=2/sin(A*pi/180)
u(10*h,280)
r(-90)
C=n()/h
v((q(144-C*C)-q(100-C*C))*h)
D=w(0,0)
r(D+90)
u(-12*h,D+135.42)
y()
F=2*pi/9
G=h*cos(F)/(5*sin(F)+6)
x(45*G,-3*h)
z()
o(-15*h)
r(A)
v(B*h)
o(45*G+15*h+n())
y()
x(65*G,h)
z()
o(-15*h)
r(A)
v(B*h)
o(65*G+15*h+n())
y()
t.ht()
input()
python % 100
そしてpython % 500
それぞれ:
c
一度しか使用しないので、実際にはそれをとして呼び出すだけで短くなりmath.cos
ます。おそらく、全長を短縮するために省略できないものが他にもあると思います。
from math import *
ドロップすることにより、6文字を削減できmath.
ます。
u=t.circle
が、数行後にt.circle(...)
コールを交換するのを忘れました。
(編集:どうやらIJとGHはBCDEと並行しているようです。現在修正済みです)
このスクリプトはSVG画像を出力しますがtext/html
、デフォルトで提供します。ほとんどのブラウザは、これを埋め込みSVG画像を含むHTML Webページとして扱うと思います。とにかく私にとってはうまくいくようです。
画像の高さはクエリ文字列パラメーターとして渡されます。(注:バイトカウントには、3行目の末尾に改行文字が含まれています。これは、これが適切に機能するために必要です)。
<?php $x=$_GET['x']/12;$a=$x*5;$b=$x*6;$c=$x*7;$d=$x*12.4884;$e=$x*2.2863;$f=$x*5.5;$g=$x*.4157;$h=$x*6.5;$i=$x*7.5;$j=$x*12;$k=$x*11.3302;$l=$x*9.1628;$m=$x*8;$s=$x*12;echo<<<Q
<svg width="$s" height="$s"><clipPath id="c"><path d="M$d 0H$e L0 $f L$g $h L0 $i V$s H$k V$m H$l z"/></clipPath><g clip-path="url(#c)" fill="none" stroke="#000" stroke-width="$x"><circle cx="$i" cy="$b" r="$f"/><path d="M0 $a H$k M0 $c H$k"/></g></svg>
Q;
preg_replace_callback()
数値をスケーリングするはるかに効率的な方法です。このコードは、元のバージョンと同じ出力を生成します。(編集:Einacioのおかげでさらに削減)
<?php
echo preg_replace_callback('/[\d\.]+/',function($m){return$m[0]*$_GET['x']/12;},'<svg width=12 height=12><clipPath id=c><path d=M12.4884,0H2.2863L0,5.5,0.4157,6.5,0,7.5V12H11.3302V8H9.1628z /></clipPath><g clip-path=url(#c) fill=none stroke=black stroke-width=1><circle cx=7.5 cy=6 r=5.5 /><path d=M0,5H11M0,7H11 /></g></svg>');
euro.php?x = 60
euro.php?x = 200
width
height
ここでは不要です。またxmlns
、ほとんどのブラウザでレンダリングするためにを指定する必要があります(テスト済みのFirefoxおよびChrome。SVGの適切なMIMEタイプが送信されても、両方ともSVGではなくXMLとしてレンダリングします)。ideone.com/JkqVL0(369バイトソリューションのハードコードされたx値を削除)
text/html
ます。ChromeとFirefoxにはこれで問題はありませんが、Safariの方がややこしいことがわかりました。
text/html
と<svg>...
してHTMLファイルとして解釈されるsvg
必要はありません要素、xmlns
しかし必要ないwidth
とheight
。適切なが必要なSVGファイルの観点から考えていましたxmlns
。コードは問題ありません。
誰かがおそらくもっとうまくやれると思いますが、これから始めましょう。
echo /Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4H+YGLhdAB4Py4cR2M5mkQ+DHsr9ezPUf+m32igxdiVmIE0qCW1q9ylwOEETlQiK0Fsdk0viUoZ92eYvWaMHdwLoMvi6YDwnr8S/yxLAdptt59wmMVhiurpONaAjMQ9GMfk6S30qx7jrBFm5ec/+Hn3vgsK40Jb07a6/0rVXAFjJIovBtvKPxLBzhck8dVbcobncgkaX2KwqKMU/iP53UquQVeD8Nge+b3lxQ6sFl9unjQy8r1YpGcimh121n0ukvQ5j+QnWIWoLj0v3NigOOM277wOfPQkw0oxC6AA3EB18EbFisDx4CJQKfK9AGsEYoh+ILP4UnIQrlecXuly9QXblNneSkZ5FNB2XlHBxuYAPnkQl0SU/vOWtozgXSyYgwgGabdR0/K/2m8Tm9xiiqGe+HwD8zzaEOB1anMtUnFRupCUCjyl1QQ8Ca2QkLTEo7S7oPCYh6y2ztXdsIBWCvYEHa0OLIuX3t5s7DraSjYGlbiCQF0mJf4KFFBR5TXwUQxq2YHfhNHRitStzvemCYBAYNbQ3Jv6rVibvg54pYu9hdX0pqQsRABX39jyTDiizCbMOs/mFveZqDUT15nvIjsC1Z9i9fJFA1uHYgVZYZKXELaRD/umATW4sK5ADKUeoFzDYfozSjhVZMe8uZ2QnafbwCHdaDxMDq1qkabmhMV9Xa73iKNZlf/3AXXaQNe2zTLixO2UcXOgW7eJ2HrtOCXqSbWWSlDzDmycDelezms0hK7qleLNapDHZFuvr8MoVvuikKjkAX3Cc1DKnwS5wtWjn6wlx+5Q7LNQjS79ccEo9H/aPQ1mbPwekoefgMdFVYMKXImJV5EGn5p7cw1H/BScuwgzk9dV8vnpnVCz+HqeIG0wSXuBgipP548iAclUncu/NYqe3M5q19PXIsaSed44ScJn97yMdYbpjhb9J/34c1/1nIZMgFjAkAXbaOglmGTNC0VQo7/CubHyXy5OJTiyHqNUfskOTGP1A/Nla3Nag9gzKK7yiTimKbJCaZj5JcviByWuKguR/uAiDLHIAPFS9R96JeNYJEg9JyWjAMU2nSSS3AFDKpNIqNr3NLKd1BLo8JyPpnfCJswwgs1RjsjTk0McOTTeAKfEMhWlEXlNKcCV9eLunwwv7Xx5azMOUpO8KKZ5XBXZZafai1FbQqKY/0RRJ1sa6l/2YEq6hhNuiJ7KqrCM7pwXNFXUriO5o2tUWt/lgHOV0ronovl7yrPp5xUcAudDnNcZP6H9QoDiFjhidBOBsmObzQfCHlS+sMcN1t+sP3JLUxFv5jKCBFT+pjtGyugg4H8EKT4qz/V+LNEKR3FaS9SPxTq0k8sDo6PlxcRfXxkgyJ5stYsqVrLGmkeoGy0OTQ6y1lkmC5+Af9Oo2HvCvW4a4SBMobiZvsTNRzJxTh4k8drMHhYMkT8R+WGT2c9GvPmYwBSjh/NVxrT5twHKpjLB/ZsUU3+mGfkU+H49DNnHxXAla4UL3Ivp4GviWgl65SkyxfCIl678h+nIN07rvgGrSX7bt+wCvsKnIioXR+k7VYv88upJnIcjQepEtkZSCwwX81KTjdugGDt2NnWJM7wAWQjzx+wAOp1k5Lz3dEDpOXlsuOvTuNOY9b0FyBb8HF+cmWaRNKOvmbBvf4yITqthVM8PtKqYEJKwoTEm2ewAGTHcct8y7SMWnWjwdxiS9vFl2i1yWtpon54IY/uiyjyfm4HG1eO/zklccbKCkS5JnCNY1FfqKYxaGzAhjWOmuEgitjtnNJ9m1vFyllOaaWNal/otis6OD5pVG3xWbqgQVxCQZlpZcFlUvFGaQnGeDgGqzGb7mDNCMrMff+1PTjY/oKqPcwBEQl2e+aSYw/WKwJBnicO2G55kFDwfLZivL8Ye+Q1biPrJz6jUoJNVOM6jPCBQXB/1rtZiNIXcFi0oEmTs+rXPE1pijmYKWAac7+U+O00ZOHhKq+RvnpL7Hjim/stmcaDvuS2nMz6Yg8Zf0vhgtDz8OYLUWCSMMAomV8er77ODjjlRl8caLpkv6nO/kUoYoQKXztM+vQDcYujpwIJ95IoLQGrZ8niKRn3+NbfCmeSSPV3NczkBOkdZqa++NLFPV7WENQTNvlMwl8nhHbC7OIrkIitozEye0a7UevgQq4GcBYIRP4x0nMr58zoe0TqaCXL+jsfoeZitanO8y3tDCLGCLwhuuB1K4hMgy623pJCejc2UfB9XYPJqNgqm+GFFsPA1fuuypqQ7TTS/CUcT2iYxa/ksAvA0LhyYkHTll/vZoot06nt+JVnHShH3VJknmeiNku1ZBhq8gcZ3TcIuaNWEtK90P2Ah+CLIBA/k1oNlG289CeH+R5FyflWgV8XTiBDCcVC/zkiENYIW0ajAqvkBWuUvfgV+YEtmwPTVtE8oJu7IDDR5YN15OE4KWL0pnub2qOG/NAXcYxbHmS1sza6la4N+K17WInU/H7ol9INu7bH6WVZD097WHdjbi8UPHsbM88Jr9pmMPKPNlsDZD+ih154RWSLTVcjZA0jSzChqiNm0bW+0EszFDarF4tGauJtDqnRr+0t3QwC56VcRJzrCpJwkcp1NvIKHY11KRJ+mvA0x23KQijA2BPOICPYJ23z7CZLyoIkc51eXgjMVJbg3T1wrXtCMuhkwlcQ1rO8KVg3ajLk4dsyF27LaVjQFkxbHYIxhQXmRGgsMo2cO7bUuwLyYMEDKEQJgsDGj4KQIxLV+MVH5U9+ttKfBDuYc1ZKc1pVcnEWZ5vWRFHlCFfnD9Au0EIgfEu0hzx0e1JpXY73iOyahpo/yKj+FbKzVBPq99RLokDrlcOvBnG492+464GDCbQvdJQtbiYHU8bSHXLyMU38qh1IBlu0ecIKnfL426oKtyZ5TkAPaj5mELf15dRg8V5t2XL4UnjHzUryz1d3KfHcrO14AmP3Ne6YKUAXOx9H3f2xm6N9mEPvC2R9wGgvuTabZ4V9HcTR6EtjXDHzW/ZjrU0JgA5j1t8+6I4DX8mWqC1vQxUMLex5xnJm2vIcxBBf7QceJTTsKq4V0T0a6Mxc9rR9WnS9Yfma4c2Zg0voJqJ4AmkJI9IqWx5Z+WV8Ddfo0ybRM+zuOtBpWwN20Ipn/IEl+FgMp2vb9bJ60umzK6rx/KyfkcK1eT3UdS7ujlOUXSvSol5ctj8E+WEds7KSxZ6jaW33SitKUuhUOFCnE9/Uzg9DSyeSG6p3/TtymeYTUgzGFtHCRtEhQdqlmuLORmEi1WB7lDop+UaiVeZ8cdL8BUtzIrMhCYY+zbsexxUtYY0xUxRIVVGuvry/rZjwfJtIbHhsC0XvhX9ycR/kViYZYkfS240arLfwjxMtBGfpbKcY64hZOQnTA2jFIGZDWrF1frAZV94IYacIb5rIkwwp6+P3fP3kNQ5wMNXtiaJ7PiyWZUHijkNzaT2hkydrJ8cfO+m8N5OUsJPUIOZ/sa7Zx/HmHOGc6CWkSU9rJfCDLxXCTMGL9ubU6RX7Zr++sjXIFGWkVrflysVVdQ8n9ifEyFDeX/r8YoKj2S2T32/jACXwySEsd/rEoYgJcOnHo/NuLnk1LZxt6S9D8GUqy342fzhXaPL7+Xy53/j03+7YlooLsZH+oTtid0ijLlRtSFwQtlJa9uusHfP+GnBrJplJyunwnLTtQ+QC8BgXXB+p5cTiJ3BfYUco/yH+aFcRtQZ0IXRk0z0BN7A1R5fWcnBvgbjJJBNN2RB5MWqtRTctGPJeHPylI4j2Pa2K0qm5pGrFFWof8LcmsQGTtnGm5AUrGBCaVk0WxgZMY1Gqqls3UoeAy3+NWdXHJPz70I9vHvB+CiUhAzGs+B/9YPRrTpS9lMOioHRrRgM7k+WDOFhKs2ZPaxlWk7LqGpf8yISw0U0uYyXYFCJcLIeVYz5yKYGejVaKQEUQOvsxJf7E/SVHcG+o60pe0e0ONCub8ttIw17Cehy96JUO50bD62BkgtepSAg101mFMTo5EfvxSZ5mcJk1dQKRxR5pkHNlmUuPHdrBm/t1HgN/HQ37aNRYrZGWGRgUVMBgZoCHu6ZQ/NLtoFs75pxa8TDZ2N1KVngWCsUI0WT+ouyhRSixloz11fihaHRIaTS5VukEVcXosOzdhlka7YmhWxS0f0y7LfW1ugBxecKuSrBzsFa7hVM/iEYldMSR7ozzhhLGHRnVOc8yECM3CvEgE3qcS86jJA4+tjCW2CViftkQbVQ9xUJZeALqNF6bkFqknmwbiCVGkpNYjon4I46XPUl+7Fm8YLy2+VHTn2uMFhE9vGfqfgIS5PAyMttOB1iFxgljxRpQfI2jqwzEscF0v8IPVnZMrk6Otcrwq0kW27aR2NIElOBq/7Na5WlvFniNITn45BTSCNWm8ijx1VQR/cpRz0TlPwChXj1x6rACGII6hVWcd4MBWL/oOIGW/Yfj6CFuAU7hQrAH/Wk+YF6920XeFTTtzusQnqS/Ha4bE5tLZsPW0Bv53oFohSbBZexHufmkIO4wzfgEsH//T6X8vdCx70gDV5leqt+Wrpbkh6fo8IJptuGjnuH0oPUcTt5e/77Yn/PsPsjqjC7RQhSsDugi4GIbbEN7SdBbS69zg7NeN5lI53gZfN+mjcXCQzhC9J2DmYWmqhJ8XblMbAvcrARtQWBKZuOLSzgRkAToONyWndfTy/n/QpBJPJmF2KkUAncc9t4e8I5zdzClXBKQb6O1AIuDTs/M7mX/MdB2tHEqenLoOD+V9sTdT86Uub0BasAh0R5hvi2Iorm7llfPjy3aGbbogeN4J052oZx1aBTWTbUgX7vi2v6+ijQIMd4WnxYcIgebIZAZIHzjf+e28h3TXHyQIj4ExFH73KtUmbeEBmfmby8mGavm4SmmcMrVtlQflXYa1cpzm4ou9N31ARgxXMBNLbdmeWNSZ7Cjww8SX3ranoZGKofMJ/GUNEW4m/zyDyb9d7QPRIKYc56dWffu/7VhmlqAWrTJPNoi+vJSWe957pRibDGVaxcsHm36AVEffhabj3BsIkFnRGBozsQX+15QkpOqGy/gONQNdzQR7gdHDfo7XqhrbgvTwgNhXNITA39pWovQ+3izHtqSwQp6qKHa79WfPPVTYyZ0C97yUvOsRBWd9upeF6lIycXQYZyqx6YGB36HiyOZi2DNDGN457CZU+41UsLsbrliLrK5jVf8TiGjC/JcYZ6OZ8R2cASh1yK+746LUdQdQt2oRUZBuL5b5aMAuSyFM7AyTR/pL8vUYjGRAsO3jp1HLldgJPK8Sd8BzbbAza9FpPtvZfWXmgRhSqD6cH7hsG6p9579iOtJWNBNDJXnM8KZOICYFYvaiqSy+yFb55Xz4OBO+c9n1+Kru7DVpldr7D+3PZgrvwiVxy3pDC63pIzGkEkCyUNOVB2/a/3cjYgnBOI2rcMqnW4QOkvEjtG0LCQ99R5UJgxAovxs3mJvWI4MTPGVmOKC78jMaltZFSVOQJClEMbxsJ0ZiCBu3LlwKo+eYXfQ541G0+zBD6vGw8TVTwdx/Pv1UvGPOwJyoDJ4wwDxcxUvJgGTEOXS/Uf/VXJYcxPXi5K9bHGCXQx555XTkz63DxHXndKVDifbvW8uVOMLwr0RH36QeAXJmaeOIhUY80lDuvwHH5KSakMoknHbAqbzQRgYovZflW80b2FL1deHFmagseXjj7dQPwVlM6g+JbIH06PoRV/KLnzoTGx/XayzXOntWuNf6M+H8rDJwSTC8B+zGEe0PHPEWi7JmFTXpX5zE7wn3v5kHl9dq9yKof5IUUxOrQgErFxiZjDIptmjfaCiZ6j7gaNdfCLQvOOna4/Z65Nw9M1Uk+/BjrygmO2fansroWxBwCzGmQYHIaMko8+NYesi5Xr8zCptzh00NbPqclbr8Ifc20Uyr2oOcuNL//8mgrDUhw8YdGscmONcc7SgA52V5hh5M8cftXGgYUtyZCa7tmU3bCvBiQXhUA1c3pld8g1Isjncr6BvikWEDwZF5dGSNfnZcvcI/2hwEWhUbq12T3+a8fs9XWPHRHbJ3SCbJF6nGAMmyeDmOqKs41lmQdWwLcGhNicyhgfJrP+wHgnyUavSItqMXfAj/0b/jut1wzgcuxivQzARFCmbODeMCTljqSRIuAHEpC+OPXkz/eZFVRxq4+sIx5CnuDPnu+FAFBAJLlfy+B3gpDGSuHhJzxAVbBQASI6eAAkn0cjokCpBNEEhtOWihPzE37rlSBkFpA6W4/gyhqOQmS8AcyFkrK4DZERHy72p7p0pthswVZpebykXA6fqHw9qJtNzFS3A65Z+Fn4qIqZvxBKIfQDz3GnwnUs2uxZUubU5Dzx5vYVmXvs0WSbFD99m/iYyHWfgVi+SPxjoRW/wx6WEF966pDTwH1IAQhIpQcMO5SfdY51suPqlhquRTIyWnut+laWzca9A1rfj1ODW08jjvRk5zclGNhC6dIOU/2YRr52QIV6uDla4Fhk6P0cspyt4RKJPeazjhQ6iYw3QSgoPrxpcuGhwVKQfm4G3F0LHmuSNxJeMlP5KBACT6z/yyxpLONblrmLX7eoLEpuvuW2Oh2i3ap9NZm29p6f9iS24z91DKqbJoq7kI6D0QWQNPo+V2XvrcJ2LUbHiAysLzxcOoAELuDYqzkhEFTcC00vYHYbx22uHQ6BDmdHWD+pQxLsZI6cbRkKlrGanKXDJ4SzyWgIB6k729GDp7XA91FpBRQ8DVXeGIkzLHnSkYSHD9p5pwtBl9u2xxxmTVfriCDlmfeAKISOVNCWvI5GIaIWc2K2cokE/1ybo/ZCzCl4U7cuKS7mvFaDzcYhTfLfeOpS7DE/ikpG9at1Dx3XVlUKguskbKNYeiqvYctwxQwbzhcfZkDX3cFoZoYlZIT/QeRf+aUDCxDFdf9+ToFntaakEVsg3JJw4iplscbOyzxL9TErqGuEKDKYF6o0dIpco06a49C9ICOQUGxoMnhYHLfi8bo6g8egxWERk8Y/up9F2pnVdz3++jFAb9ODuWvbdOMepygUyIk8Cg6/AV2eBHR1gCvAd+x+b8mSqvnV9UqtQdzsDj5hZNzTERgSfEf9ZBBfwgRChD1Q+f2G0l4ZpYqoeOJVbH2BRubZN0peLfkv0FpydayYg/fxdafPq1DIprP3nDrn9BkPFRGZpmCmpJAF8SoPl+fX/w0a0FySW2ygWxrNwdR5EMNSFBAp/nLMaDZSQ9LxsskgiypkMpLvDt9VrzJs/hdSKv+JDHPuuUf17BWFwGTNg4OImamKEVYWbGXhAmf1NCnsCN41nuUrhYrKpucVerzYUBqwaAj83+W90UNh5jmz5EeZdkMYRE83ij1ClWzQVtwp08wGjX/MqZTVmF0gaJqoRa0BeBtBJGifEUnxfyN1RroM9g0Y7T7CNETwPkBCyMB/jQsFu2OaEzhToBg/0rIOScmuhRD4JSjsbgs5ynZm5ci1JUsbqq8HcBxO0HfnjxZ6wPQlT9hkfH6Ymva1n/XOhArB4l7GItVzvLg1ZImgTf8Nq0sn/nKEARVhSwkgwd791oZ/F9SBGbhU8+wk+x7OeZGIh3LJPVmGzbAPcfcK9WznajPvroiXT5l4MaqOd451yCOthi4BgBVadd8Bq9tNXhQ8AflUWHOUOm3EL90V/ARPFWu96Y325Dw8VwLh0751C5anEYmI7toxBwl0AmAaL9cHFFgLzVr93+8giYfgmcTywXw4tjZJAnIZmlhtBfikAyN9olQpFP7XFAY0KtYOHAeXX+hZPDdGixhaj/0LEHFIs3dNAUFLt+iup+iiDooquvX2ZKOU66j621MQhvML9qNo1EwtmzLyTG3UnSY0YHuifvbqdH+JE9OJAdFA4p7LhTPU3eB1QpXdNx3F/1Epx3EiC+o/uv0aTDj/zmppkPhcok7sxEn2cXkdkaauokaxz57ewlC5ErqzL0KhM5xYcsSM/u4Mi5/9errCGJfqoB9F4NVE12yj21mXv+kqYuakLcn2IE435bDkyf+20ChP3xTyIo5WP1elNQF+AsvZeqvNvthSGhiQfOxwMX1eklBCS0fSsfW77xT67D3G84cpu1tTZegdVEcpoy2fk97NbhNK+HIYH7Lp+qHyBXkdu0cRr6/lZScyUKnKmasdWGOXVgvRUNFOYzKebjyunfFKUJUmzZe9cKFOeZsrimtMzjD9DwAfZlWvP81onaxp9KBtAz4GLOayVxsunKhTQ1I5l3WOPSXPC6PLch/lvPEspFFyEck2FZSjtf1q61get5Iqlr8iNfaerYd0HIWFUTXxT+wnfcetSWnPl305yT6mebfUlCbDd0qH4bOUrzeLY7uH1271UexWAmweoRe6SQCfKdIPU1ufrhfohkIZ6YK0LR6PcJx0oXvtBHC6IiLEmW0c00qbvgRRr6esEUSt07playEseUbdyFSCxGdWdQBTQIvNT0hmUlw93+UwOqT9uMAe7cAkWtXJJVU4egAAdQxmf8BAFCwcLGxxGf7AgAAAAAEWVo=|base64 -d|unxz>e.svg;echo \<img src=e.svg height=$1\>>e.htm;firefox e.htm
$1
入力パラメーターによるものです。
<canvas id=c><script>_='function e,t,n){c.savtranslate,trotatn?0:.42)}v=docuEleById("c"c=vContex"2d"scalw=(v.width=v.height=promp))/12,w76,1arc(56--114.2,6,66-13,6.- 2,1 11.5)c.clearRec2restor-7mov-71lin6,.5,strokt( .5--e(0,);1,ment.geteTo(';for(Y in $=' ')with(_.split($[Y]))_=join(pop());eval(_)</script>
コードはJSCrushを使用して圧縮されます。
非圧縮コードは次のとおりです。
<canvas id=c>
<script>
v=document.getElementById('c');
c=v.getContext('2d');
function r(){c.rotate(0.42)}
function t(x,y){c.save();c.translate(x,y)}
c.scale(w=(v.width=v.height=prompt())/12,w);
t(7.5,6);
c.arc(0,0,5.5,0,6);
c.stroke();
c.moveTo(-7.5,-1);c.lineTo(6,-1);
c.moveTo(-7.5,1);c.lineTo(6,1);
c.stroke();
c.clearRect(4.2,0,6,6);
t(0,6);r();
c.clearRect(0,-11,3,6.2);
c.restore();
t(-7.5,-0.5);r();
c.clearRect(-1,-2,1,2);
c.restore();
t(-7.5,1.5);r();
c.clearRect(-1,-1.5,1,1.5)
</script>
<canvas>
タグはJavaScript なので... HTML5はHTML / CSS / JSを記述しないためによく使用されます。人々がそれを理解していないということではなく、プログラマーはしばしば怠け者です(少なくとも私は)。あなたのコメントは少し厳しいようです。
7 7翻訳 / l {lineto} def / o {0 0} def o 6 44.85 165.52アーク -7.08 1.5リットル -7.5 .5 l o 6 175.22 184.74アーク -7.08 -.5 l -7.5 -1.5リットル o 6 194.48 309.67アーク o 5 320 197.46 arcn 1.87 -1.5リットル 2.29 -.5 l o 5 185.74 174.26 arcn 2.7 .5リットル 3.12 1.5リットル o 5 162.54 40 arcn 閉路塗りつぶし
これは、GeoGebraを使用して計算した座標に基づいてパス要素を追加することでアウトラインを定義し、アウトラインを塗りつぶします。
lineto
(/l{lineto}def
)と円の原点()のショートカットを追加して、いくつかの文字を保存しました/o{0 0}def
。
別のサイズを指定するには、最初の空白行の後にフォームのコマンドを追加します。height width scale
単独で実行すると、デフォルトのページサイズのページの左下隅にユーロ記号が描画されます。名前を付けて保存anything.ps
し、ドキュメントビューアーで表示します。
以下は、1インチあたり90ピクセル強にラスタライズされたデフォルトサイズの画像です。
4xサイズ:
関数の便利なショートカット(例)についてAsksAnywayに感謝し$c = print; $c('Hello world!');
ます。
<?php header('Content-type:image/png');$h=$_GET['h'];$i=imagecreatetruecolor($h*1.1,$h*1.1);$c=imagecolorallocate;$b=$c($i,0,0,0);$w=$c($i,255,255,255);imagefill($i,0,0,$w);$l=$h*.7;$t=$h*.55;$u=$h/12;$e=imagefilledellipse;$e($i,$l,$t,$h,$h,$b);$e($i,$l,$t,$h*5/6,$h*5/6,$w);$f=imagefilledpolygon;$f($i,array($l+$u*5,$t+$u*1.5,$l-$u*7.5,$t+$u*1.5,$l-$u*7.125,$t+$u*0.5,$l+$u*4,$t+$u*.5,$l+$u*4,$t-$u*.5,$l-$u*7.5,$t-$u*.5,$l-$u*7.125,$t-$u*1.5,$l+$u*5,$t-$u*1.5),8,$b);$f($i,array($l+$u*4.24,$t-$u*4.24,$l+$u*1.84,$t+$u*1.5,$l+$u*3.84,$t+$u*3.26,$l+$u*3.84,$t+$u*4.62,$h*2,$t,),5,$w);imagepng($i);
file.php?h=200
画像を見るためにブラウザから呼び出します
座標は、GIMPで実行された測定に基づいています
<?php
header('Content-type: image/png');
$h = $_GET['h'];
$i = imagecreatetruecolor($h * 1.1,$h * 1.1);
$c = imagecolorallocate;
# black
$b = $c($i,0,0,0);
# white
$w = $c($i,255,255,255);
imagefill($i,0,0,$w);
$l = $h * .7; # distance between left and center of the circle
$t = $h * .55; # distance between top and center of the circle
# one "unit", as defined by the specs
$u = $h / 12;
$e = imagefilledellipse;
# disk is black
$e($i, $l, $t, $h, $h, $b);
# inner disk is white
$e($i, $l, $t, $h * (5 / 6), $h * (5 / 6), $w);
$f = imagefilledpolygon;
# draw 2 bars in black
$f($i, array(
# bottom bar
$l + $u * 5, $t + ($u * 1.5), # bottom right
$l-$u * 7.5, $t + ($u * 1.5), # bottom left
$l-$u * 7.125, $t + ($u * 0.5), # top left
$l + $u * 4, $t + ($u * 0.5), # top right
# top bar
$l + $u * 4, $t - ($u * 0.5), # bottom right
$l-$u * 7.5, $t - ($u * 0.5), # bottom left
$l-$u * 7.125, $t - ($u * 1.5), # top left
$l + $u * 5, $t - ($u * 1.5) # top right
), 8, $b);
# hide right parts of bars and circle by drawing white
$f($i, array(
$l + $u * 6 * (212 / 300), $t - ($u * 6 * (212 / 300)), # right of the disk
$l + $u * 6 * (92 / 300), $t + ($u * 6 * (74 / 300)), # left = bottom right of bottom bar
$l + $u * 6 * (191 / 300), $t + ($u * 6 * (163 / 300)), # bottom of the circle
$l + $u * 6 * (191 / 300), $t + ($u * 6 * (231 / 300)), # bottom of the circle too
$h * 2, $t, # some point at the right of the image (outside the image)
), 5, $w);
imagepng($i);
base64 -d<<<H4sIADBMaVMAAy1Ru27DMAz8FUJdBVsk9QziLFo8uD/QrUDSOIDTBo1Rt39fUsl0POp0PEr7+88Zfq/L530w87redn2/bVu3cff1fe7JOdeLwsB2Oa7zYDw7A/Ppcp5XJWQO+9v7OsN9/VtOg/m4LMvuRS4ZOA7m1VkseQpBoQZvyXlQQPeA2JpEjVEGURL7EePkLCU3Rqw5Wo4EmLALVgaC9BUrk392OAWt0HUBPHrb+NQq4i5UzigeSU6Zsii5xOYiWLE0BCT1Z89QVKLD2dPEIbdEBasINWIDaiDxG2BjslpBXXTk5CeWFkYa1a2KuS0OMBfJ8RgdKzMr03DRP5Ojy5O8sE2ksdU1g+pcu+SqvILUWddNCBHbCIxvpj/s9ZsO/xXfC57OAQAA|zcat|convert -scale $1 svg:- png:-|xview stdin
これは@minitechの回答と同じテクニックです。ただし、ここから.svgデータが取得されます。これははるかに短いhttp://commons.wikimedia.org/wiki/File:Euro_symbol_black.svgです。ImageMagickは、要求されたスケールでベクトルデータを.pngデータに変換し、xviewにパイプします。
の出力./euro.sh 30
:
の出力./euro.sh 300
:
base64
。これはプログラムであり、バイナリトークン(どうやらsvgファイルを表します)に逆コンパイルして、さらに処理を行います。
同じ垂直領域をレンダリングし、同時にアスペクト比を維持する方法がわからなかったので、正しい高さとユーザー次第で4:3形式のみでレンダリングすることにしました
camera{angle 9 location 102*z right x*8 up y*6 look_at 0}
light_source{99*z color 1}
plane{z,0 pigment{color rgb 1}}
#declare b=difference{box{<-5,-.5,1>,<8,.5,1>}box{-2,2 rotate-67*z translate 9.4*x}}
difference{union{torus{5.5,.5 rotate 90*x}object{b translate y}object{b translate -y}}box{<-3.83,-5,-3>,<-7,0,3>}box{<0,7,3>,<-4,-2,-3>rotate 23*z translate-2.5*x}}
と走る povray.exe /RENDER euro.pov -w600 -h800
処理は、描画に非常に特化されているため、実際にはコマンドライン引数の取得を許可しませんが、私の関数は、補正する高さとしてパラメーターを取得します。座標は上の画像からハードコード化/近似され、キャンバス全体が入力パラメーターに基づいてスケーリングされ、任意のサイズの図面が取得されます。
void E(int h){scale(h/12,h/12);noFill();strokeWeight(1);arc(7.5,6,11,11,0.7,PI*2-0.7,OPEN);noStroke();fill(0);shearX(-PI/6);rect(3.2,4.5,9,1);rect(4.4,6.5,8,1);shearX(PI/6);fill(255);rect(11,6,9,6);triangle(8.75,6,12.25,6,12.25,0);}
void setup()
{
size(575, 500);
}
void draw()
{
background(255);
E(height);
noLoop();
}
void E(int h)
{
scale(h/12,h/12);
//Main "C"
noFill();
strokeWeight(1);
arc(7.5,6,11,11,0.7,PI*2-0.7,OPEN);
//settings for other shapes
noStroke();
//the two bars
fill(0);
shearX(-PI/6);
rect(3.2,4.5,9,1);
rect(4.4,6.5,8,1);
//bottom cut of "C"
shearX(PI/6);
fill(255);
rect(11,6,9,6);
//top cut of "C"
triangle(8.75,6,12.25,6,12.25,0);
}
1
代わりにOPEN
、同様に変化255
してbackground
とは、fill
呼び出しに-1