ギョーシェ

ギョーシェは、お金と証券の特徴的なパターンです。 それらは美しいだけでなく、顕著な複雑さと内側のシンプルさを兼ね備えています-原則を理解しようとしているように見えますが、それはあなたを逃します。 おそらくこれはまさに美の定義です。



ギョーシェは偽造から証券を保護する手段として使用されていたため、その使用に関連するすべてのものが分類され、情報は少しずつ収集されなければなりませんでした。



名前自体はフランスの技術者ギロ(ギロ)の姓に由来しますが、この情報については情報が残っていません。 これは一般的に純粋に神話上の人物である可能性があります。



当初、ギョーシェは時計ケースやファベルジュの卵などに波状の線を刻むために使用されていましたが、これには厳密な幾何学的な装飾が必要です。 それらは、ある種の旋盤によって実行されました。この旋盤では、カッターはしっかりと固定されていませんが、回転するワークの周りの図を説明しました。



19世紀の半ば頃、誰かがそのような機械を改造して印刷版に複雑なパターンを生成するというアイデアを思いつきました。 おそらくギョーシェは他の何よりも早くお金に登場したので、彼らはアメリカ人でした-1862年の問題で、そしてすぐに主要な設計要素の1つになりました。



画像



徐々に、彼らはほとんどすべての先進国から借り入れられました-フランスを除いて、機械的なガジェットに気を取られることなく、非常に絵のように紙幣を描く方法を固守しました。



ギョーシェは、1892年にロシアのお金に最初に印刷されました。



画像



さまざまな国のお金のパターン自体を考えると、一般的な原則にもかかわらず、それらはまったく異なることがわかります。 このことから、誰もが対応するマシンを独立して開発したと結論付けることができます。 相関関係も顕著です。国が発展すればするほど、ギョーシェは良くなります。 たとえば、トラクターの部品がギョーシェ機械に使用されていたように見えるチャウシェスク時代のルーマニアのお金を見てください。



画像



ギョーシェの作成は困難でした。非常に複雑なため、ギョーシェという特別な職業を持つ個人によって行われました。 いくつかの情報によると、ギョーシェの画家がアーティストのスケッチに従ってギョーシェを描いたことが理解できます-これは、1926年にスケッチと1チェルボネの完成した紙幣の与えられた例から見ることができます。 彼らが部品を機械的に調整することでこれを行ったとしても、マシンを再度整理したとしても驚かないでしょう。









ギョーシェは時代遅れです。手でお金を引くことしかできないからです。これらの小さな曲線をすべてインクで描いてみてください。 光学コピーを使用する場合、それらは役に立たない-スキャナーは何を読むかを気にしません:パターンまたはポートレート。 そのため、現代の紙幣には通常、ギョーシェ模様はもうないか、伝統へのオマージュとして角のどこかに控えめに突き出ています。



ギョーシェを描くためのアルゴリズムを計算することは非常に困難です-見た目は非常に単純に思えますが。 多くの情報筋は、これはいくつかのホイールを備えたスパイログラフの単なる複雑なバージョンであると書いていますが、私はそれを強く疑います。 コンピューター上でマルチホイールスピログラフを繰り返すの簡単ですが、結果として得られるパターンは、まずギョーシェを連想させるものではなく、次に、所定の輪郭に調整することは不可能です。



ギョーシェは、互いの位相がずれており、境界を越えないように外部輪郭に応じて歪んだ正弦波のファミリーであることは明らかです。 これは明らかですが、数学的にどのように輪郭が正弦波に影響するかはまったく明らかではありません。



実際、パターンを構築する原理は非常に単純ですが、やや奇妙です。 それらはポイントによってカウントされ、3つの曲線(内部、外部輪郭、およびそれらの間をクリープする正弦波)での単純な代数演算は十分ではありません-直線と曲線の交点を決定する方程式を解く必要があります。



実際には、各ポイントに正弦波ポイントを配置しますが、そのたびに異なります-制限回路の現在の状態によって変調されているかのように。



工作機械で必要な計算がどのように実行されたかは、私の理解を超えています。



だから、描画の原理。 単純なため、水平ギョーシェから始めます。 画面への注意。







ギョーシェの境界線は緑色で強調表示されます。 上下を考慮して、横座標tのギョーシェ点の値を計算します。



まず、ポイントPBとPT、tでの輪郭のポイントを見つけます。 同時に、この場所で曲線の方向ベクトルを計算します。



