Penrose Tiling (F-Basic)

 準周期性を考える上で、必ず例に挙げられるのがフィボナッチ格子(1次元準周期性)とペンローズ・タイリング(2次元準周期性)である。
複数の単位胞(Unit Cell)で空間を充填する周期性を持たない構造を”準格子”と呼ぶ。ペンローズ・タイリングの場合は、二週類の平行四辺形(やせている Skinny ものと太っている Fat もの)で表される。

 1984年にShechtmanらの論文が発表されて、世界に驚きと興奮を与えた。これまでの結晶学の概念を根底から覆す概念の「準結晶」の発見は、高次元の結晶学を生み出し、結晶学のさらなる発展を促した。
 少し難しいが、どうやってこの2種類の平行四辺形を隙間なく埋めるかを簡単に説明しよう!2次元の準周期性を表現するのに4次元空間での周期性を考えます。2次元のパラレル空間(||空間: 我々の生きている空間。)と2次元のパープ空間(⊥空間: 仮想空間です。例えば、あの世とか来世とか・・・)で構成されています。詳しくはフィボナッチ格子のホームページを参照してください。
 直交4次元空間を||空間に射影すると下図のようになります。

また、⊥空間に射影すると下図のようになります。

 と表されて、の関係も簡単な計算で求められます。τは黄金比でフィボナッチ格子のホームページに詳しく書いてあります。

 結晶学以外の立場、例えば、建築や芸術にもこの幾何学的に美しいパターンが取り入れられている。今後、もっと多様なタイリングの計算プログラムを作っていく予定である。

参考文献
(1)木村 薫、竹内 伸、固体物理20(1985)897.
(2)竹内 伸、木村 薫、固体物理23(1988)433.
(3)木村 薫、竹内 伸、固体物理23(1988)689.
(4)小特集; 日本金属学会会報25、2号(1986).
(5)特集;   日本金属学会会報29、10号(1990).
(6)A. Yamamoto and K. N. Ishihara, Acta Cryst. A44 (1988) 707.



左側の図は、⊥空間で Wyckoff positions です。菱形30面体を平たくした菱形20面体の断面で得ることができます。
それぞれの色の五角形の内に入る指数 h1, h2, h3, h4 を使って右図の ||空間にその領域の色の原子をおきます。

Small Size

Middle Size

Large Size


