10) ){ $runden=2; } $deltadeg=$phiedeg-$phiadeg; if (($anz < 2)OR($anz > 1000) ){ $anz=max(3,ceil(abs($deltadeg)/30)); } $phia=$phiadeg*M_PI/180; $phie=$phiedeg*M_PI/180; $delta=$deltadeg*M_PI/180; $rd=$re-$ra; # Datensatz erzeugen / Interpolation $dphi=$delta/$anz; $dr=$rd/$anz; for ($j = 0; $j <= $anz; $j++) { $tt=$dphi*$j; $cpi=cos($tt+$phia); $spi=sin($tt+$phia); $ri=$ra+$dr*$j; # Punkte / points $xx=$ri*$cpi; $yy=$ri*$spi; # Ableitungen / derivatives ... $dx=$dr*$cpi -$dphi*$ri*$spi; $dy=$dr*$spi +$dphi*$ri*$cpi; # Daten speichern / save data $data[$j][0]=$xx+$cx; $data[$j][1]=$yy+$cy; $data[$j][2]=$dx; $data[$j][3]=$dy; } # Aus den Ableitungen die Kontrollpunkte berechnen # (generate control points from derivatives) for ($j = 0; $j <= $anz; $j++) { $dout[$j][2]=round($data[$j][0]+$data[$j][2]/3,$runden); $dout[$j][3]=round($data[$j][1]+$data[$j][3]/3,$runden); $dout[$j][4]=round($data[$j][0]-$data[$j][2]/3,$runden); $dout[$j][5]=round($data[$j][1]-$data[$j][3]/3,$runden); # und nun erst Punkte runden / and now round points $dout[$j][0]=round($data[$j][0],$runden); $dout[$j][1]=round($data[$j][1],$runden); } # Daraus Pfad bestimmen und malen der Punkte vorbereiten # (generate path data and prepare for painting) $pfada=' C'.$dout[0][2].','.$dout[0][3].' '.$dout[1][4].','.$dout[1][5].' '.$dout[1][0].','.$dout[1][1]." S\n"; for ($j = 2; $j <=$anz; $j++) { $pfada.=$dout[$j][4].','.$dout[$j][5].' '.$dout[$j][0].','.$dout[$j][1]."\n"; } return $pfada; } # erzeugt quadratisches polares Fragment / creates quadratic polar fragment function pfad_J($runden,$anz,$r0,$p0,$r1,$p1,$r2,$p2,$cx,$cy) { if (($runden < 0)OR($runden > 10) ){ $runden=2; } $deltadeg=abs($p0-$p1)+abs($p1-$p2); if (($anz < 2)OR($anz > 1000) ){ $anz=max(3,ceil(abs($deltadeg)/30)); } $p0=$p0*M_PI/180; $p1=$p1*M_PI/180; $p2=$p2*M_PI/180; for ($j = 0; $j <= $anz; $j++) { $u=$j/$anz; $ur=(1-$u); $x1=$ur*$ur*$p0+2*$u*$ur*$p1 + $u*$u*$p2; $y1=$ur*$ur*$r0+ 2*$u*$ur*$r1 + $u*$u*$r2; # Ableitungen / derivatives ... $dphi=($ur*2*($p1-$p0) + $u*2*($p2-$p1))/$anz; $dr=($ur*2*($r1-$r0) + $u*2*($r2-$r1))/$anz; $cpi=cos($x1); $spi=sin($x1); $ri=$y1; # Punkte / points $xx=$ri*$cpi; $yy=$ri*$spi; # Ableitungen / derivatives ... $dx=$dr*$cpi -$dphi*$ri*$spi; $dy=$dr*$spi +$dphi*$ri*$cpi; # Daten speichern / save data $data[$j][0]=$xx+$cx; $data[$j][1]=$yy+$cy; $data[$j][2]=$dx; $data[$j][3]=$dy; } # Aus den Ableitungen die Kontrollpunkte berechnen # (generate control points from derivatives) for ($j = 0; $j <= $anz; $j++) { $dout[$j][2]=round($data[$j][0]+$data[$j][2]/3,$runden); $dout[$j][3]=round($data[$j][1]+$data[$j][3]/3,$runden); $dout[$j][4]=round($data[$j][0]-$data[$j][2]/3,$runden); $dout[$j][5]=round($data[$j][1]-$data[$j][3]/3,$runden); # und nun erst Punkte runden / and now round points $dout[$j][0]=round($data[$j][0],$runden); $dout[$j][1]=round($data[$j][1],$runden); } # Daraus Pfad bestimmen und malen der Punkte vorbereiten # (generate path data and prepare for painting) $pfada=' C'.$dout[0][2].','.$dout[0][3].' '.$dout[1][4].','.$dout[1][5].' '.$dout[1][0].','.$dout[1][1]." S\n"; for ($j = 2; $j <=$anz; $j++) { $pfada.=$dout[$j][4].','.$dout[$j][5].' '.$dout[$j][0].','.$dout[$j][1]."\n"; } return $pfada; } # erzeugt kubisches polares Fragment / creates cubic polar fragment function pfad_K($runden,$anz,$r0,$p0,$r1,$p1,$r2,$p2,$r3,$p3,$cx,$cy) { if (($runden < 0)OR($runden > 10) ){ $runden=2; } $deltadeg=abs($p0-$p1)+abs($p1-$p2)+abs($p2-$p3); if (($anz < 2)OR($anz > 1000) ){ $anz=max(3,ceil(abs($deltadeg)/30)); } $p0=$p0*M_PI/180; $p1=$p1*M_PI/180; $p2=$p2*M_PI/180; $p3=$p3*M_PI/180; for ($j = 0; $j <= $anz; $j++) { $u=$j/$anz; $ur=(1-$u); $x1=$ur*$ur*$ur*$p0+3*$u*$ur*$ur*$p1 +3*$u*$u*$ur*$p2+ $u*$u*$u*$p3; $y1=$ur*$ur*$ur*$r0+ 3*$u*$ur*$ur*$r1 + 3*$u*$u*$ur*$r2+ $u*$u*$u*$r3; # Ableitungen / derivatives ... $dphi=($ur*$ur*3*($p1-$p0) + $u*$ur*6*($p2-$p1) +$u*$u*3*($p3-$p2))/$anz; $dr=($ur*$ur*3*($r1-$r0) + $u*$ur*6*($r2-$r1) +$u*$u*3*($r3-$r2))/$anz; $cpi=cos($x1); $spi=sin($x1); $ri=$y1; # Punkte / points $xx=$ri*$cpi; $yy=$ri*$spi; # Ableitungen / derivatives ... $dx=$dr*$cpi -$dphi*$ri*$spi; $dy=$dr*$spi +$dphi*$ri*$cpi; # Daten speichern / save data $data[$j][0]=$xx+$cx; $data[$j][1]=$yy+$cy; $data[$j][2]=$dx; $data[$j][3]=$dy; } # Aus den Ableitungen die Kontrollpunkte berechnen # (generate control points from derivatives) for ($j = 0; $j <= $anz; $j++) { $dout[$j][2]=round($data[$j][0]+$data[$j][2]/3,$runden); $dout[$j][3]=round($data[$j][1]+$data[$j][3]/3,$runden); $dout[$j][4]=round($data[$j][0]-$data[$j][2]/3,$runden); $dout[$j][5]=round($data[$j][1]-$data[$j][3]/3,$runden); # und nun erst Punkte runden / and now round points $dout[$j][0]=round($data[$j][0],$runden); $dout[$j][1]=round($data[$j][1],$runden); } # Daraus Pfad bestimmen und malen der Punkte vorbereiten # (generate path data and prepare for painting) $pfada=' C'.$dout[0][2].','.$dout[0][3].' '.$dout[1][4].','.$dout[1][5].' '.$dout[1][0].','.$dout[1][1]." S\n"; for ($j = 2; $j <=$anz; $j++) { $pfada.=$dout[$j][4].','.$dout[$j][5].' '.$dout[$j][0].','.$dout[$j][1]."\n"; } return $pfada; } function pfad_analyse($d,$runden,$anz) { # Gültige Kommandos angeben, (E,e wissenschaftliche Notation! nie nutzbar!). # Man beachte, daß PHP bereits automatisch eine Menge Unfug in Zahlen verwandelt. # Note valid commands (E,e scientic notation! never usable) . # Note that PHP converts already a lot of nonesense to numbers automtically. $kom = array('F','f','G','g','H','h','I','i','J','j','K','k','N','n','P','p','R','r'); #$kom = array(A,a,B,b,C,c,D,d,F,f,G,g,H,h,I,i,J,j,K,k,L,l,M,m,N,n,O,o,P,p,Q,q,R,r,S,s,T,t,U,u,V,v,W,w,X,x,Y,y,Z,z); $kl=count($kom); $exit=FALSE; $d=str_replace(',', ' ', $d); $d=str_replace('r', 'R', $d); # h/p hier nicht brauchbar, die aktuelle Koordinate im Nutzerkoordinatensystem wird als 0,0 angesehen. # h/p is not useful here, the current coordinate in the user coordinate system is assumed to be 0,0. $d=str_replace('p', 'P', $d); $d=str_replace('h', 'P', $d); $d=str_replace('H', 'P', $d); # Problem von Koordinatenpaaren wie 100-200 beseitigen # remove problem with coordinate pairs like 100-200 $d=str_replace('0-', '0 -', $d); $d=str_replace('1-', '1 -', $d); $d=str_replace('2-', '2 -', $d); $d=str_replace('3-', '3 -', $d); $d=str_replace('4-', '4 -', $d); $d=str_replace('5-', '5 -', $d); $d=str_replace('6-', '6 -', $d); $d=str_replace('7-', '7 -', $d); $d=str_replace('8-', '8 -', $d); $d=str_replace('9-', '9 -', $d); $d=str_replace('.-', '. -', $d); # Koordinatenpaare wie 0.5.7 werden derzeit nicht korrekt separiert ... # coordinate pairs like 0.5.7 are currently not separated correctly ... # Leerzeichen komprimieren # compress whitespace $d=preg_replace('/\s\s+/', ' ', $d); $d=trim($d); # Zeichenkette in Einzelkommandos aufdröseln # feaze string into single commands $n=0; for ($j = 0; $j < $kl; $j++) { $such=$kom[$j]; $exit=FALSE; $pos=-1; do { $pos=strpos($d,$such,$pos+1); if ($pos===FALSE) { $exit=TRUE; } else { $wo[$n]=$pos; #echo $n.': '.$such.': '.$wo[$n]."\n"; $n=$n+1; } } while (!$exit); } $wo[$n]=strlen($d); sort($wo); for ($j = 0; $j < $n; $j++) { $lang=$wo[$j+1]-$wo[$j]; $data[$j]=substr($d,$wo[$j],$lang); #echo $data[$j]."\n"; } unset($d); $and=count($data); # Voreingestellte Werte für deformierte Pfadangaben # defaults in cause of illformed path data $cx=0; $cy=0; $rc=0; $pc=0; $ri=0; $pi=0; $dr=0; $dp=0; $pfad=''; $pfada=''; $begin=FALSE; # Kommando zerlegen und Pfad erzeugen # decompose command and make path for ($j = 0; $j < $and; $j++) { $data[$j]=trim($data[$j]); #echo $j.': '.$data[$j]."\n"; $k=substr($data[$j],0,1); $v=trim(substr($data[$j],1)); unset($c); #$c=split('[ ]', $v); $c=preg_split('[ ]', $v); #echo $k."\n"; #echo $c[0].' '.$c[1]."\n"; switch($k) { case 'P': if(isset($c[0])) { $cx=$c[0]; } if(isset($c[1])) { $cy=$c[1]; } break; case 'N': if(isset($c[0])) { $ri=$c[0]; } if(isset($c[1])) { $pi=$c[1]; } $rc=$ri; $pc=$pi; $pfada.=pfad_N($runden,$ri,$pi,$cx,$cy); $begin=TRUE; $dr=0; $dp=0; $ianz=floor(count($c)/2); if ($ianz > 1) { for ($i = 2; $i <= $ianz; $i++) { $ix=2*$i-2; $iy=2*$i-1; $r3=$c[$ix]; $p3=$c[$iy]; $pfada.=pfad_I($runden,$anz,$rc,$pc,$r3,$p3,$cx,$cy); $dr=$r3-$rc; $dp=$p3-$pc; $rc=$r3; $pc=$p3; } } break; case 'n': if(isset($c[0])) { $ri=$rc+$c[0]; } if(isset($c[1])) { $pi=$pc+$c[1]; } $rc=$ri; $pc=$pi; $pfada.=pfad_N($runden,$ri,$pi,$cx,$cy); $begin=TRUE; $dr=0; $dp=0; $ianz=floor(count($c)/2); if ($ianz > 1) { for ($i = 2; $i <= $ianz; $i++) { $ix=2*$i-2; $iy=2*$i-1; $r3=$rc+$c[$ix]; $p3=$pc+$c[$iy]; $pfada.=pfad_I($runden,$anz,$rc,$pc,$r3,$p3,$cx,$cy); $dr=$r3-$rc; $dp=$p3-$pc; $rc=$r3; $pc=$p3; } } break; case 'I': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/2); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { $ix=2*$i-2; $iy=2*$i-1; $r3=$c[$ix]; $p3=$c[$iy]; $pfada.=pfad_I($runden,$anz,$rc,$pc,$r3,$p3,$cx,$cy); $dr=$r3-$rc; $dp=$p3-$pc; $rc=$r3; $pc=$p3; } } break; case 'i': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/2); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { $ix=2*$i-2; $iy=2*$i-1; $r3=$rc+$c[$ix]; $p3=$pc+$c[$iy]; $pfada.=pfad_I($runden,$anz,$rc,$pc,$r3,$p3,$cx,$cy); $dr=$r3-$rc; $dp=$p3-$pc; $rc=$r3; $pc=$p3; } } break; case 'J': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/4); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { $ic=4*$i-4; $id=4*$i-3; $ix=4*$i-2; $iy=4*$i-1; $r1=$c[$ic]; $p1=$c[$id]; $r3=$c[$ix]; $p3=$c[$iy]; $pfada.=pfad_J($runden,$anz,$rc,$pc,$r1,$p1,$r3,$p3,$cx,$cy); $dr=2*($r3-$r1); $dp=2*($p3-$p1); if (($dr==0) AND ($dp==0)) { $dr=($r3-$rc); $dp=($p3-$pc); } $rc=$r3; $pc=$p3; } } break; case 'j': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/4); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { $ic=4*$i-4; $id=4*$i-3; $ix=4*$i-2; $iy=4*$i-1; $r1=$rc+$c[$ic]; $p1=$pc+$c[$id]; $r3=$rc+$c[$ix]; $p3=$pc+$c[$iy]; $pfada.=pfad_J($runden,$anz,$rc,$pc,$r1,$p1,$r3,$p3,$cx,$cy); $dr=2*($r3-$r1); $dp=2*($p3-$p1); if (($dr==0) AND ($dp==0)) { $dr=($r3-$rc); $dp=($p3-$pc); } $rc=$r3; $pc=$p3; } } break; case 'F': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/2); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { #$ic=4*$i-4; #$id=4*$i-3; $ix=2*$i-2; $iy=2*$i-1; $r1=$rc+$dr/2; $p1=$pc+$dp/2; $r3=$c[$ix]; $p3=$c[$iy]; $pfada.=pfad_J($runden,$anz,$rc,$pc,$r1,$p1,$r3,$p3,$cx,$cy); $dr=2*($r3-$r1); $dp=2*($p3-$p1); if (($dr==0) AND ($dp==0)) { $dr=($r3-$rc); $dp=($p3-$pc); } $rc=$r3; $pc=$p3; } } break; case 'f': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/2); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { $ix=2*$i-2; $iy=2*$i-1; $c[$ix]=$c[$ix]+$rc; $c[$iy]=$c[$iy]+$pc; } for ($i = 1; $i <= $ianz; $i++) { $ix=2*$i-2; $iy=2*$i-1; $r1=$rc+$dr/2; $p1=$pc+$dp/2; $r3=$c[$ix]; $p3=$c[$iy]; $pfada.=pfad_J($runden,$anz,$rc,$pc,$r1,$p1,$r3,$p3,$cx,$cy); $dr=2*($r3-$r1); $dp=2*($p3-$p1); if (($dr==0) AND ($dp==0)) { $dr=($r3-$rc); $dp=($p3-$pc); } $rc=$r3; $pc=$p3; } } break; case 'K': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/6); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { $ia=6*$i-6; $ib=6*$i-5; $ic=6*$i-4; $id=6*$i-3; $ix=6*$i-2; $iy=6*$i-1; $r1=$c[$ia]; $p1=$c[$ib]; $r2=$c[$ic]; $p2=$c[$id]; $r3=$c[$ix]; $p3=$c[$iy]; $pfada.=pfad_K($runden,$anz,$rc,$pc,$r1,$p1,$r2,$p2,$r3,$p3,$cx,$cy); $dr=3*($r3-$r2); $dp=3*($p3-$p2); if (($dr==0) AND ($dp==0)) { $dr=2*($r3-$r1); $dp=2*($p3-$p1); } if (($dr==0) AND ($dp==0)) { $dr=($r3-$rc); $dp=($p3-$pc); } $rc=$r3; $pc=$p3; } } break; case 'k': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/6); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { $ia=6*$i-6; $ib=6*$i-5; $ic=6*$i-4; $id=6*$i-3; $ix=6*$i-2; $iy=6*$i-1; $r1=$rc+$c[$ia]; $p1=$pc+$c[$ib]; $r2=$rc+$c[$ic]; $p2=$pc+$c[$id]; $r3=$rc+$c[$ix]; $p3=$pc+$c[$iy]; $pfada.=pfad_K($runden,$anz,$rc,$pc,$r1,$p1,$r2,$p2,$r3,$p3,$cx,$cy); $dr=3*($r3-$r2); $dp=3*($p3-$p2); if (($dr==0) AND ($dp==0)) { $dr=2*($r3-$r1); $dp=2*($p3-$p1); } if (($dr==0) AND ($dp==0)) { $dr=($r3-$rc); $dp=($p3-$pc); } $rc=$r3; $pc=$p3; } } break; case 'G': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/4); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { $ic=4*$i-4; $id=4*$i-3; $ix=4*$i-2; $iy=4*$i-1; $r1=$rc+$dr/3; $p1=$pc+$dp/3; $r2=$c[$ic]; $p2=$c[$id]; $r3=$c[$ix]; $p3=$c[$iy]; $pfada.=pfad_K($runden,$anz,$rc,$pc,$r1,$p1,$r2,$p2,$r3,$p3,$cx,$cy); $dr=3*($r3-$r2); $dp=3*($p3-$p2); if (($dr==0) AND ($dp==0)) { $dr=2*($r3-$r1); $dp=2*($p3-$p1); } if (($dr==0) AND ($dp==0)) { $dr=($r3-$rc); $dp=($p3-$pc); } $rc=$r3; $pc=$p3; } } break; case 'g': if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } $ianz=floor(count($c)/4); if ($ianz > 0) { for ($i = 1; $i <= $ianz; $i++) { $ic=4*$i-4; $id=4*$i-3; $ix=4*$i-2; $iy=4*$i-1; $c[$ic]=$c[$ic]+$rc; $c[$id]=$c[$id]+$pc; $c[$ix]=$c[$ix]+$rc; $c[$iy]=$c[$iy]+$pc; } for ($i = 1; $i <= $ianz; $i++) { $ic=4*$i-4; $id=4*$i-3; $ix=4*$i-2; $iy=4*$i-1; $r1=$rc+$dr/3; $p1=$pc+$dp/3; $r2=$c[$ic]; $p2=$c[$id]; $r3=$c[$ix]; $p3=$c[$iy]; $pfada.=pfad_K($runden,$anz,$rc,$pc,$r1,$p1,$r2,$p2,$r3,$p3,$cx,$cy); $dr=3*($r3-$r2); $dp=3*($p3-$p2); if (($dr==0) AND ($dp==0)) { $dr=2*($r3-$r1); $dp=2*($p3-$p1); } if (($dr==0) AND ($dp==0)) { $dr=($r3-$rc); $dp=($p3-$pc); } $rc=$r3; $pc=$p3; } } break; case 'R': $ianz=count($c); if ($ianz > 0) { $pc=$pc+floor($c[0])*360; } if ($ianz > 1) { $pi=$pi+floor($c[1])*360; } if ($ianz > 2) { if ($c[2] !=0) { $rc=-$rc; $pc=$pc-180; } } if ($ianz > 3) { if ($c[3] !=0) { $ri=-$ri; $pi=$pi-180; } } if(!$begin) { $pfada.=pfad_N($runden,$rc,$pc,$cx,$cy); $begin=TRUE; } #echo $rc.' '.$pc.' '.$ri.' '.$pi."\n"; $pfada.=pfad_I($runden,$anz,$rc,$pc,$ri,$pi,$cx,$cy); $pfada.="Z \n"; $dr=$ri-$rc; $dp=$pi-$pc; $rc=$ri; $pc=$pi; break; default: # beenden, wenn nichts paßt # finish, if nothing fits $j=$and; } #switch Ende } # Ende Kommando zerlegen und Pfad erzeugen return $pfada; } # Anleitung und Beispiel von: # Dr. O. Hoffmann, siehe http://hoffmann.bplaced.net/hilfe.php # ?>