ここで、下部と上部の輪郭の間に特定の中点Midを見つけます。 私たちの美しい曲線の描画がカウントされるのは彼女からです。 PBとPTの間の平均であるポイントだけを取得できます。また、特定の係数0..1を乗算して、下部と上部の輪郭をどの比率で考慮するかを示します。 次に、ギョーシェを輪郭間でわずかに上下に移動して、より美しい図を作成します。



この時点で、方向ベクトルを、ポイントPBとPTのベクトル間の平均として計算します。 垂線を見つけます。



ポイントtで最も普通の正弦波の値を計算します(ポイント0,0で始まり、縦座標軸に沿って右に移動するという仮定の下で)。



次に、この正弦波を次のように歪めます。引数(t、0)の現在の値をMidポイントに転送し、X軸とY軸でそれぞれ「中間ベクトル」を垂直にします。 その後、現在のポイントはポイントRPになります。



この正弦波の振幅を変調するだけです。 距離Mid-IP、つまり、中点から垂直線と輪郭の最初の交点までの距離を計算します。 上部または下部のどちらの回路を取るかは、元の正弦波の値によって決まります。これは縦座標の上または下にあります。 図は、基準正弦波の値がゼロより大きく、上部の輪郭を使用する場合を示しています。



次に、距離Mid-IPを単位として考慮してMid-RPをスケーリングし、この値を新しい縦座標軸に沿って延期します。 垂直。 GPポイントを取得します-これは望ましいギョーシェポイントになります。



プログラミングに移りましょう。 Asymptoteの水平ギョーシェ描画プログラムは次のとおりです。



import graph; import wave; size(1000,1000); xaxis(ticks=Ticks); yaxis(ticks=Ticks); defaultpen(2); var zero = (0,0); typedef pair pairf(real x); /////////////////////////////////////////// //  ,    (0,0)--v pair orthogonal(pair v) { return unit((-vy,vx)); } //         x,path(x) pair[] pt_and_dir(path p, real x) { var t = times(p,x)[0]; return new pair[]{point(p,t), dir(p,t)}; } // ,        t pairf between(path top, path bottom, real topk=0.5, real phase, real omega) { return new pair(real t) { //        var pdt = pt_and_dir(top,t); var pdb = pt_and_dir(bottom,t); // ""        var mid = topk*pdt[0] + (1-topk)*pdb[0]; //      draw(mid,gray); // ,        var ort = orthogonal(topk*pdt[1] + (1-topk)*pdb[1]); //    ,      var f = sin(phase+omega*t); // ,       var rp = rotate(degrees(atan2(ort.y,ort.x)-pi/2),zero) * (0,f); //          //            var ipath = rp.y >= 0 ? top : bottom; var inter = intersections(ipath,mid,mid+ort); var interp = sequence(new pair(int i) {return point(ipath,inter[i]); }, inter.length); interp = sort(interp, new bool(pair a, pair b) {return abs(mid.xa.x) < abs(mid.xb.x); }); var ip = interp[0]; //    " "        var r = sqrt((mid.x-ip.x)*(mid.x-ip.x)+(mid.y-ip.y)*(mid.y-ip.y)); //   return mid+r*rp; }; } //       void repeat(int n, path top, path bottom, real topk, real freq) { var step = 2pi/n; for (var i: sequence(0,n)) { draw(graph(between(top,bottom, topk, i*step, freq), 0,8, 500)); } } //   -  -   path top = shift(0,0.3)*(4*make_wave(1.4, (+1,+0.7),(+1,-0.7) )); //  -  path bottom = (0,0)--(8,0); draw(top, blue); draw(bottom, blue); //    9 ""   11,         repeat(9, top, bottom, 0.5, 11);
      
      







そして、これが彼女の仕事の結果です。 優雅に。







円形のギョーシェ(通常は金銭に現れるもの)を使用すると、事態は複雑になります。 原則は同じですが、...



1.デカルト座標の代わりに、極座標で作業する必要があります

2.曲線は不機嫌になり、動作が悪くなります。 いくつかの点で多かれ少なかれ複雑な輪郭があると、垂線が目的の輪郭とまったく交差しない場合に状況が発生します。 明らかに、そのような場合、長年のギョーシェの経験が必要です。



