Sub-dialekt Shape

Sub-dialekt Shape umožňuje vytvářet tvary (kresby) jako bloky. Použití dialektu shape má tuto skladbu:

                shape  ( příkazy dialektu Shape )


Specifické rysy tohoto dialektu jsou:

  • každý kreslící příkaz začíná na aktuální pozici pera
  • pozici pera lze měnit bez kreslení zadáním cílové polohy příkazem move
  • tvary jsou automaticky uzavírány - spojením posledního bodu s prvním
  • generované tvary lze zadat do příkazu fill-pen pro vytváření individuálních výplní
  • kreslící příkazy používají implicitně absolutní (relativní k piškotu) souřadnice; relativní (relativní k poslední pozici) souřadnice jsou aktivní ve verzi 'lit-word příkazu.


V argumentu funkce shape můžete použít tyto příkazy a vlastnosti:

move, arc, curve, curv, qcurve, qcurv, hline, vline, line, line-width, line-join, line-cap, pen, fill-pen.

Modře označené entity se deklarují stejně jako v dialektu Draw.


move


Přemístí pero na novou pozici, nic se nekreslí:


Red [needs: view]


myshape: [

       line 10x10 70x70  ; line from 10x10 to 70x70

       move 10x70        ; přemístí pero na pozici 10x70

       line 10x10        ; kreslí čáru z aktuální (10x70) pozice

    ]


view compose/deep/only [base draw [shape (myshape)

    ] ]




Relativní pozice


Souřadnice se stanou relativní, přidá-li se apostrof před příkaz:


Red [needs: view]


myshape: [

       line 10x40 40x40  ; horizontální čára do středu

       'move 0x-10       ; posun aktuální pozice vzhůru

       'line 20x0        ; konec čáry relativně k aktuální pozici

    ]


view compose/deep/only [base draw [shape (myshape)]]



line


Nakreslí úsečku mezi dvěma body. Je-li zadáno více bodů, kreslí se další úsečky, napojované na předchozí.


Red [needs: view]


myshape: [line 10x10 70x70]


view compose/deep/only [

       base draw [

           shape (myshape)

       ] ]




Všimněte si upřesnění compose/deep/only a závorek kolem myshape.  Tyto náležitosti jsou zřejmě při práci s DSL Shape povinné.

Upřesnění /deep přikazuje vyhodnotit zanořenou závorku.

Upřesnění /only přikazuje  ... nutno doplnit.



Automatické uzavírání tvaru


V následujícím příkladu jsou explicitně zadány pouze dvě přímky. Příkaz  fill-pen  byl přidán jenom pro zvýraznění uzavřené plochy:


Red [needs: view]


myshape: [

       line 10x70 40x10 70x70

]

view compose/deep/only [base draw [ fill-pen blue shape (myshape)]]




hline a  vline

Kreslí horizontální nebo vertikální přímku z aktuální pozice pera.

Red [needs: view]


myshape: [

       move 10x10   ; nastaví pero na 10x10

       hline 30     ; horizontále X = 30 (délka 20)

       vline 30     ; vertikála Y = 30 (výška 20)

       'hline 30    ; horizontála délky 30

       'vline 30    ; vertikála délky 30

       'hline -20   ; horizontála záporné délky 20

                    ; lomená čára se posléze uzavře

]


view compose/deep/only [base draw [shape (myshape)]]  



arc (liší se od Draw-arc)


arc evokuje absolutní souřadnice
'arc evokuje relativní souřadnice

                                                                        Kreslí oblouk mezi aktuální polohou pera a koncovým bodem oblouku. Oblouk je definován úsekem fiktivní elipsy s poloměry r-x, r-y a úhlem odklonu vodorovné osy elipsy od souřadnicové osy x.


Syntaxe:      arc  <end>  <r-x> <r-y>  <angle>  (plus nepovinné: sweep, large)

    large : kreslí červený oblouk
                           sweep : kreslí modrý oblouk
                     sweep large : kreslí fialový oblouk

Bez doplňku sweep, large kreslí zelený oblouk. Oklon elipsy v obrázku je 0 stupňů.


Všimněte si, že zadáváte pouze koncovou pozici oblouku. Počáteční pozice je daná aktuální polohou pera. Je-li tedy arc prvním příkazem argumentu pro shape,  musíte se nejprve přesunout (move) do počáteční pozice.


Red [needs: view]


myshape_1: [

       move 10x40

       arc 70x40 10 5 0 ]


myshape_2: [

       move 10x40

       arc 70x40 30 10 0 sweep ]


myshape_3: [

       move 30x30

       arc 60x60 10 10 315 ]   ; u kružnice je hodnota úhlu irelevantní


myshape_4: [

       move 10x40

       arc 70x40 10 5 45 ]


view compose/deep/only [

       base draw [ fill-pen blue shape (myshape_1)]

       base draw [ fill-pen blue shape (myshape_2)]

       base draw [ fill-pen blue shape (myshape_3)]

       base draw [ fill-pen blue shape (myshape_4)] ]




Odlišné parametry  radius-x a radius-x vytvoří eliptický oblouk.



curve

Kreslí kubickou Bezierovu křivku, danou třemi až čtyřmi body. Připouští absolutní nebo relativní ('curve) souřadnice.


Red [needs: view]


myshape_1: [

       move 10x70

       curve 30x20 50x20 70x70   ; 2 kontrolní a koncový bod

    ]

view compose/deep/only [base draw [ fill-pen blue shape (myshape_1)

    ] ]




curv ,  qcurve  a  qcurv


Všechny tři příkazy generují Bezierovy křivky s absolutními či relativními (') souřadnicemi.


  • qcurv    kreslí hladkou kvadratickou Bezierovu křivku z 1+1 bodů.
  • qcurve  kreslí kvadratickou Bezierovu křivku z alespoň 1+2 bodů;
  • curv      kreslí hladkou kubickou Bezierovu křivku z alespoň 1+1 bodů;


Tyto křivky používají počáteční, koncový a kontrolní bod či body. Pěkná animace je na Wikipedii, viz  https://en.wikipedia.org./wiki/Bézier_curve



Red [needs: view]


myshape_1: [

       move 10x40       ;starting point

       curv    30x10        40x40         50x60          70x40

       ;  control point   control point   control point   endpoint

    ]

view compose/deep/only [base draw [ fill-pen blue shape (myshape_1)

    ] ]