シェルピンスキのガスケット

user-pic
0

フラクタルを勉強していると、最初の方に、シェルピンスキのガスケットというのが出てくる。それは結構有名であるが、画像で示すと以下のようなものである。シンプルながら、なんとなく神秘的な雰囲気もあるこの描画が私は好きである。

最初にフラクタルのことを知った時、シェルピンスキって誰だろうとさえ思いもしなかったが、志賀浩二著「無限からの光芒 - ポーランド学派の数学者たち」日本評論社を読んだとき、シェルピンスキがポーランド学派の偉い数学者の一人であることを知った。

シェルピンスキは1882年に、ワルシャワの有名な医師の息子として生まれた。二つの世界大戦を含む激しい騒乱を生き延びて1969年に87歳で亡くなるまで、ポーランドの大学で数学の顕著な業績を挙げた。その業績には整数論なども含まれるが、なんといってもシェルピンスキを特徴づけるのは、カントールを嚆矢とする無限論、あるいは連続体仮説の掘り下げである。「無限からの光芒 - ポーランド学派の数学者たち」から、例えば、シェルピンスキが証明した次のような定理を掲げてみる。

連続体仮説は、次の命題と同値である:平面R2は、共通点のない二つの部分集合A、Bの和として表される。すなわち、R2 = A∪B ここで、Aはx軸と平行な任意の直線と高々加算個しか交わらず、Bはy軸と平行な任意の直線と高々加算個しか交わらない。

この定理の意味を考えていたら気が遠くなりそうになってきたので、戻ってシェルピンスキのガスケットの表示にもちいたプログラムのソースコードを示しておくことにする。シェルピンスキのガスケットは、私が三十代の前半だった歳の頃もプログラムを作成したが、πの多倍長計算などと比較しても簡単で、ほとんど苦労した記憶はない。なので今回も楽勝かとプログラミングしようとしたら、なんと、正三角形の頂点を結ぶ直線を引く計算でさえ、ええとどうだったっけ、と迷う有様で、この程度のプログラミングもほとんど半日がかりだった。ともかく、動いたC++ビルダのコードを示す。

あ、もう一つ付け加えると、数学セミナー2017年3月号のフラクタル特集号の、梶野直孝氏の「フラクタル上の解析学」と題する記事によると、シェルピンスキのガスケット上でディリクレ形式やラプラシアンが論じられるのだという。ううん、こちらの方もまた気が遠くなりそうである。

//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const double pi = 3.14156;
double PosX = 300.0;
double PosY = 300.0;
void Fracta(double p1x, double p1y, double p2x, double p2y, double p3x, double p3y, int level);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Close();    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Canvas->Pen->Color = clBlack;
 double P1x, P1y, P2x, P2y, P3x, P3y, Angle;
 double L = 250.0;
 double InitAngle = pi;
 double OffsetAngle = 2.0*pi/3.0;
 Angle = InitAngle;
 P1x = L*sin(Angle);  P1y = L*cos(Angle);
 Angle += OffsetAngle;
 P2x = L*sin(Angle);  P2y = L*cos(Angle);
 Angle += OffsetAngle;
 P3x = L*sin(Angle);  P3y = L*cos(Angle);
 Fracta(P1x, P1y, P2x, P2y, P3x, P3y, 1); 
}
//---------------------------------------------------------------------------

void Fracta(double p1x, double p1y, double p2x, double p2y, double p3x, double p3y, int level)  {
 int depth = level;
 if ( depth > 9 ) return;
 depth++;	

 Form1->Canvas->MoveTo(p1x + PosX,p1y + PosY);
 Form1->Canvas->LineTo(p2x + PosX,p2y + PosY);
 Form1->Canvas->LineTo(p3x + PosX,p3y + PosY);
 Form1->Canvas->LineTo(p1x + PosX,p1y + PosY);

 Fracta(p1x, p1y, (p1x + p2x)/2.0, (p1y + p2y)/2.0,(p1x + p3x)/2.0, (p1y + p3y)/2.0,depth);
 Fracta(p2x, p2y, (p2x + p1x)/2.0, (p2y + p1y)/2.0,(p2x + p3x)/2.0, (p2y + p3y)/2.0,depth);
 Fracta(p3x, p3y, (p3x + p1x)/2.0, (p3y + p1y)/2.0,(p3x + p2x)/2.0, (p3y + p2y)/2.0,depth);
 return;
}

トラックバック(0)

トラックバックURL: http://commutative.world.coocan.jp/mt/mt-tb.cgi/4520

コメントする

このブログ記事について

このページは、あやたろうが2017年4月27日 05:20に書いたブログ記事です。

ひとつ前のブログ記事は「藤井聡太」です。

次のブログ記事は「悠々自適」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。