diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/gapfill/Mac_OS_only/CABebez.pl |
Initial commit
Diffstat (limited to 'graphics/gapfill/Mac_OS_only/CABebez.pl')
-rwxr-xr-x | graphics/gapfill/Mac_OS_only/CABebez.pl | 935 |
1 files changed, 935 insertions, 0 deletions
diff --git a/graphics/gapfill/Mac_OS_only/CABebez.pl b/graphics/gapfill/Mac_OS_only/CABebez.pl new file mode 100755 index 0000000000..d3b7acd68f --- /dev/null +++ b/graphics/gapfill/Mac_OS_only/CABebez.pl @@ -0,0 +1,935 @@ +#!perl -w +# CABebez.pl +# (c) Copyright 2006 by H. Mller (mollerh@math.uni-muenster.de). +# Version 1.2 for Cabri-gomtre II with MacOS 9.x, Virtual Printer as PostScript driver, MacPerl 5.6, and LATEX-packages 'pict2e' and 'ebezier'. +# This program may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 of this license or (at your option) any later version. +# The latest version of this license is in http://www.latex-project.org/lppl.txt. +# This program has the LPPL maintenance status "maintained". The Current Maintainer of this program is H. Mller. +# +use POSIX('ceil','floor'); +#________________________________________________________ +# Definable by user: +# Unitlength in pt: +$ul = 1.0; +# Fill factor (for filling with magnification up to 500%): +$fillf = 5; +# Bzier factor: +$bezf = 2.0; +# Point factor: +$pointf = 0.3; +#________________________________________________________ +# Constants: +# Color names: +$yellow = "0.9843900.9511410.020249"; +$orange = "1.0000000.3927370.009949"; +$red = "0.8649270.0342110.025910"; +$purple = "0.9486080.0325630.519234"; +$violet = "0.2769050.0000000.645487"; +$navy = "0.0000000.0000000.828138"; +$blue = "0.0088040.6692610.917967"; +$green = "0.1215990.7170980.078874"; +$darkgreen = "0.0000000.3933010.069093"; +$darkbrown = "0.3359430.1742730.020081"; +$brown = "0.5657890.4428780.227359"; +#________________________________________________________ +# Further Constants: +# Pi: +$Pi = "3.14159265358979"; +# Constant in cubic Bzier curves for quarters of a circle: +$l90 = "0.552284749830794"; +# Constants in dotted figures: +$uli = sp(4 / $ul); +$ule = sp(0.8 / $ul); +#________________________________________________________ +@lines = <>; +do { + $_ = $lines[$i++]; + if (/ setrgbcolor \s/o) { + s/ //go; + s/setrgbcolor\s/ /o; + $c = $_; + $_ = $lines[$i++]; + s/ moveto//o; + s/lineto stroke/stroke/o; + s/curveto stroke/curveto/o; + s/ setlinewidth stroke//o; + s/ lineto//go; + if (/stroke/o) { + $line[++$#line] = $c.$_; + } + elsif (/closepath fill/o) { + $vector[++$#vector] = $_; + } + elsif (/arc /o) { + $circle[++$#circle] = $c.$_; + } + elsif (/arcn/o) { + $arc[++$#arc] = $c.$_; + } + elsif (/curveto/o) { + do { + $conic[++$#conic] = $c.$_; + $_ = $lines[$i++]; + s/ moveto//o; + s/curveto stroke/curveto/o; + } + until $_ !~ /curveto/o; + } + } +} +until $i == $#lines; +# +$pflag = 1; +$sflag = 1; +$thicknessflag = 1; +$coun = 0; +$bmax = 500; +$xtex = ""; +$mtex = ""; +$btex = "\\documentclass{article}\n\\usepackage{ebezier}\n\n"; +#________________________________________________________ +# Lines and polygons +$cflag = 1; +foreach (@line) { + @coo = split; + $co0 = $coo[0]; + $co2 = (-1) * $coo[2]; + $co4 = (-1) * $coo[4]; + if ($co0 ne $yellow) { + if ($cflag) { + $xtex .= "%Lines, arrows, polygons and Bzier curves\n"; + $cflag = 0; + } + if ($co0 ne $blue) { + bound($coo[1],$co2); + bound($coo[3],$co4); + } + if (($co0 ne $red) and ($co0 ne $blue) and ($co0 ne $brown) + and ($co0 ne $darkbrown) and ($co0 ne $navy)) { + lin($co0,$coo[1] * $ul,$co2 * $ul,$coo[3] * $ul,$co4 * $ul); + } + if (($co0 ne $green) and ($co0 ne $darkgreen) and ($co0 ne $violet)) { + if ($pflag) { + $cb1 = $coo[1]; + $cb2 = $co2; + $pol = $co0." ".$cb1." ".$cb2; + $pflag = 0; + } + else { + $pol .= " ".$coo[1]." ".$co2; + if (abs($coo[3] - $cb1) + abs($co4 - $cb2) < 2.0E-6) { + $poly[++$#poly] = $pol; + $pflag = 1; + } + } + } + } +} +# +foreach (@poly) { + @po = split; + $p0 = $po[0]; + $pon = $#po; + if (($p0 eq $red) or ($p0 eq $purple) or ($p0 eq $darkbrown) + or ($p0 eq $orange) or ($p0 eq $brown)) { + if ($pon == 6) { + tri($p0,$po[1],$po[2],$po[3],$po[4],$po[5],$po[6]); + } + elsif ($pon == 8) { + ($p0,$u1,$v1,$u2,$v2,$u3,$v3,$u4,$v4) = @po; + $s1 = abs($u1 - $u4) + abs($u2 - $u3) + abs($v1 - $v2) + abs($v3 -$v4); + $s2 = abs($u1 - $u2) + abs($u3 - $u4) + abs($v1 - $v4) + abs($v2 -$v3); + if (($s1 < 4.0E-6) or ($s2 < 4.0E-6)) { + bound($u1,$v1); + bound($u3,$v3); + rect($p0,$u1,$v1,$u2,$v2,$u3,$v3,$u4,$v4); + } + else { + bound($u1,$v1); + bound($u2,$v2); + bound($u3,$v3); + bound($u4,$v4); + tri($p0,$u1,$v1,$u2,$v2,$u3,$v3); + tri($p0,$u1,$v1,$u3,$v3,$u4,$v4); + } + } + elsif ($pon > 8) { + bound($po[1],$po[2]); + for (my $j = 3; $j <= $pon - 3; $j += 2) { + bound($po[$j],$po[$j + 1]); + tri($p0,$po[1],$po[2],$po[$j],$po[$j + 1],$po[$j + 2],$po[$j + 3]); + } + bound($po[$pon - 1],$po[$pon]); + } + } + elsif ($p0 eq $navy) { + for (my $j = 1; $j <= $pon - 3; $j +=2) { + lin($p0,$po[$j] * $ul,$po[$j + 1] * $ul,$po[$j + 2] * $ul,$po[$j + 3] * $ul); + } + } + elsif ($p0 eq $blue) { + if ($pon == 4) { +#Text marker and Bzier curves + $coun++; + $bo3 = $po[1] + ($po[3] - $po[1]) / $ul; + $bo4 = $po[2] + ($po[4] - $po[2]) / $ul; + bound($po[1],$po[2]); + bound($bo3,$bo4); + $po1 = sp($po[1]); + $po2 = sp($po[2]); + $mtex .= "\\put(".$po1.",".$po2."){".$coun."}\n"; + } + elsif ($pon == 6) { + $xtex .= "%Quadratic Bzier curve\n"; + qbez($po[1],$po[2],$po[3],$po[4],$po[5],$po[6]); + } + elsif ($pon == 8) { + $xtex .= "%Cubic Bzier curve\n"; + cbez($po[1],$po[2],$po[3],$po[4],$po[5],$po[6],$po[7],$po[8]); + } + } +} +#________________________________________________________ +# Arrows +foreach (@vector) { + @ve = split; + if ($cflag) { + $xtex .= "%Arrows\n"; + $cflag = 0; + } + $ve[1] = (-1) * $ve[1]; + $ve[3] = (-1) * $ve[3]; + $ve[5] = (-1) * $ve[5]; + $ve[7] = (-1) * $ve[7]; + bound($ve[0],$ve[1]); + bound($ve[2],$ve[3]); + bound($ve[6],$ve[7]); + $vu0 = $ve[4] + ($ve[0] - $ve[4]) / $ul; + $vu1 = $ve[5] + ($ve[1] - $ve[5]) / $ul; + $vu2 = $ve[4] + ($ve[2] - $ve[4]) / $ul; + $vu3 = $ve[5] + ($ve[3] - $ve[5]) / $ul; + $vu6 = $ve[4] + ($ve[6] - $ve[4]) / $ul; + $vu7 = $ve[5] + ($ve[7] - $ve[5]) / $ul; + tri($red,$vu0,$vu1,$vu2,$vu3,$ve[4],$ve[5]); + tri($red,$vu0,$vu1,$vu6,$vu7,$ve[4],$ve[5]); +} +#________________________________________________________ +# Conics +$cflag = 1; +foreach (@conic) { + @po = split; + $p0 = $po[0]; + if ($p0 ne $yellow) { + if ($cflag) { + $xtex .= "%Conics\n"; + $cflag = 0; + } + $po[2] = (-1) * $po[2]; + $po[4] = (-1) * $po[4]; + $po[6] = (-1) * $po[6]; + $po[8] = (-1) * $po[8]; + cbez($po[1],$po[2],$po[3],$po[4],$po[5],$po[6],$po[7],$po[8]); + } +} +#________________________________________________________ +# Circles, halves and quarters of circles +$cflag = 1; +$aflag = 1; +foreach (@circle) { + @po = split; + $p0 = $po[0]; + if ($p0 ne $yellow) { + $po[2] = (-1) * $po[2]; + if ($po[4] > 1.0E-3 or abs($po[5] - 360) > 1.0E-3) { + if ($aflag) { + $xtex .= "%Arcs\n"; + $aflag = 0; + } + $arce = ($po[4] > 0) ? 360 - $po[4] : 0; + $arcb = ($po[5] > 0) ? 360 - $po[5] : 0; + $darc = $arce - $arcb; + if ($darc < 0) {$darc += 360} + $quar = int($darc / 90); + $lq = ($p0 eq $darkgreen) ? $pointf : $bezf; + if ($quar > 0) { + for (my $k = 1; $k <= $quar; $k++) { + quart($po[1],$po[2],$po[3],$arcb,$lq); + $arcb += 90; + if ($arcb > 360) {$arcb -= 360} + } + } + if ($darc > $quar * 90) { + arc($po[1],$po[2],$po[3],$arcb,$arce,$lq); + } + } + else { + if ($cflag) { + $xtex .= "%Circles, halves and quarters of circles\n"; + $cflag = 0 + } + if ($p0 eq $navy) { + quart($po[1],$po[2],$po[3],0,$bezf); + quart($po[1],$po[2],$po[3],90,$bezf); + quart($po[1],$po[2],$po[3],180,$bezf); + quart($po[1],$po[2],$po[3],270,$bezf); + } + elsif ($p0 eq $purple) { + quart($po[1],$po[2],$po[3],90,$bezf); + quart($po[1],$po[2],$po[3],180,$bezf); + } + elsif ($p0 eq $red) { + quart($po[1],$po[2],$po[3],0,$bezf); + quart($po[1],$po[2],$po[3],270,$bezf); + } + elsif ($p0 eq $orange) { + quart($po[1],$po[2],$po[3],180,$bezf); + quart($po[1],$po[2],$po[3],270,$bezf); + } + elsif ($p0 eq $darkbrown) { + quart($po[1],$po[2],$po[3],0,$bezf); + quart($po[1],$po[2],$po[3],90,$bezf); + } + elsif ($p0 eq $blue) { + quart($po[1],$po[2],$po[3],180,$bezf); + } + elsif ($p0 eq $green) { + quart($po[1],$po[2],$po[3],90,$bezf); + } + elsif ($p0 eq $brown) { + quart($po[1],$po[2],$po[3],270,$bezf); + } + elsif ($p0 eq $violet) { + quart($po[1],$po[2],$po[3],0,$bezf); + } + elsif ($p0 eq $darkgreen) { + quart($po[1],$po[2],$po[3],0,$pointf); + quart($po[1],$po[2],$po[3],90,$pointf); + quart($po[1],$po[2],$po[3],180,$pointf); + quart($po[1],$po[2],$po[3],270,$pointf); + } + } + } +} +#________________________________________________________ +# Arcs +$aflag = 1; +foreach (@arc) { + @po = split; + if ($aflag) { + $xtex .= "%Arcs\n"; + $aflag = 0; + } + $po[2] = (-1) * $po[2]; + $arcb = ($po[4] > 0) ? 360 - $po[4] : 0; + $arce = ($po[5] > 0) ? 360 - $po[5] : 0; + $darc = $arce - $arcb; + if ($darc < 0) {$darc += 360} + $quar = int($darc / 90); + $lq = ($po[0] eq $darkgreen) ? $pointf : $bezf; + if ($quar > 0) { + for (my $k = 1; $k <= $quar; $k++) { + quart($po[1],$po[2],$po[3],$arcb,$lq); + $arcb += 90; + if ($arcb > 360) {$arcb -= 360} + } + } + if ($darc > $quar * 90) { + arc($po[1],$po[2],$po[3],$arcb,$arce,$lq); + } +} +#________________________________________________________ +# Frame +if ($bmax > 500) { + $bmax = 100 * ceil($bmax / 100); + $btex .= "\\renewcommand{\\qbeziermax}{".$bmax."}\n"; +} +if ($xtex . $mtex ne "") { +$xtex = $btex."\\begin{document}\n\n\\setlength{\\unitlength}{". +$ul."pt}\n"."\\begin{picture}(".ceil(($xmax - $xmin)).",". +ceil(($ymax - $ymin)).")(".floor($xmin).",".floor($ymin).")\n". +"\\linethickness{0.8pt}\n"."\\thicklines\n".$xtex; +$xtex .= $mtex."\\end{picture}\n\n\\end{document}"; +} +print $xtex."\n"; +# +#________________________________________________________ +# Lines +sub lin { + my ($c,$xb,$yb,$xe,$ye) = @_; + if (($c eq $green) or ($c eq $violet) or ($c eq $orange) or + ($c eq $purple) or ($c eq $navy)) { + $dx = $xe - $xb; + $dy = $ye - $yb; + $xbu = sp($xb / $ul); + $ybu = sp($yb / $ul); + if (abs($dx) < 1.0E-6) { + $sy = $dy <=> 0; + $leu = sp(abs($dy / $ul)); + $xtex .= "\\put(".$xbu.",".$ybu."){\\line(0,".$sy."){".$leu."}}\n"; + } + elsif (abs($dy) < 1.0E-6) { + $sx = $dx <=> 0; + $leu = sp(abs($dx / $ul)); + $xtex .= "\\put(".$xbu.",".$ybu."){\\line(".$sx.",0){".$leu."}}\n"; + } + else { + $flag1 = 1; + foreach $j (0,1,2,3,4,5,6,8,10,12,13,15,16,18,20,22,24,25,26,27,29,30,34) { + $num = int($j / 6) + 1; + $den = ($j % 6) + 1; + if ($den < $num) { + $lem = (int(10 * $den / $num) + 1) / $ul; + } + else { + $lem = 10 / $ul; + } + if (abs((abs($dy / $dx)) - $num / $den) < 5.0E-4) { + if ($dy < 0) { + $num = -$num; + } + if ($dx < 0) { + $den = -$den; + } + $le = abs($dx); + $leu = sp(abs($dx) / $ul - 0.1); + if ($leu > $lem) { + $xtex .= "\\put(".$xbu.",".$ybu."){\\line(".$den.",".$num."){".$leu."}}\n"; + $flag1 = 0; + last; + } + else { + last; + } + } + } + if ($flag1) { + if (not $thicknessflag) { + $xtex .= "\\linethickness{0.8pt}\n"; + $thicknessflag = 1; + } + $len = floor($bezf * (sqrt(($xe - $xb)**2 + ($ye - $yb)**2))); + if ($len > 0) { + if ($len > $bmax) {$bmax = $len} + $xeu = sp($xe / $ul); + $yeu = sp($ye / $ul); + $xtex .= "\\Lbezier[".$len."](".$xbu.",".$ybu.")(".$xeu.",".$yeu.")\n"; + } + } + } + } + elsif ($c eq $darkgreen) { + # Dotted line + if ($thicknessflag) { + $xtex .= "%Dotted line\n\\linethickness{1.2pt}\n"; + $thicknessflag = 0; + } + $len = floor($pointf * (sqrt(($xe - $xb)**2 + ($ye - $yb)**2))); + if ($len > 0) { + if ($len > $bmax) {$bmax = $len} + $xbu = sp($xb / $ul); + $ybu = sp($yb / $ul); + $xeu = sp($xe / $ul); + $yeu = sp($ye / $ul); + $xtex .= "\\Lbezier[".$len."](".$xbu.",".$ybu.")(".$xeu.",".$yeu.")\n"; + } + } +} +#________________________________________________________ +# Triangles +sub tri { +my ($q0,$qx1,$qy1,$qx2,$qy2,$qx3,$qy3) = @_; + $qx1 = $qx1 * $ul; + $qy1 = $qy1 * $ul; + $qx2 = $qx2 * $ul; + $qy2 = $qy2 * $ul; + $qx3 = $qx3 * $ul; + $qy3 = $qy3 * $ul; + if ($q0 eq $red) { +# Filled triangle + %ha = ($qx1,$qy1,$qx2+1e-07,$qy2+1e-07,$qx3+2e-07,$qy3+2e-07); + @hb = (); + @hc = (); + foreach (sort { $ha{$a} <=> $ha{$b} } keys %ha) { + $hb[++$#hb] = $_; + $hc[++$#hc] = $ha{$_}; + } + ($qx1,$qx2,$qx3) = @hb; + ($qy1,$qy2,$qy3) = @hc; + $lin = int(($qy3 - $qy1) * $fillf); + $xtex .= "%Filled triangle\n\\linethickness{0.1pt}\n"; + $si = ($qy3 - $qy1) * $qx2 - ($qx3 - $qx1) * $qy2 - $qx1 * $qy3 + $qx3 * $qy1 <=> 0; + $dex = ($qx3 - $qx1) / ($qy3 - $qy1) / $fillf; + $d1 = $qy2 - $qy1; + $d2 = $qy3 - $qy2; + if ($d1 >= 1.0E-3) { + $fx1 = ($qx2 - $qx1) / $d1; + $sx1 = $qx1 - $qy1 * $fx1; + } + if ($d2 >= 1.0E-3) { + $fx2 = ($qx3 - $qx2) / $d2; + $sx2 = $qx2 - $qy2 * $fx2; + } + for ($k = 1; $k <= $lin; $k++) { + $xb = $qx1 + $k * $dex; + $yb = $qy1 + $k / $fillf; + if ($yb <= $qy2) { + if ($d1 >= 1.0E-3) { + $leu = sp((abs($sx1 + $yb * $fx1 - $xb) + 0.5) / $ul); + } + else { + $leu = sp((abs($qx2 - $qx1) + 0.5)/ $ul); + } + } + else { + if ($d2 >= 1.0E-3) { + $leu = sp((abs($sx2 + $yb * $fx2 - $xb) + 0.5)/ $ul); + } + else { + $leu = sp((abs($qx3 - $qx2) + 0.5)/ $ul); + } + } + if ($si > 0) { + $xbu = sp($xb / $ul); + } + else { + $xbu = sp($xb / $ul); + } + $ybu = sp($yb / $ul); + $xtex .= "\\put(".$xbu.",".$ybu."){\\line(".$si.",0){".$leu."}}\n"; + } + $xtex .= "\\linethickness{0.8pt}\n"; + } + elsif (($q0 eq $purple) or ($q0 eq $darkbrown)) { +# Dotted triangle + %ha = ($qx1,$qy1,$qx2+1e-07,$qy2+1e-07,$qx3+2e-07,$qy3+2e-07); + @hb = (); + @hc = (); + foreach (sort { $ha{$a} <=> $ha{$b} } keys %ha) { + $hb[++$#hb] = $_; + $hc[++$#hc] = $ha{$_}; + } + ($qx1,$qx2,$qx3) = @hb; + ($qy1,$qy2,$qy3) = @hc; + $xtex .= "%Dotted triangle\n"; + $si = ($qy3 - $qy1) * $qx2 - ($qx3 - $qx1) * $qy2 - $qx1 * $qy3 + $qx3 * $qy1 <=> 0; + $dy1 = 2 * ceil($qy1 / 2); + $dy3 = 2 * floor($qy3 / 2); + $lin = $dy3 - $dy1; + $dex = ($qx3 - $qx1) / ($qy3 - $qy1); + $xbh = $qx1 + ($dy1 - $qy1 - 2.0) * $dex; + $dex = 2 * $dex; + $d1 = $qy2 - $qy1; + $d2 = $qy3 - $qy2; + if ($d1 >= 1.0E-3) { + $fx1 = ($qx2 - $qx1) / $d1; + $sx1 = $qx1 + ($dy1 - $qy1) * $fx1; + } + if ($d2 >= 1.0E-3) { + $fx2 = ($qx3 - $qx2) / $d2; + $sx2 = $qx2 + ($dy1 - $qy2) * $fx2; + } + for ($k = 0; $k <= $lin; $k += 2) { + $qy = $dy1 + $k; + $xbh = $xbh + $dex; + ($si > 0) ? ($xb = $xbh) : ($xe = $xbh); + if ($qy <= $qy2) { + ($d1 >= 1.0E-3) ? ($xeh = $sx1 + $k * $fx1) : ($xeh = $qx1); + } + else { + ($d2 >= 1.0E-3) ? ($xeh = $sx2 + $k * $fx2) : ($xeh = $qx2); + } + ($si > 0) ? ($xe = $xeh) : ($xb = $xeh); + $xb = 2 * ceil($xb / 2); + $xbd = $xb + (($xb + $qy) % 4); + ($xe >= $xbd) ? ($num = floor(($xe - $xbd) / 4) + 1) : ($num = 0); + if (not $thicknessflag) { + $xtex .= "\\linethickness{0.8pt}\n"; + $thicknessflag = 1; + } + $xbu = sp($xbd / $ul); + $qyu = sp($qy / $ul); + $xtex .= "\\multiput(".$xbu.",".$qyu.")(".$uli.",0){".$num; + $xtex .= "}{\\line(1,0){".$ule."}}\n"; + } + } + elsif (($q0 eq $orange) or ($q0 eq $brown)) { +#Hatched triangle + $xtex .= "%Hatched triangle\n"; + $d1 = $qx1 - $qy1; + $d2 = $qx2 - $qy2; + $d3 = $qx3 - $qy3; + $qd1 = $d1; + $qd2 = $d2; + $qd3 = $d3; + %ha = ($qx1,$qd1,$qx2+1e-07,$qd2+1e-07,$qx3+2e-07,$qd3+2e-07); + @hb = (); + foreach (sort { $ha{$a} <=> $ha{$b} } keys %ha) { + $hb[++$#hb] = $_; + } + ($qx1,$qx2,$qx3) = @hb; + %ha = ($qy1,$qd1,$qy2+1e-07,$qd2+1e-07,$qy3+2e-07,$qd3+2e-07); + @hb = (); + @hc = (); + foreach (sort { $ha{$a} <=> $ha{$b} } keys %ha) { + $hb[++$#hb] = $_; + $hc[++$#hc] = $ha{$_}; + } + ($qy1,$qy2,$qy3) = @hb; + ($d1,$d2,$d3) = @hc; + $si = (-$qy3 + $qy1) * $qx2 + ($qx3 - $qx1) * $qy2 + $qx1 * $qy3 - $qx3 * $qy1 <=> 0; + $p1 = 4 * ceil($d1 / 4); + $p2 = 4 * floor($d2 / 4); + $p3 = 4 * floor($d3 / 4); + $fx1 = ($qx1 - $qx3) / ($d3 - $d1); + $sx1 = $qx3 + $fx1 * $d3; + $fy1 = ($qy1 - $qy3) / ($d3 - $d1); + $sy1 = $qy3 + $fy1 * $d3; + $d21 = $d2 - $d1; + $d32 = $d3 - $d2; + if ($d21 >= 1.0E-3) { + $fx2 = ($qx1 - $qx2) / $d21; + $sx2 = $qx2 + $fx2 * $d2; + } + if ($d32 >= 1.0E-3) { + $fx3 = ($qx2 - $qx3) / $d32; + $sx3 = $qx3 + $fx3 * $d3; + } + for ($k = $p1; $k <= $p3; $k += 4) { + $xbk = $sx1 - $k * $fx1; + $ybk = $sy1 - $k * $fy1; + if ($k <= $p2) { + ($d21 < 1.0E-3) ? ($le = abs($qx2 - $qx1)) : ($le = abs($sx2 - $k * $fx2 - $xbk)); + } + else { + ($d32 < 1.0E-3) ? ($le = abs($qx3 - $qx2)) : ($le = abs($sx3 - $k * $fx3 - $xbk)); + } + lin($green,$xbk,$ybk,$xbk + $si * $le,$ybk + $si * $le); + } + } +} +#________________________________________________________ +# Rectangles +sub rect { + my ($q0,$x1,$y1,$x2,$y2,$x3,$y3,$x4,$y4) = @_; + $dx = abs($x2 - $x1); + $dx = ($dx < 1.0E-6) ? abs($x3 -$x2) : $dx; + $dx = $dx * $ul; + $xb = ($x1 < $x2) ? (($x1 < $x3) ? $x1 : $x3) : (($x2 < $x3) ? $x2 : $x3); + $xb = $xb * $ul; + $dy = abs($y2 - $y1); + $dy = ($dy < 1.0E-6) ? abs($y3 -$y2) : $dy; + $dy = $dy * $ul; + $yb = ($y1 < $y2) ? (($y1 < $y3) ? $y1 : $y3) : (($y2 < $y3) ? $y2 : $y3); + $yb = $yb * $ul; + $xe = $xb + $dx; + $ye = $yb + $dy; +# Filled rectangle + if ($q0 eq $red) { + $xtex .= "%Filled rectangle\n\\linethickness{0.1pt}\n"; + $lin = 5 * $dx; + if ($dy <= $dx) { + $ybf = $yb - 0.2; + $xbu = sp($xb / $ul); + $dxu = sp($dx / $ul); + for ($k = 0; $k <= $lin; $k++) { + $ybf += 0.2; + $ybu = sp($ybf / $ul); + $xtex .= "\\put(".$xbu.",".$ybu."){\\line(1,0){".$dxu."}}\n"; + } + } + else { + $xbf = $xb - 0.2; + $ybu = sp($yb / $ul); + $dyu = sp($dy / $ul); + for ($k = 0; $k <= $lin; $k++) { + $xbf += 0.2; + $xbu = sp($xbf / $ul); + $xtex .= "\\put(".$xbu.",".$ybu."){\\line(0,1){".$dyu."}}\n"; + } + } + $xtex .= "\\linethickness{0.8pt}\n"; + } +# Dotted rectangle + elsif (($q0 eq $purple) or ($q0 eq $darkbrown)) { + $xtex .= "%Dotted rectangle\n"; + $xbb = 2 * ceil($xb / 2); + $ybb = 2 * ceil($yb / 2); + for ($k = 0; $k <= 2; $k += 2) { + $ybd = $ybb + $k; + $xbd = $xbb + (($xbb + $ybd) % 4); + $numx = floor(($xe - 0.13 - $xbd) / 4) + 1; + $numy = floor(($ye - 0.13 - $ybd) / 4) + 1; + $xbu = sp($xbd / $ul); + $ybu = sp($ybd / $ul); + $xtex .= "\\multiput(".$xbu.",".$ybu.")(".$uli.",0){".$numx; + $xtex .= "}{\\begin{picture}(0,0)\\multiput(0,0)(0,".$uli."){".$numy; + $xtex .= "}{\\line(1,0){".$ule."}}\\end{picture}}\n" + } + } +# Hatched rectangle + elsif (($q0 eq $orange) or ($q0 eq $brown)) { + $xtex .= "%Hatched rectangle\n"; + $p1 = 4 * ceil(($xb - $ye) / 4); + if ($dx >= $dy) { + $p2 = 4 * floor(($xb - $yb) / 4) + 4; + $p3 = 4 * floor(($xe - $ye) / 4) + 4; + $xp = $yb + $p2; + $yp = $yb; + $lp = $dy; + $ip1 = 4; + $ip2 = 0; + } + else { + $p3 = 4 * floor(($xb - $yb) / 4) + 4; + $p2 = 4 * floor(($xe - $ye) / 4) + 4; + $xp = $xb; + $yp = $xb - $p2; + $lp = $dx; + $ip1 = 0; + $ip2 = -4; + } + $p4 = 4 * floor(($xe - $yb) / 4); + for ($k = $p1; $k <= $p2 - 4; $k += 4) { + lin($green,$xb,$xb - $k,$ye + $k,$ye); + } + $np = ($p3 - $p2) / 4; + if ($p3 > $p2) { + if ($lp >= 10 / $ul) { + $xpu = sp($xp / $ul); + $ypu = sp($yp / $ul); + $ip1u = sp($ip1 / $ul); + $ip2u = sp($ip2 / $ul); + $lpu = sp($lp / $ul - 0.1); + $xtex .= "\\multiput(".$xpu.",".$ypu.")(".$ip1u.",".$ip2u; + $xtex .= "){".$np."}{\\line(1,1){".$lpu."}}\n"; + } + else { + for ($k = 0; $k <=$np -1; $k++) { + $u = $xp + $k * $ip1; + $v = $yp + $k * $ip2; + lin($green,$u,$v,$u + $lp,$v + $lp); + } + } + } + for ($k = $p3; $k <= $p4; $k += 4) { + lin($green,$yb + $k,$yb,$xe,$xe - $k); + } + } +} +#________________________________________________________ +# Quadratic Bzier curve +sub qbez { + my ($x1,$y1,$x2,$y2,$x3,$y3) = @_; + $xb = $x1; + $yb = $y1; + $len = 0.0; + for ($t = 0.02; $t <= 1.0; $t += 0.02) { + bound($xb,$yb); + $s = 1.0 - $t; + $xe = $s * ($s * $x1 + $t * $x2) + $t * ($s * $x2 + $t * $x3); + $ye = $s * ($s * $y1 + $t * $y2) + $t * ($s * $y2 + $t * $y3); + $len += sqrt(($xe - $xb)**2 + ($ye - $yb)**2); + $xb = $xe; + $yb = $ye; + } + bound($x3,$y3); + $le = int($bezf * $len * $ul); + if ($le > $bmax) {$bmax = $le} + $x1 = sp($x1); + $y1 = sp($y1); + $x2 = sp($x2); + $y2 = sp($y2); + $x3 = sp($x3); + $y3 = sp($y3); + $xtex .= "\\Qbezier[".$le."](".$x1.",".$y1.")(".$x2.",".$y2; + $xtex .= ")(".$x3.",".$y3.")\n"; +} +#________________________________________________________ +# Cubic Bzier curve +# +sub cbez { + my ($x1,$y1,$x2,$y2,$x3,$y3,$x4,$y4) = @_; + $xb = $x1; + $yb = $y1; + $len = 0.0; + for ($t = 0.02; $t <= 1.0; $t += 0.02) { + bound($xb,$yb); + $s = 1.0 - $t; + $u1 = $s * $x1 + $t * $x2; + $v1 = $s * $y1 + $t * $y2; + $u2 = $s * $x2 + $t * $x3; + $v2 = $s * $y2 + $t * $y3; + $u3 = $s * $x3 + $t * $x4; + $v3 = $s * $y3 + $t * $y4; + $xe = $s * ($s * $u1 + $t * $u2) + $t * ($s * $u2 + $t * $u3); + $ye = $s * ($s * $v1 + $t * $v2) + $t * ($s * $v2 + $t * $v3); + $len += sqrt(($xe - $xb)**2 + ($ye - $yb)**2); + $xb = $xe; + $yb = $ye; + } + bound($x4,$y4); + $le = int($bezf * $len * $ul); + if ($le > 0) { + if ($le > $bmax) {$bmax = $le} + $x1 = sp($x1); + $y1 = sp($y1); + $x2 = sp($x2); + $y2 = sp($y2); + $x3 = sp($x3); + $y3 = sp($y3); + $x4 = sp($x4); + $y4 = sp($y4); + $xtex .= "\\cbezier[".$le."](".$x1.",".$y1.")(".$x2.","; + $xtex .= $y2.")(".$x3.",".$y3.")(".$x4.",".$y4.")\n"; + } +} +#________________________________________________________ +# Quarters of circles +# +sub quart { + my ($xm,$ym,$r,$al,$bf) = @_; + if ($al == 0) { + $dx1 = $r; + $dy1 = 0; + } + elsif ($al == 90) { + $dx1 = 0; + $dy1 = $r; + } + elsif ($al == 180) { + $dx1 = (-1) * $r; + $dy1 = 0; + } + elsif ($al == 270) { + $dx1 = 0; + $dy1 = (-1) * $r; + } + else { + $al1 = $al * $Pi / 180; + $dx1 = $r * cos($al1); + $dy1 = $r * sin($al1); + $gal = 90 * ceil($al / 90); + if (($gal == 0) and ($al != 0)) { + $gx1 = $r; + $gy1 = 0; + } + elsif (($gal == 90) and ($al != 90)) { + $gx1 = 0; + $gy1 = $r; + } + elsif (($gal == 180) and ($al != 180)) { + $gx1 = (-1) * $r; + $gy1 = 0; + } + elsif (($gal == 270) and ($al != 270)) { + $gx1 = 0; + $gy1 = (-1) * $r; + } + bound($xm + $gx1,$ym + $gy1); + } + $dx4 = (-1) * $dy1; + $dy4 = $dx1; + $x1 = $xm + $dx1; + $y1 = $ym + $dy1; + $x4 = $xm + $dx4; + $y4 = $ym + $dy4; + bound($x1,$y1); + bound($x4,$y4); + $x2 = $x1 + $l90 * $dx4; + $y2 = $y1 + $l90 * $dy4; + $x3 = $x4 + $l90 * $dx1; + $y3 = $y4 + $l90 * $dy1; + $le = int($bf * $Pi * $r * $ul/ 2); + if ($le > $bmax) {$bmax = $le} + $x1 = sp($x1); + $y1 = sp($y1); + $x2 = sp($x2); + $y2 = sp($y2); + $x3 = sp($x3); + $y3 = sp($y3); + $x4 = sp($x4); + $y4 = sp($y4); + $xtex .= "\\cbezier[".$le."](".$x1.",".$y1.")(".$x2; + $xtex .= ",".$y2.")(".$x3.",".$y3.")(".$x4.",".$y4.")\n"; +} +#________________________________________________________ +# Short arcs +sub arc { + my ($xm,$ym,$r,$al,$be,$bf) = @_; + $al1 = $al * $Pi / 180; + $be1 = $be * $Pi / 180; + $dx1 = $r * cos($al1); + $dy1 = $r * sin($al1); + $dx4 = $r * cos($be1); + $dy4 = $r * sin($be1); + $x1 = $xm + $dx1; + $y1 = $ym + $dy1; + $x4 = $xm + $dx4; + $y4 = $ym + $dy4; + bound($x1,$y1); + bound($x4,$y4); + $gal = 90 * int($al / 90); + $gbe = 90 * int($be / 90); + if ($gal != $gbe) { + if ($gbe == 0) { + $gx1 = $r; + $gy1 = 0; + } + elsif ($gbe == 90) { + $gx1 = 0; + $gy1 = $r; + } + elsif ($gbe == 180) { + $gx1 = (-1) * $r; + $gy1 = 0; + } + elsif ($gbe == 270) { + $gx1 = 0; + $gy1 = (-1) * $r; + } + bound($xm + $gx1,$ym + $gy1); + } + $aux = 4 * (2 * $r - sqrt(($dx1 + $dx4)**2 + ($dy1 + $dy4)**2)) / 3; + $lam = $aux / sqrt(($dx1 - $dx4)**2 + ($dy1 - $dy4)**2); + $x2 = $x1 - $lam * $dy1; + $y2 = $y1 + $lam * $dx1; + $x3 = $x4 + $lam * $dy4; + $y3 = $y4 - $lam * $dx4; + $d1 = abs($al1 - $be1); + if ($d1 > $Pi / 2) {$d1 = 2 * $Pi - $d1} + $le = int($bf * $d1 * $r * $ul); + if ($le > $bmax) {$bmax = $le} + $x1 = sp($x1); + $y1 = sp($y1); + $x2 = sp($x2); + $y2 = sp($y2); + $x3 = sp($x3); + $y3 = sp($y3); + $x4 = sp($x4); + $y4 = sp($y4); + $xtex .= "\\cbezier[".$le."](".$x1.",".$y1.")(".$x2.","; + $xtex .= $y2.")(".$x3.",".$y3.")(".$x4.",".$y4.")\n"; +} +#________________________________________________________ +# Bounding box +sub bound { + my ($xn,$yn) = @_; + if ($sflag) { + $xmin = $xn; + $xmax = $xn; + $ymin = $yn; + $ymax = $yn; + $sflag = 0; + } + else { + if ($xn < $xmin) {$xmin = $xn} elsif ($xmax < $xn) {$xmax = $xn} + if ($yn < $ymin) {$ymin = $yn} elsif ($ymax < $yn) {$ymax = $yn} + } +} +#________________________________________________________ +# Sprintf +sub sp { + my $x = shift; + return sprintf("%.3f",$x) + 0; +} +#________________________________________________________ |