Perfume 4th Tour in DOME LEVEL3 の ロゴを描きたい
Twitter上では以前も挑戦した企画ですが当時より技術が上がってきたので再挑戦します。
2013年12月に行われた LEVEL3 のロゴは、24個の頂点が偶数飛ばしで互いに直線で結ばれたドームをイメージした美しい幾何学模様です。
とりあえずで書いてみた結果
うん、ぜんぜん足りない。
ちょっと修正
中央右上が寂しい
というかお隣の点と繋がってしまっている。
とここでそもそもこの模様は一筆書できるのかと考える。
一筆書きができる模様は奇数本の線が流れこむ頂点を2つ以下しか持ってはならない。
それは、当然だ一筆書きでは入ったら出なければならないから必ず偶数本ずつ増えていく奇数が許されるのは始点と終点のみつまり2箇所しか許されない。
元の図形は各々の頂点から11本の直線が伸びているため明らかに一筆書きできない。
ということに気付いて書いたのが下の図
お隣とくっつくことはなくなった。
後描けていない状況はなにか考えると偶数の内2,4,6,8,12は24を割り切ることができるので一周すると戻ってくるが10は24を割り切れないので一周して戻ってくることはない、一周したら終了という描き方をしていたために10個飛ばしの描画が一部欠けていた。
その場合 24 % 10 = 4 , 10 - 4 = 6個 1周より先まで頂点を許してやれば十分巡ってくれる。
できたのがこちら。
同じ線を2度なぞったりしているので多少ズレて線が太くなっている所があるが完成である。
(それが許されるならそもそも一筆書きじゃないじゃないか!!)
コードはこんな感じ ROOT のライブラリを用いている。
#include "TGraph.h"
#include "TMath.h"
#include "TCanvas.h"
#define VERTEX 24
#define Pi TMath::Pi()
void LEVEL3()
{
Double_t pointx[4*VERTEX][VERTEX] = {};
Double_t pointy[4*VERTEX][VERTEX] = {};
Int_t index = 0;
Int_t grdex = 0;
TGraph* graph[VERTEX] ;
for(Int_t i=2;i<=VERTEX/2;i+=2) // Skip Number
{
for(Int_t j=0;j<i;j++) // Start Points
{
for(Int_t k=j;k<=j+VERTEX+(i-(VERTEX % i));k+=i) // Pointing
{
pointx[grdex][index] = TMath::Cos(2.*Pi*k/(Double_t)VERTEX) ;
pointy[grdex][index] = TMath::Sin(2.*Pi*k/(Double_t)VERTEX) ;
index++;
}
graph[grdex] = new TGraph(index,pointx[grdex],pointy[grdex]);
grdex++;
}
}
TCanvas* canvas = new TCanvas("canvas","canvas",700,700);
canvas->cd();
graph[0]->SetTitle("Perfume 4th Tour in DOME LEVEL3");
graph[0]->Draw("AL");
for(Int_t l=1;l<grdex;l++)
{
graph[l]->Draw("L SAME");
}
}
===おまけ===
頂点の数は自由に変えることができる(ようにコードを書いた)。
1.5倍の36個にしてみたり…
うお、ゴージャス
半分の12個にしてみたりできる。
うん、これはしょぼい LEVEL1くらいだ。