declare function ATAN2 (Y as double, X as double) as double
declare sub EXTERNAL ()
declare sub OD (DX as double)
declare sub PERP ()
declare sub INIT ()
declare sub LATTICE (FO$)
common shared PI as double, TAU as double, EL as double, A0 as double, MYU as integer
common shared WX1, WX2, WX3, WX4, WY1, WY2, WY3, WY4
common shared RG, VS as double, HR as integer
var shared U(2,4) as double, V(2,4) as double
'-------------------------------------------------------------------
'    Penrose Patterns  (For Two-dimensional Quasichrystal)
'
'      A.Yamamoto and K.N.Ishihara, Acta Cryst.(1988)A44, 707-714
'
'                                2001.8.30   by H.Abe
'
'      (dx)|| = h1*ux1 + h2*ux2 + h3*ux3 + h4*ux4
'      (dy)|| = h1*uy1 + h2*uy2 + h3*uy3 + h4*uy4
'
'      (dx)⊥ = h1*vx1 + h2*vx2 + h3*vx3 + h4*vx4
'      (dy)⊥ = h1*vy1 + h2*vy2 + h3*vy3 + h4*vy4
'
'-------------------------------------------------------------------
  cls
  PI = 4.0# * atn(1.0#)
  TAU = (1.0# + sqr(5.0#)) / 2.0#
  A0 = 2.719#      ' [A]
' HR: h range, RG: range of graph
  HR=8:   FO$="penrose_g0_S.dat": RG=20   ' small map
'  HR=12:  FO$="penrose_g0_M.dat": RG=30   ' midle map
'  HR=16:  FO$="penrose_g0_L.dat": RG=40   ' large map
' +++++
  INIT ' Initialize Parameters
' +++++
'--------------------------------------------------------
' Penrose Tiling (γ=0)
'--------------------------------------------------------
  open FO$ for create as #1
    print #1, EL
     for MYU=1 to 4
         locate 3,MYU: color MYU: print "μ="; MYU; : color 7:print time$
'     +++++++++
      EXTERNAL ' External Space
'     +++++++++
    next MYU
  close #1
' ++++++++++++
  LATTICE FO$ ' Penrose Lattece Drawing
' ++++++++++++
  input "end", AAAAA
end
'*******************************************
  sub INIT ()
'*******************************************
    var H1 as integer, H2 as integer, H3 as integer, H4 as integer
    var DX as double

    EL=2.0# * A0 / sqr(5.0#)   ' edge length of the rhombus
    for I=1 to 4
      U(1,I)=EL*(cos(2.0# * PI * I / 5.0#)-1.0#)    ' d||  (ux, uy)
      U(2,I)=EL* sin(2.0# * PI * I / 5.0#)
      V(1,I)=EL*(cos(4.0# * PI * I / 5.0#)-1.0#)    ' d⊥  (vx, vy)
      V(2,I)=EL* sin(4.0# * PI * I / 5.0#)
    next I
    H1= -1:  H2= -1:  H3= -1:  H4= -1   ' (-1-1-1-1) ⊥
    VS = (H1*V(1,1) + H2*V(1,2) + H3*V(1,3) + H4*V(1,4))/5.0# ' V shift
'------------------------------------
'   Graphics
'-----------------------------------
    XMIN =    0.0: XMAX = 610.0
    YMIN = -410.0: YMAX =   0.0
    window (XMIN, YMIN)-(XMAX, YMAX)
    view (15, 10)-(625, 420),9 , 3
    WX1=205: WX2=605: WY1=5: WY2=405
    WX3=5:   WX4=186: WY3=5: WY4=405

    line (WX1, -WY1)-(WX2, -WY2),,3,bf,11  ' || space
    line (WX3, -WY3)-(WX4, -WY4),,3,bf,11  ' ⊥ space
    line (10, -332)-(122, -402),,3,bf,0
'   +++++
    PERP ' perp lattice
'   +++++
    for I=1 to 4
      MYU=I: DX=0.0#
'     ++++++
      OD DX ' ocupation domain
'     ++++++
    next I
  end sub
'***************************************************
  sub OD (DX as double)
'***************************************************
    dim X(10), Y(10), P(10), Q(10)
    select case MYU
      case 1
        H1(1)= 0:  H2(1)=-1:  H3(1)=-1:  H4(1)= 0
        H1(2)=-1:  H2(2)= 0:  H3(2)= 1:  H4(2)= 0
        H1(3)= 1:  H2(3)= 0:  H3(3)=-1:  H4(3)=-1
        H1(4)=-1:  H2(4)=-1:  H3(4)= 0:  H4(4)= 1
        H1(5)= 0:  H2(5)= 1:  H3(5)= 0:  H4(5)=-1
      case 2
        H1(1)= 0:  H2(1)=-1:  H3(1)=-1:  H4(1)= 0
        H1(2)=-1:  H2(2)= 0:  H3(2)= 0:  H4(2)= 0
        H1(3)= 0:  H2(3)= 0:  H3(3)=-1:  H4(3)=-1
        H1(4)=-1:  H2(4)=-1:  H3(4)= 0:  H4(4)= 0
        H1(5)= 0:  H2(5)= 0:  H3(5)= 0:  H4(5)=-1
      case 3
        H1(1)=-1:  H2(1)= 0:  H3(1)= 0:  H4(1)=-1
        H1(2)= 0:  H2(2)=-1:  H3(2)=-1:  H4(2)=-1
        H1(3)=-1:  H2(3)=-1:  H3(3)= 0:  H4(3)= 0
        H1(4)= 0:  H2(4)= 0:  H3(4)=-1:  H4(4)=-1
        H1(5)=-1:  H2(5)=-1:  H3(5)=-1:  H4(5)= 0
      case 4
        H1(1)=-1:  H2(1)= 0:  H3(1)= 0:  H4(1)=-1
        H1(2)= 0:  H2(2)=-1:  H3(2)=-2:  H4(2)=-1
        H1(3)=-2:  H2(3)=-1:  H3(3)= 0:  H4(3)= 0
        H1(4)= 0:  H2(4)= 0:  H3(4)=-1:  H4(4)=-2
        H1(5)=-1:  H2(5)=-2:  H3(5)=-1:  H4(5)= 0
    end select

    for I=1 to 5
      X(I) = H1(I)*V(1,1) + H2(I)*V(1,2) + H3(I)*V(1,3) + H4(I)*V(1,4) + DX
      Y(I) = H1(I)*V(2,1) + H2(I)*V(2,2) + H3(I)*V(2,3) + H4(I)*V(2,4)
    next I
    X1=(WX4-WX3)/(VS*2.5#*1.25)*(Y(1)+VS*1.25#*1.25)+WX3
    Y1=(WY4-WY3)/(VS*5.0#*1.25)* X(1)+WY3
    for I=2 to 5
      XI =(WX4-WX3)/(VS*2.5#*1.25)*(Y(I)  +VS*1.25#*1.25)+WX3
      XI1=(WX4-WX3)/(VS*2.5#*1.25)*(Y(I-1)+VS*1.25#*1.25)+WX3
      YI =(WY4-WY3)/(VS*5.0#*1.25)*X(I)  +WY3
      YI1=(WY4-WY3)/(VS*5.0#*1.25)*X(I-1)+WY3
      P(I)=XI-XI1
      Q(I)=YI-YI1
    next I
    point (X1,-Y1)
    connect -step(P(2),-Q(2))-step(P(3),-Q(3))-step(P(4),-Q(4))-step(P(5),-Q(5)), 2*MYU,,f,2*MYU+1
  end sub
'*************************************************
  sub PERP ()
'*************************************************
    dim X(20), Y(20), H1(20), H2(20), H3(20), H4(20)

    H1(1)= 0:  H2(1)= 0:  H3(1)= 0:  H4(1)= 0
    H1(2)= 0:  H2(2)=-1:  H3(2)= 0:  H4(2)= 0
    H1(3)= 0:  H2(3)= -1:  H3(3)= 0:  H4(3)=-1
    H1(4)=-1:  H2(4)=-1:  H3(4)= 0:  H4(4)=-1
    H1(5)=-1:  H2(5)=-1:  H3(5)=-1:  H4(5)=-1
    H1(6)=-1:  H2(6)= 0:  H3(6)=-1:  H4(6)=-1
    H1(7)=-1:  H2(7)= 0:  H3(7)=-1:  H4(7)= 0
    H1(8)= 0:  H2(8)= 0:  H3(8)=-1:  H4(8)= 0
    NP=8
    for I=1 to NP
      X(I) = H1(I) * V(1,1) + H2(I) * V(1,2) + H3(I) * V(1,3) + H4(I) * V(1,4)
      Y(I) = H1(I) * V(2,1) + H2(I) * V(2,2) + H3(I) * V(2,3) + H4(I) * V(2,4)
    next I
    for I=1 to NP
      J=(I mod NP) + 1
      XI=(WX4-WX3)/(VS*2.5#*1.25)*(Y(I)+VS*1.25#*1.25)+WX3
      XJ=(WX4-WX3)/(VS*2.5#*1.25)*(Y(J)+VS*1.25#*1.25)+WX3
      YI=(WY4-WY3)/(VS*5.0#*1.25)*X(I)+WY3
      YJ=(WY4-WY3)/(VS*5.0#*1.25)*X(J)+WY3
      line (XI, -YI)-(XJ, -YJ),, 1
    next I
'------------------------------------------------
    H1(1)= 0:  H2(1)= 0:  H3(1)= -1: H4(1)= 0
    H1(2)= 0:  H2(2)=-1:  H3(2)= 0:  H4(2)=-1
    H1(3)=-1:  H2(3)= 0:  H3(3)=-1:  H4(3)=-1
    H1(4)=-1:  H2(4)=-1:  H3(4)= 0:  H4(4)=-1
    H1(5)=-1:  H2(5)= 0:  H3(5)=-1:  H4(5)= 0
    H1(6)= 0:  H2(6)=-1:  H3(6)= 0:  H4(6)= 0
    NP=6
    for I=1 to NP
      X(I) = H1(I) * V(1,1) + H2(I) * V(1,2) + H3(I) * V(1,3) + H4(I) * V(1,4)
      Y(I) = H1(I) * V(2,1) + H2(I) * V(2,2) + H3(I) * V(2,3) + H4(I) * V(2,4)
    next I
    for I=1 to NP
      J=(I mod NP) + 1
      XI=(WX4-WX3)/(VS*2.5#*1.25)*(Y(I)+VS*1.25#*1.25)+WX3
      XJ=(WX4-WX3)/(VS*2.5#*1.25)*(Y(J)+VS*1.25#*1.25)+WX3
      YI=(WY4-WY3)/(VS*5.0#*1.25)*X(I)+WY3
      YJ=(WY4-WY3)/(VS*5.0#*1.25)*X(J)+WY3
      line (XI, -YI)-(XJ, -YJ),, 1
    next I
'-------------------------------------------------
    H1(1)= 0:  H2(1)= 0:  H3(1)= 0:  H4(1)= 0
    H1(2)=-1:  H2(2)= 0:  H3(2)= 0:  H4(2)= 0
    H1(3)=-1:  H2(3)= 0:  H3(3)= 0:  H4(3)=-1
    H1(4)= 0:  H2(4)= 0:  H3(4)= 0:  H4(4)=-1
    NP=4
    for I=1 to NP
      X(I) = H1(I) * V(1,1) + H2(I) * V(1,2) + H3(I) * V(1,3) + H4(I) * V(1,4)
      Y(I) = H1(I) * V(2,1) + H2(I) * V(2,2) + H3(I) * V(2,3) + H4(I) * V(2,4)
    next I
    for I=1 to NP
      J=(I mod NP) + 1
      XI=(WX4-WX3)/(VS*2.5#*1.25)*(Y(I)+VS*1.25#*1.25)+WX3
      XJ=(WX4-WX3)/(VS*2.5#*1.25)*(Y(J)+VS*1.25#*1.25)+WX3
      YI=(WY4-WY3)/(VS*5.0#*1.25)*X(I)+WY3
      YJ=(WY4-WY3)/(VS*5.0#*1.25)*X(J)+WY3
      line (XI, -YI)-(XJ, -YJ),, 1
    next I
'-------------------------------------------------
    H1(1)=-1:  H2(1)=-1:  H3(1)=-1:  H4(1)=-1
    H1(2)=-1:  H2(2)=-1:  H3(2)=-1:  H4(2)= 0
    H1(3)= 0:  H2(3)=-1:  H3(3)=-1:  H4(3)= 0
    H1(4)= 0:  H2(4)=-1:  H3(4)=-1:  H4(4)=-1
    NP=4
    for I=1 to NP
      X(I) = H1(I) * V(1,1) + H2(I) * V(1,2) + H3(I) * V(1,3) + H4(I) * V(1,4)
      Y(I) = H1(I) * V(2,1) + H2(I) * V(2,2) + H3(I) * V(2,3) + H4(I) * V(2,4)
    next I
    for I=1 to NP
      J=(I mod NP) + 1
      XI=(WX4-WX3)/(VS*2.5#*1.25)*(Y(I)+VS*1.25#*1.25)+WX3
      XJ=(WX4-WX3)/(VS*2.5#*1.25)*(Y(J)+VS*1.25#*1.25)+WX3
      YI=(WY4-WY3)/(VS*5.0#*1.25)*X(I)+WY3
      YJ=(WY4-WY3)/(VS*5.0#*1.25)*X(J)+WY3
      line (XI, -YI)-(XJ, -YJ),, 1
    next I
  end sub
'*******************************************************
  sub EXTERNAL ()
'*******************************************************
    var DX as double, R as double, X0 as double, D0 as double
    var DIX as double, DIY as double, DI as double, THE0 as double, THE as double
    var DEX as double, DEY as double
    var H1 as integer, H2 as integer, H3 as integer, H4 as integer

    DX=-VS*MYU
    select  case MYU
      case 1
        R=VS/TAU/TAU: PM= 1.0#
      case 2
        R=VS/TAU:     PM=-1.0#
      case 3
        R=VS/TAU:     PM= 1.0#
      case 4
        R=VS/TAU/TAU: PM=-1.0#
    end select
    X0=R*cos(PI/5.0#)

    for H1 = -HR to HR
      for H2 = -HR to HR
        for H3 = -HR to HR
          for H4 = -HR to HR
            DIX = H1*V(1,1) + H2*V(1,2) + H3*V(1,3) + H4*V(1,4) + DX
            DIY = H1*V(2,1) + H2*V(2,2) + H3*V(2,3) + H4*V(2,4)
            DI=sqr(DIX*DIX + DIY*DIY)
'           +++++++++++++++++++++++++
            THE0=ATAN2(DIY, PM*DIX)
'           +++++++++++++++++++++++++
            THE=abs(THE0)-72.0#*int(abs(THE0)/72.0#)
            D0=DI*cos((THE-36.0#)*PI/180.0#)
            if D0<=X0 then
              DEX = (H1*U(1,1) + H2*U(1,2) + H3*U(1,3) + H4*U(1,4) + DX)/TAU/TAU
              DEY = (H1*U(2,1) + H2*U(2,2) + H3*U(2,3) + H4*U(2,4)     )/TAU/TAU
              print #1, MYU, DEX, DEY, DIX, DIY
              if EL<=DEX and DEX<=RG+EL and -RG/2.0<=DEY and DEY<=RG/2.0 then
                XX=(WX2-WX1)/RG*(DEX-EL)+WX1
                YY=(WY2-WY1)/RG*(DEY+RG/2.0)+WY1
                circle (XX, -YY),100.0/RG, 1+2*MYU,,,,f
              end if
              XX=(WX4-WX3)/(VS*2.5#*1.25)*(DIY+VS*1.25#*1.25)+WX3
              YY=(WY4-WY3)/(VS*5.0#*1.25)*(DIX-DX)+WY3
              circle (XX, -YY),0.5, 2*MYU,,,,f
            end if
          next H4
        next H3
      next H2
    next H1
  end sub
'****************************************************
  sub LATTICE (FI$)
'****************************************************
    dim X(5000) as double, Y(5000) as double
    dim PX(100) as double, PY(100) as double
    dim CN(5000) as integer
    var R as double

    XMIN = EL:     XMAX = RG+EL
    YMIN = -RG/2.0: YMAX = RG/2.0
    window (XMIN, YMIN)-(XMAX, YMAX)
    view (220.0, 16.0)-(619.0, 414.0),11 , 3
    I=0
    open FI$ for input as #1
      input #1, EL
      while not eof(1)

        input #1, CN(I), X0,Y0, DIX, DIY
        if XMIN=<X0 and X0<=XMAX and YMIN<=Y0 and Y0<=YMAX then
          I=I+1
          X(I)=X0
          Y(I)=Y0
'         print I, X(I), Y(I)
        end if
      wend
    close #1
    NP=I
    print "total lattice points =";NP
'------------------------------------
    for I=1 to NP
      K=0
      X0=X(I)
      Y0=Y(I)
      for J=1 to NP
        R=sqr((X0-X(J))^2+(Y0-Y(J))^2)
        if EL*0.9<R and R <= EL*1.1 then
          K = K + 1
          PX(K) = X(J)
          PY(K) = Y(J)
          line (X0,-Y0)-(X(J),-Y(J)),,14
        end if
      next J

      for m=1 to k
        X1=PX(M)
        Y1=PY(M)
        for L=2 to K
          X2=PX(L)
          Y2=PY(L)
          A1=sqr( (X1 - X0)^2 + (Y1 - Y0)^2 )
          A2=sqr( (X2 - X0)^2 + (Y2 - Y0)^2 )
          NAISEKI=(X1-X0)*(X2-X0) + (Y1-Y0)*(Y2-Y0)
          if int(1000.0*A1)=int(1000.0*A2) and int(1000.0*NAISEKI)=int(1000.0*A1*A2*cos(36.0#*PI/180.0#)) then
            connect (X0,Y0)-step(X1-X0,Y1-Y0)-step(X2-X0,Y2-Y0)-step(X0-X1,Y0-Y1),14,pset,f,13
          end if
        next L
      next M
    next I
'---------------------------------------------------
    for I=1 to NP
      circle (X(I), -Y(I)),rg/80.0, 1+2*CN(I),,,,f
    next I
  end sub
'*****************************************
  function ATAN2 (Y as double, X as double)
'*****************************************
    if Y > 0.0# and X = 0.0# then
      ATAN2 = 90.0#
    else if Y > 0.0# and X < 0.0# then
      ATAN2 = atn(Y / X) * 180.0# / PI + 180.0#
    else if Y < 0.0# and X > 0.0# then
      ATAN2 = atn(Y / X) * 180.0# / PI + 360.0#
    else if Y < 0.0# and X < 0.0# then
      ATAN2 = atn(Y / X) * 180.0# / PI + 180.0#
    else if Y < 0.0# and X = 0.0# then
      ATAN2 = 270.0#
    else if Y = 0.0# and X < 0.0# then
      ATAN2 = 180.0#
    else if Y = 0.0# and X = 0.0# then
      ATAN2 = 0.0#
    else
      ATAN2 = atn(Y / X) * 180.0# / PI
    end if
  end function


Back to ABE

Back to Department of Materials Science and Engineering


ab@cc.nda.ac.jp

Department of Materials Science and Engineering
National Defense Academy

Last Modified: April 1, 2009