bersama catatan peribadi & teknikalnya.

MetaFun Dalam CONTEXT LMTX

Pelajaran 1: Penampan Grafik (Graphic Buffers)


geeky stuff
#context | #metafun | #metapost
'السلام عليكم'

Saya akan sentuh berkenaan Graphic buffers dalam siaran kali ini.

Apa kegunaan penampan grafik ini? Ianya sangat berguna dalam penyediaan sebuah dokumentasi kerana kod-kodnya boleh digunakan untuk dua benda; paparan kod dan juga hasil grafiknya.

Coretan kod (code snippet) ini diletakkan di dalam penampan (buffer), dan ia boleh diulangguna kemudiannya.

Terdapat tiga kod arahan yang boleh digunakan setelah menyediakan coretan kod dalam penampan ini iaitu \typebuffer, \getbuffer dan juga \processMPbuffer.

Saya sediakan contoh kod di bawah dengan menggunakan data bintang pecah 14 yang terdapat pada Jalur Gemilang Malaysia:-

  1\setuppapersize[A4,portrait]
  2\setuplayout[margin=.75in,
  3  topspace=.75in,location=middle,
  4  header=18pt,headerdistance=3em,
  5  footer=16pt,footerdistance=3em,
  6  height=fit,width=fit]
  7\setupbodyfont[dejavu,8pt]
  8\setupheadertexts[{\tfc \CONTEXT\ LMTX\hfill \bf Bintang Pecah 14}]
  9\setupbackgrounds[header][text][bottomframe=on]
 10\setupbackgrounds[footer][text][topframe=on]
 11\setupinteraction[state=start]
 12\useURL[lesen][https://creativecommons.org/licenses/by-nc/4.0/][][CC BY-NC 4.0.]
 13\setupfootertexts[\leftaligned{\tfa Pn Wan Raihan, \from[lesen]}]
 14\setuptyping[margin=standard,blank=halfline]
 15\setuppagenumbering[location={right},style=bold]
 16
 17\defineoverlay[WatermarkOverlay]
 18  [{\framed[frame=off,foregroundcolor=lightgray]
 19  {\scale[sx=3.5,sy=3.5]
 20  {\rotate[rotation=10]{wraihan.com}}}}]
 21\setupbackgrounds[page][background=WatermarkOverlay]
 22
 23\setuphead[section][style=\bfb]
 24\definecolor[kuning][c=0,m=.09,y=1,k=0]
 25
 26\starttext
 27
 28\startbuffer[a]
 29\startMPcode
 30  picture BintangPecahSatu; BintangPecahSatu := image (
 31    pair A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T,
 32      U, V, W, X, Y, Z, Za, Zb;
 33
 34      A=( 1.00cm,  0 cm);  H=(- 0  cm, 2.50cm);
 35      O=(-1.00cm,- 0 cm);  V=(  0  cm,-2.50cm);
 36
 37      B=( 2.44cm, .56cm);  C=(  .90cm,  .43cm); D=( 1.96cm, 1.56cm);
 38      N=(-2.44cm, .56cm);  M=(- .90cm,  .43cm); L=(-1.96cm, 1.56cm);
 39      P=(-2.44cm,-.56cm);  Q=(- .90cm,- .43cm); R=(-1.96cm,-1.56cm);
 40     Zb=( 2.44cm,-.56cm); Za=(  .90cm,- .43cm); Z=( 1.96cm,-1.56cm);
 41
 42      E=(  .62cm, .78cm);  F=( 1.09cm, 2.25cm); G=(  .22cm,  .98cm);
 43      K=(- .62cm, .78cm);  J=(-1.09cm, 2.25cm); I=( -.22cm,  .98cm);
 44      S=(- .62cm,-.78cm);  T=(-1.09cm,-2.25cm); U=( -.22cm,- .98cm);
 45      Y=(  .62cm,-.78cm);  X=( 1.09cm,-2.25cm); W=(  .22cm,- .98cm);
 46
 47    fill A--B--C--D--E--F--G--H--I--J--K--L--M--N--O--P--Q--R--S--T--U
 48      --V--W--X--Y--Z--Za--Zb--cycle withcolor \MPcolor{kuning};
 49
 50    draw A--B--C--D--E--F--G--H--I--J--K--L--M--N--O--P--Q--R--S--T--U
 51      --V--W--X--Y--Z--Za--Zb--cycle withpen pencircle scaled 1pt;
 52
 53    drawpoints A--B--C--D--E--F--G--H--I--J--K--L--M--N--O--P--Q--R--S
 54      --T--U--V--W--X--Y--Z--Za--Zb--cycle withpen pencircle scaled 4bp;
 55
 56    label.rt ( "A",2.57A); label.rt ("B",    B); label.rt ( "C",2.5 C);
 57    label.rt ( "D",    D); label.rt ("E",2.5 E); label.top( "F",1.03F);
 58    label.top( "G",2.55G); label.top("H",1.02H); label.top( "I",2.57I);
 59    label.top( "J",1.04J); label.lft("K",2.57K); label.lft( "L",1.04L);
 60    label.lft( "M",2.5 M); label.lft("N",    N); label.lft( "O",2.47O);
 61    label.lft( "P",    P); label.lft("Q",2.5 Q); label.lft( "R",    R);
 62    label.lft( "S",2.55S); label.bot("T",1.03T); label.bot( "U",2.55U);
 63    label.bot( "V",1.02V); label.bot("W",2.55W); label.bot( "X",1.03X);
 64    label.rt ( "Y",2.55Y); label.rt ("Z",    Z); label.rt ("Za",2.5Za);
 65    label.rt ("Zb",   Zb); z0=(0, 0); dotlabel.top("(0, 0)",z0);
 66  ) scaled .75; draw BintangPecahSatu;
 67\stopMPcode
 68\stopbuffer
 69
 70\blank[2*big]
 71\section{\bfb VERSI SATU:-}
 72\tfa \typebuffer[a]
 73\startlinecorrection[blank]
 74\placefigure{}{\getbuffer[a]}
 75\stoplinecorrection
 76
 77\startbuffer[b]
 78  picture BintangPecahDua; BintangPecahDua := image (
 79    a = 1.00cm; b = 2.50cm; z01 = -z15 = (a, 0); -z08 = z22 = (0, -b);
 80    c = 2.44cm; d =  .56cm; z02 = -z16 = (c, d); -z14 = z28 = (c, -d);
 81    e =  .90cm; f =  .43cm; z03 = -z17 = (e, f); -z13 = z27 = (e, -f);
 82    g = 1.96cm; h = 1.56cm; z04 = -z18 = (g, h); -z12 = z26 = (g, -h);
 83    i =  .62cm; j =  .78cm; z05 = -z19 = (i, j); -z11 = z25 = (i, -j);
 84    k = 1.09cm; l = 2.25cm; z06 = -z20 = (k, l); -z10 = z24 = (k, -l);
 85    m =  .22cm; n =  .98cm; z07 = -z21 = (m, n); -z09 = z23 = (m, -n);
 86
 87    drawoptions(withpen pencircle scaled 1.5pt);
 88    drawfill z01..z02..z03..z04..z05..z06..z07..z08..z09..z10..z11..z12
 89      ..z13..z14..z15..z16..z17..z18..z19..z20..z21..z22..z23..z24..z25
 90      ..z26..z27..z28..cycle withcolor transparent(1, .75, blue);
 91  ) scaled .75; draw BintangPecahDua;
 92\stopbuffer
 93
 94\startbuffer[c]
 95  def star (expr size, n, pos) =
 96    for a = 1 step 360/n until round(360*(1-0/n)) :
 97      draw (origin--(size/2, 0) rotated 90)
 98        rotatedaround (origin, a) shifted pos
 99        withpen pencircle scaled .33cm withcolor \MPcolor{kuning};
100    endfor;
101  enddef;
102
103  star(3.5cm, 14, origin);
104\stopbuffer
105
106\page
107\section{\bfb VERSI DUA:-}
108\tfa \typebuffer[b]
109\startlinecorrection[blank]
110\placefigure{}{\processMPbuffer[b]}
111\stoplinecorrection
112
113\blank[3*big]
114\section{\bfb MELAKAR BINTANG:-}
115\tfa \typebuffer[c]
116\startlinecorrection[blank]
117\placefigure{}{\processMPbuffer[c]}
118\stoplinecorrection
119
120\stoptext

Perhatikan baris-baris yang telah diserlahkan. Terdapat tiga penampan yang disediakan; penampan a (\startbuffer[a]), penampan b (\startbuffer[b]) dan penampan c (\startbuffer[c]).

  • Apabila coretan kod diletakkan dibawah penampan, kod-kod itu boleh dicetak dengan arahan \typebuffer. Fungsi \typebuffer ini sama seperti fungsi arahan \starttyping.
  • Seterusnya, \getbuffer digunakan untuk menghasilkan grafik daripada kod-kod diberi. Ambil perhatian kepada arahan MetaPost seperti \startMPcode & \stopMPcode yang diletakkan di dalam penampan. Ianya memang diperlukan sekiranya menggunakan arahan \getbuffer ini.
  • Manakala untuk \processMPbuffer pula, arahan seperti \startMPcode atau \startuseMPgraphic mesti ditinggalkan. Terus maju kepada arahan makro dan pembolehubah MetaPost untuk penghasilan grafik.
Hasil bagi penampan a:

Hasil bagi penampan b dan penampan c:

Berikut ialah data untuk bintang pecah mengikut Persamaan Parametrik bagi Bulatan di mana sudut 360° dibahagikan kepada 28 pecahan. Unjuran pula bersaiz 1cm per unit yang kemudiannya dikecilkan skalanya kepada 75% untuk memuatkan lukisan ke dalam kertas bersaiz A4.

Kod Sumber: Data / PDF: data.pdf, alternatif

Data Persamaan Parametrik ini dibundarkan kepada dua titik perpuluhan.


Ada sedikit penambahbaikan dengan memasukkan makro MetaPost menggunakan Persamaan Parametrik untuk menghasilkan imej bintang pecah 14 (Tetradecagram) ini secara langsung. Maka secara asasnya, data di atas sepatutnya tidak diperlukan lagi namun saya kekalkan sebagai rujukan. Siaran saya selepas ini mengandungi kod Jalur Gemilang yang pautannya ada saya sediakan di bawah.



Kali terakhir dikemaskini:
Top