だから、プログラム。 その中で、輪郭は、前のプログラムとの類推によって、実際には外部および内部ですが、上部および下部と呼ばれています。



 import graph; import wave; size(1000,1000); xaxis(ticks=Ticks); yaxis(ticks=Ticks); defaultpen(5); var zero = (0,0); typedef pair pairf(real x); typedef pair[] pairaf(real t); /////////////////////////////////////////// //    pair orthogonal(pair v) { return unit((-vy,vx)); } //      pair cart(real a, real r) { return (r*cos(a), r*sin(a)); } //    - real atan2p(pair v) { var a = atan2(vy,vx); return a<0 ? a+2pi : a; } //     real distance(pair a, pair b) { return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)); } //       p    a pair[] pt_and_dir(path p, real a) { var ii = intersections(p,zero--cart(a,100)); if (ii.length==0) { write(p); write(a); } var t = ii[0]; return new pair[]{point(p,t[0]), dir(p,t[0])}; } //   ,    midpoint,        pairf between(path top, path bottom, pairaf midpoint, real phase, real omega) { return new pair(real t) { var b = midpoint(t); var mid = b[0]; draw(mid,green); var mid_dir = b[1]; var f = sin(phase+omega*t); var angle = (degrees(atan2p(mid_dir))+180) % 360; var rp = rotate(angle,zero) * (0,f); //        -    ? var ipath = distance(mid+rp,zero) > distance(mid,zero) ? top : bottom; //       var inter = intersections(ipath,mid,mid+rp); //  -  .       .     , //      if (inter.length==0) { draw(mid--mid+rp,magenta,Arrow); return mid; } //        var interp = sequence(new pair(int i) {return point(ipath,inter[i]); }, inter.length); interp = sort(interp, new bool(pair a, pair b) {return distance(mid,a) < distance(mid,b); }); var ip = interp[0]; var r = distance(mid,ip); return mid + r*rp; }; } //   ,     pairf between(path top, path bottom, path base, real phase, real omega) { pairaf mf = new pair[](real t) { return pt_and_dir(base, t); }; return between(top, bottom, mf, phase, omega); } //   ,         pairf between(path top, path bottom, real topk=0.5, real phase, real omega) { pairaf midpoint = new pair[](real t) { var pdt = pt_and_dir(top,t); var pdb = pt_and_dir(bottom,t); var mid = topk*pdt[0] + (1-topk)*pdb[0]; var mid_dir = topk*pdt[1] + (1-topk)*pdb[1]; return new pair[]{mid, mid_dir}; }; return between(top, bottom, midpoint, phase, omega); } //       (     ) void repeat(int n, path top, path bottom, real topk, real freq) { var step = 2pi/n; for (var i: sequence(0,n-1)) { draw(graph(between(top,bottom, topk, i*step, freq), 0, 2pi, 500)); } } //  -    ,     void repeat(int n, path top, path bottom, path base, real freq) { var step = 2pi/n; for (var i: sequence(0,n-1)) { draw(graph(between(top,bottom,base, i*step, freq), 0, 2pi, 500)); } } //  -   .       ,       , //   SVG       path top = (458.43,237.715)..controls (468.922,264.461) and (481.563,290.133)..(466.797,322.145) ..controls (438.688,358.184) and (392.762,345.094)..(362.438,351.945) ..controls (354.488,353.742) and (350.508,354.398)..(342.07,358.234) ..controls (338.023,360.074) and (333.797,358.609)..(329.125,358.598) ..controls (324.457,358.582) and (319.348,360.02)..(315.824,363.094) ..controls (306.16,371.52) and (294.707,387.746)..(278.176,400.949) ..controls (261.645,414.152) and (250.875,417.965)..(236.914,417.996) ..controls (222.957,418.023) and (213.074,414.152)..(196.543,400.949) ..controls (180.012,387.746) and (168.559,371.52)..(158.895,363.094) ..controls (155.371,360.02) and (150.262,358.582)..(145.594,358.598) ..controls (140.922,358.609) and (136.695,360.074)..(132.648,358.234) ..controls (124.211,354.398) and (120.23,353.742)..(112.281,351.945) ..controls (81.957,345.094) and (36.0313,358.184)..(7.92188,322.145) ..controls (-6.84375,290.133) and (5.79688,264.461)..(16.2891,237.715) ..controls (19.1992,230.289) and (11.7227,218.836)..(11.7227,209.773) ..controls (11.7227,200.711) and (19.1992,188.906)..(16.2891,181.48) ..controls (5.79688,154.734) and (-6.84375,129.063)..(7.92188,97.0508) ..controls (36.0313,61.0078) and (81.957,74.0977)..(112.281,67.2461) ..controls (120.23,65.4531) and (124.211,64.7969)..(132.648,60.9609) ..controls (136.695,59.1211) and (140.922,60.582)..(145.594,60.5977) ..controls (150.262,60.6094) and (155.371,59.1719)..(158.895,56.1016) ..controls (168.559,47.6719) and (180.012,31.4492)..(196.543,18.2461) ..controls (213.074,5.03906) and (222.957,1.16797)..(236.914,1.19922) ..controls (250.875,1.22656) and (261.645,5.03906)..(278.176,18.2461) ..controls (294.707,31.4492) and (306.16,47.6719)..(315.824,56.1016) ..controls (319.348,59.1719) and (324.457,60.6094)..(329.125,60.5977) ..controls (333.797,60.582) and (338.023,59.1211)..(342.07,60.9609) ..controls (350.508,64.7969) and (354.488,65.4531)..(362.438,67.2461) ..controls (392.762,74.0977) and (438.688,61.0078)..(466.797,97.0508) ..controls (481.563,129.063) and (468.922,154.734)..(458.43,181.48) ..controls (455.52,188.906) and (462.996,200.238)..(463.055,209.359) ..controls (463.113,218.48) and (455.52,230.289)..(458.43,237.715) --cycle; path bottom = (435.121,232.246)..controls (424.465,250.848) and (436.73,269.879)..(418,294.242) ..controls (399.266,318.602) and (368.48,321.363)..(355.004,331.102) ..controls (341.531,340.84) and (349.316,349.461)..(338.301,353.699) ..controls (327.289,357.934) and (311.055,338.211)..(297.848,342.762) ..controls (277.797,349.668) and (257.313,362.477)..(235.926,362.551) ..controls (214.543,362.629) and (196.012,350.156)..(175.961,343.25) ..controls (162.75,338.699) and (146.52,358.422)..(135.504,354.188) ..controls (124.492,349.949) and (132.277,341.328)..(118.805,331.59) ..controls (105.328,321.852) and (74.5391,319.09)..(55.8086,294.73) ..controls (37.0742,270.367) and (49.3438,251.336)..(38.6875,232.734) ..controls (33.918,224.414) and (17.0078,213.824)..(17.0078,209.363) ..controls (17.0078,204.902) and (33.9258,194.051)..(38.6953,185.727) ..controls (49.3555,167.129) and (37.082,148.094)..(55.8242,123.734) ..controls (74.5625,99.375) and (105.359,96.6094)..(118.84,86.875) ..controls (132.32,77.1367) and (124.531,68.5117)..(135.547,64.2773) ..controls (146.566,60.043) and (162.805,79.7617)..(176.016,75.2148) ..controls (196.078,68.3086) and (214.613,55.832)..(236.008,55.9102) ..controls (257.398,55.9883) and (277.891,68.7969)..(297.953,75.7031) ..controls (311.164,80.2539) and (327.402,60.5313)..(338.418,64.7656) ..controls (349.438,69.0039) and (341.648,77.625)..(355.129,87.3633) ..controls (368.609,97.0977) and (399.406,99.8633)..(418.145,124.223) ..controls (436.887,148.586) and (424.613,167.617)..(435.273,186.219) ..controls (440.043,194.539) and (456.961,205.215)..(456.926,209.535) ..controls (456.887,213.859) and (439.891,223.926)..(435.121,232.246) --cycle; //      top = scale(1/10)*top; bottom = scale(1/10)*bottom; //           var min = min(top); var max = max(top); top=shift(-(max.x-min.x)/2, -(max.y-min.y)/2)*top; min = min(bottom); max = max(bottom); bottom=shift(-(max.x-min.x)/2-min.x, -(max.y-min.y)/2-min.y)*bottom; draw(top, blue); draw(bottom, blue); //  4  repeat(4, top, bottom, 0.5, 18);
      
      





結果は、1992年の25ベラルーシルーブルのクーポンからのソケットに似ています。 真ん中の線を慎重に描くと、さらに似たものになります(2番目の図を参照)。















図の一部の線はノッチ付きであることがわかりました-これは、計算の精度が不足しているためです。 描画演算子で計算を500ではなく10,000ポイントに設定することにより、ある程度修正できます。



他にギョーシェを思いつくことができますか?



まず、ベラルーシ語版をよく見ると、ローカルパターンの周波数がまだ変化していることがわかります。それらは太くなり、時には小さくなります。 プログラムの頻度を考慮に入れる方法-私は思いつきませんでした。



第二に、ギョーシェはベジェ曲線の形で保存されるように頼みます-それらは非常によく近似されています。 しかし、このためには、それらがどのように振る舞うか、ピークがある場所、変曲点がある場所を理解する必要があります。 一連の点からこれを計算するのはどういうわけか馬鹿げており、たとえば微分を計算することによって数学的に質問にアプローチする方法は明確ではありません。



尊敬されている大衆がこの主題について何か考えを持っているなら、共有してください。



記事内のPSイメージは、ページの全体的な外観を損なわないようにスケーリングされます。 それらを個別に開いて、より良い解像度で表示できます。



All Articles