diff options
Diffstat (limited to 'Master/texmf-dist/doc/metapost/featpost/example/sap.mp')
-rw-r--r-- | Master/texmf-dist/doc/metapost/featpost/example/sap.mp | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/sap.mp b/Master/texmf-dist/doc/metapost/featpost/example/sap.mp new file mode 100644 index 00000000000..003abcd59cb --- /dev/null +++ b/Master/texmf-dist/doc/metapost/featpost/example/sap.mp @@ -0,0 +1,179 @@ +% sap.mp +% L. Nobre G. +% 2002 + +numeric NumberOfColors, HalfSideLength; +numeric ThicknesFactor, TolerancFactor; +NumberOfColors = 7; +HalfSideLength = 15mm; +ThicknesFactor = 0.2; % Maximum TraceThickness over Half Side +ThinnessFactor = 0.1; % Minimum TraceThickness over Half Side +TolerancFactor = 0.5 + 0.02; % Side Gaps over Thickness + +def RandomStep = + begingroup + numeric margin; + margin = ThicknesFactor-ThinnessFactor; + ThinnessFactor*HalfSideLength + uniformdeviate( margin*HalfSideLength ) + endgroup +enddef; + +def PickInteger( expr MaxNum ) = + begingroup + save aux; + numeric aux; + aux = ceiling( uniformdeviate( MaxNum ) ); + if aux = 0: + aux := 1; + fi; + ( aux ) + endgroup +enddef; + +def PickColor = + ( uniformdeviate(1) , uniformdeviate(1), uniformdeviate(1) ) +enddef; + +vardef LocateIndex[] = + dotlabel.urt( str @, z@ ) +enddef; + +def SpreadAllOver = + begingroup + pair urCorner, ulCorner, llCorner, lrCorner; + path FinalCut; + urCorner = ( 8.13in, 11.533in ); + llCorner = ( 0.118in, 35.5bp ); + ulCorner = ( xpart llCorner, ypart urCorner ); + lrCorner = ( xpart urCorner, ypart llCorner ); + FinalCut = urCorner--ulCorner--llCorner--lrCorner--cycle; + + picture Tile[]; + Tile[1] = currentpicture; + Tile[2] = currentpicture rotated 90; + Tile[3] = currentpicture rotated 180; + Tile[4] = currentpicture rotated 270; + currentpicture := nullpicture; + numeric i, j, horizo, vertic; + horizo = ( xpart urCorner ) + HalfSideLength; + vertic = ( ypart urCorner ) + HalfSideLength; + for i = 0 step 2HalfSideLength until horizo: + for j = 0 step 2HalfSideLength until vertic: + draw Tile[PickInteger( 4 )] shifted ( i, j ); + endfor; + endfor; + clip currentpicture to FinalCut + endgroup +enddef; + +beginfig(1); + linecap := butt; + + numeric tracethickness; + tracethickness = RandomStep; + currentpen := pensquare rotated 45 scaled tracethickness; + + numeric i, currentcoord, maincoords[], numaincoords, toleranc; + i = 0; + currentcoord = 2TolerancFactor*tracethickness; + toleranc = HalfSideLength - currentcoord; + forever: + i := incr( i ); + maincoords[i] = currentcoord; + currentcoord := currentcoord + 4TolerancFactor*tracethickness; + currentcoord := currentcoord + + uniformdeviate( ThicknesFactor*HalfSideLength ); + exitif currentcoord > toleranc; + endfor; + numaincoords = i; + + numeric j; + pair Dir[]; + for i = 1 upto numaincoords: + j := i; + z[j] = ( HalfSideLength, maincoords[i] ); + Dir[j] = left; + j := i + numaincoords; + z[j] = ( maincoords[i], HalfSideLength ); + Dir[j] = down; + j := i + 2numaincoords; + z[j] = ( -maincoords[i], HalfSideLength ); + Dir[j] = down; + j := i + 3numaincoords; + z[j] = ( -HalfSideLength, maincoords[i] ); + Dir[j] = right; + j := i + 4numaincoords; + z[j] = ( -HalfSideLength, -maincoords[i] ); + Dir[j] = right; + j := i + 5numaincoords; + z[j] = ( -maincoords[i], -HalfSideLength ); + Dir[j] = up; + j := i + 6numaincoords; + z[j] = ( maincoords[i], -HalfSideLength ); + Dir[j] = up; + j := i + 7numaincoords; + z[j] = ( HalfSideLength, -maincoords[i] ); + Dir[j] = left; + endfor; + +% for i=1 upto 8numaincoords: +% LocateIndex[i]; +% endfor; + + boolean Filled[]; + for i=1 upto 8numaincoords: + Filled[i] = false; + endfor; + numeric Chosen[]; + for i=0 upto numaincoords-1: + Chosen[i] = 0; + endfor; + color LookUpColor[]; + for i=1 upto NumberOfColors: + LookUpColor[i] = PickColor; + endfor; + + numeric ThisInd, ThatInd, ThisCoo, ThatCoo; + color ThisColor, ThatColor; + path ActualPath; + for j=2 step 2 until 8numaincoords: + + forever: + ThisInd := PickInteger( 8numaincoords ); + exitunless Filled[ThisInd]; + endfor; + Filled[ThisInd] := true; + ThisCoo := ThisInd mod numaincoords; + if Chosen[ThisCoo] = 0: + i := PickInteger( NumberOfColors ); + ThisColor := LookUpColor[i]; + Chosen[ThisCoo] := i; + else: + ThisColor := LookUpColor[Chosen[ThisCoo]]; + fi; + + forever: + ThatInd := PickInteger( 8numaincoords ); + exitunless Filled[ThatInd]; + endfor; + Filled[ThatInd] := true; + ThatCoo := ThatInd mod numaincoords; + if Chosen[ThatCoo] = 0: + i := PickInteger( NumberOfColors ); + ThatColor := LookUpColor[i]; + Chosen[ThatCoo] := i; + else: + ThatColor := LookUpColor[Chosen[ThatCoo]]; + fi; + + ActualPath := z[ThisInd]{Dir[ThisInd]} + ...z[ThatInd]{-Dir[ThatInd]}; + draw subpath (0,0.6) of ActualPath withcolor ThisColor; + draw subpath (0.4,1) of ActualPath withcolor ThatColor; + + endfor; + + SpreadAllOver; +endfig; + +end. |