読者です 読者をやめる 読者になる 読者になる

ほるっふー

自宅のベランダに鳩が住み着いた話を5万人の前ですること。

Perfume 4th Tour in DOME LEVEL3 の ロゴを描きたい

Twitter上では以前も挑戦した企画ですが当時より技術が上がってきたので再挑戦します。

2013年12月に行われた LEVEL3 のロゴは、24個の頂点が偶数飛ばしで互いに直線で結ばれたドームをイメージした美しい幾何学模様です。

 

f:id:blacksmithltw:20150530023500p:plain

 

 

 

www.perfume-web.jp

 

とりあえずで書いてみた結果

 

f:id:blacksmithltw:20150530030149p:plain

うん、ぜんぜん足りない。

 

ちょっと修正

f:id:blacksmithltw:20150530030150p:plain

中央右上が寂しい

というかお隣の点と繋がってしまっている。

 

とここでそもそもこの模様は一筆書できるのかと考える。

一筆書きができる模様は奇数本の線が流れこむ頂点を2つ以下しか持ってはならない。

それは、当然だ一筆書きでは入ったら出なければならないから必ず偶数本ずつ増えていく奇数が許されるのは始点と終点のみつまり2箇所しか許されない。

元の図形は各々の頂点から11本の直線が伸びているため明らかに一筆書きできない。

 

ということに気付いて書いたのが下の図

f:id:blacksmithltw:20150530030151p:plain

お隣とくっつくことはなくなった。

後描けていない状況はなにか考えると偶数の内2,4,6,8,12は24を割り切ることができるので一周すると戻ってくるが10は24を割り切れないので一周して戻ってくることはない、一周したら終了という描き方をしていたために10個飛ばしの描画が一部欠けていた。

その場合 24 % 10 = 4 , 10 - 4 = 6個 1周より先まで頂点を許してやれば十分巡ってくれる。

 

f:id:blacksmithltw:20150530030153p:plain

できたのがこちら。

同じ線を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個にしてみたり…

f:id:blacksmithltw:20150530031649p:plain

うお、ゴージャス

 

半分の12個にしてみたりできる。

f:id:blacksmithltw:20150530031707p:plain

うん、これはしょぼい LEVEL1くらいだ。