Tip: The syntax for the symbol-assign with subtypes is using a colon:
symbol-assign line wall:blocks MY_SYMBOL
Exemple of code (for small cave) :
def l_wall_blocks_XXX (expr P) = % pickup PenD; % draw P withcolor red; T:=identity; cas := 0; dlzka := arclength P; if dlzka > 0: mojkrok:=adjust_step(dlzka, 0.75u); pickup PenA; forever: t1 := arctime (cas + mojkrok*1/10) of P; t2 := arctime (cas + mojkrok*9/10) of P; q := ((point t1 of P) + .3u * unitvector(thdir(P,t1) rotated -90)) -- (subpath (t1,t2) of P) -- ((point t2 of P) + .3u * unitvector(thdir(P,t2) rotated -90)); thdraw q randomized (u/6); cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; fi; enddef; initsymbol("l_wall_blocks_XXX"); symbol-assign line wall:blocks XXX endcode
Default values where :
mojkrok:=adjust_step(dlzka, 1.5u); q := ((point t1 of P) + .4u * unitvector(thdir(P,t1) rotated -90)) -- (subpath (t1,t2) of P) -- ((point t2 of P) + .4u * unitvector(thdir(P,t2) rotated -90));
An other exemple by Georges :
def l_wall_blocks_AUT (expr P) = T:=identity; pickup PenC; laenge := arclength P; path block; path old_block; cur := 0; t:= arctime cur of P; % draw first block old_block := ( (.7u,-.35u)--(.85u,0.01u)--(.4u,.5u)--(.1u,.3u)--(-.0u,-.0u) ); block_width := (xpart urcorner old_block - xpart ulcorner old_block); old_block:=old_block rotated angle( thdir(P,0) ) shifted point t of P; thclean (old_block--cycle); thdraw old_block; cur := cur + block_width/2; t:= arctime cur of P; forever: % generate random block block := punked ( ( (.8u,-.35u)--(.85u,0.01u)--(.6u,.4u)--(.1u,.1u)--(-.0u,-.3u) ) randomized (0.3u) ) scaled (uniformdeviate(0.3)+.65) rotated (uniformdeviate(45)-15); % check width of block block_width := (xpart urcorner block - xpart ulcorner block); exitif cur > (laenge- 3.5*block_width/2); % find next position where the block fits in without intersecting the previous one forever: exitif xpart ( ((block--cycle) rotated angle(direction t of P) shifted point t of P) intersectiontimes old_block) < 0; cur:=cur+0.01u; t:= arctime cur of P; exitif cur > (laenge- 3.5*block_width/2); endfor; exitif cur > (laenge- 3.5*block_width/2); old_block:= block rotated angle(direction t of P) shifted point t of P; thclean (old_block--cycle); thdraw old_block; cur := cur + block_width/2; t:= arctime cur of P; endfor; % generate last block t:= arctime laenge-eps of P; block := (( (-.15u,-.35u)--(.0u,.0u)--(-.45u,.5u)--(-.75u,.3u)--(-.85u,-.0u)) ); block_width := (xpart urcorner block - xpart ulcorner block); % scale last block to fit in the remaining gap scale_factor:=(laenge-cur)/block_width; forever: exitif xpart ( ( (block) rotated angle (direction t of P) scaled scale_factor shifted (point t of P) ) intersectiontimes old_block) < 0; scale_factor:=scale_factor-0.001; endfor; thclean (block--cycle) rotated angle (direction t of P) scaled scale_factor shifted (point t of P); thdraw (block) rotated angle (direction t of P) scaled scale_factor shifted (point t of P); enddef;