'; echo 'AutoCons – Quellcode'; echo '
'; echo '

📜 AutoCons – PHP-Quellcode

'; echo "$total Zeilen  Â·  $size Bytes"; echo '← Zurück'; echo '⬇ Download autocons.php'; echo '
'; foreach ($lines as $i => $raw_line) { $nr = $i + 1; $lc = htmlspecialchars($raw_line); // Kommentare $lc = preg_replace('/^(\s*\/\/.*)$/', '$1', $lc); $lc = preg_replace('/^(\s*\*.*)$/', '$1', $lc); // Strings // String-Hervorhebung (einfache Anführungszeichen) $lc = preg_replace('/"([^&]*)"/','"$1"', $lc); // PHP-Keywords foreach (['function','return','global','if','else','foreach', 'for','while','switch','case','break','echo','exit', 'include','header','array_fill','array_merge'] as $kw) $lc = preg_replace('/\b('.preg_quote($kw,'/').')\b/', '$1', $lc); // Geometriefunktionen $lc = preg_replace('/\b(PW|PPW|LPP|PLL|LSP|LPDP|LPA|LPAV|KR|PKL|PKK|PZP|PAL|PALV|PLS|PD|AD|AX|AY)(?=\s*\()/', '$1', $lc); echo "\n"; } echo '
$nr$lc
'; exit; } // ============================================================ // Datenstrukturen // ============================================================ $ANZPKT = 300; $ANZLIN = 50; $ANZKR = 20; $virgo = 1.23456789e15; $P_ = array_fill(0, $ANZPKT, [$virgo, $virgo]); $L_ = array_fill(0, $ANZLIN, [$virgo, $virgo, $virgo]); $K_ = array_fill(0, $ANZKR, [$virgo, $virgo, $virgo]); $log = []; $steps = []; // Schritt-für-Schritt-Snapshots // Snapshot nach jedem Konstruktionsschritt speichern // Aktueller Konstruktionsteil: 'VT' oder 'RT' $currentPart = 'VT'; function snapshot(string $fn, string $desc) { global $P_, $L_, $K_, $steps, $virgo, $currentPart; // Nur definierte Punkte speichern (reduziert JSON-Größe) $pts = []; foreach ($P_ as $i => $p) { if ($p[0] < 1e14) $pts[$i] = [round($p[0],4), round($p[1],4)]; } $lns = []; foreach ($L_ as $i => $l) { if ($l[0] < 1e14) $lns[$i] = [round($l[0],6), round($l[1],6), round($l[2],6)]; } // Kreise mit Teil-Tag speichern (für korrekte SVG-Positionierung) $krs = []; foreach ($K_ as $i => $k) { if ($k[0] < 1e14) $krs[$i] = [round($k[0],4), round($k[1],4), round($k[2],4), $currentPart]; } $steps[] = ['fn'=>$fn, 'desc'=>$desc, 'part'=>$currentPart, 'P'=>$pts, 'L'=>$lns, 'K'=>$krs]; } // ============================================================ // Hilfsfunktionen // ============================================================ function sqr($a) { return $a * $a; } function logMsg($msg) { global $log; $log[] = $msg; } // ============================================================ // Geometrische Grundfunktionen (aus grafproc.prg) // ============================================================ function AX($p1,$p2){global $P_;return abs($P_[$p1][0]-$P_[$p2][0]);} function AY($p1,$p2){global $P_;return abs($P_[$p1][1]-$P_[$p2][1]);} function AD($p1,$p2){global $P_;return sqrt(sqr($P_[$p2][0]-$P_[$p1][0])+sqr($P_[$p2][1]-$P_[$p1][1]));} function SignR($r){return ($r>=0)?1.0:-1.0;} function PW($pnr,$x,$y){ global $P_; $P_[$pnr][0]=$x; $P_[$pnr][1]=$y; $desc="PW($pnr, ".round($x,3).", ".round($y,3).")"; logMsg($desc); snapshot('PW', $desc); } function PPW($pnr1,$pnr2,$dx,$dy){ global $P_; $P_[$pnr1][0]=$P_[$pnr2][0]+$dx; $P_[$pnr1][1]=$P_[$pnr2][1]+$dy; $desc="PPW($pnr1 <- $pnr2 +(".round($dx,3).",".round($dy,3).")) => (".round($P_[$pnr1][0],3).",".round($P_[$pnr1][1],3).")"; logMsg($desc); snapshot('PPW', $desc); } function RTG($mp,$pa,$pb){ global $P_; $R=($P_[$pa][0]-$P_[$mp][0])*($P_[$pb][1]-$P_[$mp][1]) -($P_[$pa][1]-$P_[$mp][1])*($P_[$pb][0]-$P_[$mp][0]); return ($R>0)?-1:(($R<0)?1:0); } function LPP($lnr,$p1,$p2){ global $P_,$L_; $L_[$lnr][0]=$P_[$p1][1]-$P_[$p2][1]; $L_[$lnr][1]=$P_[$p2][0]-$P_[$p1][0]; $L_[$lnr][2]=$P_[$p2][1]*$P_[$p1][0]-$P_[$p1][1]*$P_[$p2][0]; if($L_[$lnr][0]<0){$L_[$lnr][0]*=-1;$L_[$lnr][1]*=-1;$L_[$lnr][2]*=-1;} logMsg("LPP(L$lnr durch P$p1 und P$p2)"); snapshot('LPP', "LPP(L$lnr durch P$p1, P$p2)"); } function KR($knr,$pnr,$radi){ global $P_,$K_; $K_[$knr][0]=$P_[$pnr][0]; $K_[$knr][1]=$P_[$pnr][1]; $K_[$knr][2]=$radi; logMsg("KR(K$knr Mittelpunkt P$pnr, r=".round($radi,3).")"); snapshot('KR', "KR(K$knr um P$pnr, r=".round($radi,3).")"); } function PLL($pnr,$l1,$l2){ global $P_,$L_; $det=$L_[$l1][0]*$L_[$l2][1]-$L_[$l2][0]*$L_[$l1][1]; if(abs($det)<1e-10){logMsg("PLL: parallel ($l1,$l2)");return;} $P_[$pnr][0]=($L_[$l1][1]*$L_[$l2][2]-$L_[$l2][1]*$L_[$l1][2])/$det; $P_[$pnr][1]=($L_[$l1][2]*$L_[$l2][0]-$L_[$l2][2]*$L_[$l1][0])/$det; logMsg("PLL(P$pnr = Schnitt L$l1/L$l2) => (".round($P_[$pnr][0],3).",".round($P_[$pnr][1],3).")"); snapshot('PLL', "PLL(P$pnr = L$l1 ∩ L$l2) => (".round($P_[$pnr][0],3).",".round($P_[$pnr][1],3).")"); } function PZP($pneu,$p1,$p2,$prz){ global $P_; $P_[$pneu][0]=$P_[$p1][0]+($P_[$p2][0]-$P_[$p1][0])*$prz/100; $P_[$pneu][1]=$P_[$p1][1]+($P_[$p2][1]-$P_[$p1][1])*$prz/100; logMsg('PZP(P'.$pneu.' auf P'.$p1.'..P'.$p2.', '.round($prz,1).'%)'); snapshot('PZP', 'PZP(P'.$pneu.' auf P'.$p1.'..P'.$p2.', '.round($prz,1).'%)'); } function LSP($l2,$pnr,$l1){ global $P_,$L_; $L_[$l2][0]=-$L_[$l1][1]; $L_[$l2][1]=$L_[$l1][0]; $L_[$l2][2]=$L_[$l1][1]*$P_[$pnr][0]-$L_[$l1][0]*$P_[$pnr][1]; if($L_[$l2][0]<0){$L_[$l2][0]*=-1;$L_[$l2][1]*=-1;$L_[$l2][2]*=-1;} logMsg("LSP(L$l2 senkrecht zu L$l1 durch P$pnr)"); snapshot('LSP', "LSP(L$l2 ⊥ L$l1 durch P$pnr)"); } function LPDP($l2,$pnr,$l1){ global $P_,$L_; $L_[$l2][0]=$L_[$l1][0]; $L_[$l2][1]=$L_[$l1][1]; $L_[$l2][2]=-$L_[$l2][0]*$P_[$pnr][0]-$L_[$l2][1]*$P_[$pnr][1]; if($L_[$l2][0]<0){$L_[$l2][0]*=-1;$L_[$l2][1]*=-1;$L_[$l2][2]*=-1;} logMsg("LPDP(L$l2 parallel zu L$l1 durch P$pnr)"); snapshot('LPDP', "LPDP(L$l2 ∥ L$l1 durch P$pnr)"); } function PSL($pN,$pA,$lB){ global $P_,$L_; $A2=-$L_[$lB][1]; $B2=$L_[$lB][0]; $C2=$L_[$lB][1]*$P_[$pA][0]-$L_[$lB][0]*$P_[$pA][1]; $det=$L_[$lB][0]*$B2-$A2*$L_[$lB][1]; if(abs($det)<1e-10){logMsg("PSL: det=0");return;} $P_[$pN][0]=($L_[$lB][1]*$C2-$B2*$L_[$lB][2])/$det; $P_[$pN][1]=($L_[$lB][2]*$A2-$C2*$L_[$lB][0])/$det; } function LPA($l2,$abst,$l1){ global $L_; $L_[$l2][0]=$L_[$l1][0]; $L_[$l2][1]=$L_[$l1][1]; if($abst==0.0){$L_[$l2][2]=$L_[$l1][2];} elseif($L_[$l1][0]==0){$L_[$l2][2]=$L_[$l1][2]-$abst*$L_[$l1][1];} elseif($L_[$l1][1]!=0.0){$y=$abst*sqrt(1+sqr($L_[$l1][0]/$L_[$l1][1]));$L_[$l2][2]=$L_[$l1][2]-$y*$L_[$l1][1];} else{$L_[$l2][2]=$L_[$l1][2]-$abst*$L_[$l1][0];} if($L_[$l2][0]<0){$L_[$l2][0]*=-1;$L_[$l2][1]*=-1;$L_[$l2][2]*=-1;} logMsg("LPA(L$l2 parallel zu L$l1, Abstand=".round($abst,3).")"); snapshot('LPA', "LPA(L$l2 ∥ L$l1, Abst=".round($abst,3).")"); } function LPAV($l2,$abst,$l1){ global $L_; $L_[$l2][0]=$L_[$l1][0]; $L_[$l2][1]=$L_[$l1][1]; if($abst==0.0){$L_[$l2][2]=$L_[$l1][2];} elseif($L_[$l1][0]==0){$L_[$l2][2]=$L_[$l1][2]-$abst*$L_[$l1][1];} elseif($L_[$l1][1]!=0){ $y=$abst*sqrt(1+sqr($L_[$l1][0]/$L_[$l1][1])); if(-$L_[$l1][0]/$L_[$l1][1]>0)$y=-$y; $L_[$l2][2]=$L_[$l1][2]-$y*$L_[$l1][1]; }else{$L_[$l2][2]=$L_[$l1][2]-$abst*$L_[$l1][0];} if($L_[$l2][0]<0){$L_[$l2][0]*=-1;$L_[$l2][1]*=-1;$L_[$l2][2]*=-1;} } function PAL($Pnr,$altPnr,$abst,$Lnr){ global $L_; if($abst==0){PPW($Pnr,$altPnr,0,0);return;} $save=[];for($i=1;$i<=3;$i++)$save[$i]=$L_[$i]; LPA(3,0,$Lnr);LSP(1,$altPnr,3);LPA(2,$abst,3);PLL($Pnr,1,2); for($i=1;$i<=3;$i++)$L_[$i]=$save[$i]; } function PALV($Pnr,$altPnr,$abst,$Lnr){ global $L_; if($abst==0){PPW($Pnr,$altPnr,0,0);return;} $save=[];for($i=1;$i<=3;$i++)$save[$i]=$L_[$i]; LPA(3,0,$Lnr);LSP(1,$altPnr,3);LPAV(2,$abst,3);PLL($Pnr,1,2); for($i=1;$i<=3;$i++)$L_[$i]=$save[$i]; } function PLS($pN,$pA,$lB){ global $P_; PSL($pN,$pA,$lB); $P_[$pN][0]=2*$P_[$pN][0]-$P_[$pA][0]; $P_[$pN][1]=2*$P_[$pN][1]-$P_[$pA][1]; } function PKL($pnr,$knr,$lnr,$sp=1){ global $P_,$L_,$K_; $A1=$L_[$lnr][0];$B1=$L_[$lnr][1];$C1=$L_[$lnr][2]; $XM=$K_[$knr][0];$YM=$K_[$knr][1];$R=$K_[$knr][2]; $A2=-$B1;$B2=$A1;$C2=$B1*$XM-$A1*$YM; $D=$A1*$A1+$B1*$B1; $X0=(-$A1*$C1+$B1*$C2)/$D;$Y0=(-$A1*$C2-$B1*$C1)/$D; $PR=sqr($X0-$XM)+sqr($Y0-$YM);$R1=$R*$R-$PR;$EPS=0.0005*$R; if(abs($R1)<=$EPS){$P_[$pnr][0]=$X0;$P_[$pnr][1]=$Y0; snapshot('PKL', "PKL(P$pnr = K$knr ∩ L$lnr, Tangente)"); return 1;} if($R1<=0){logMsg("PKL: kein Schnitt");return 0;} $H=sqrt($R1);$D1=sqrt($D);$C=$B1/$D1;$D2=-$A1/$D1; if($sp==1){$P_[$pnr][0]=$X0+$H*$C;$P_[$pnr][1]=$Y0+$H*$D2;} else {$P_[$pnr][0]=$X0-$H*$C;$P_[$pnr][1]=$Y0-$H*$D2;} snapshot('PKL', "PKL(P$pnr = K$knr ∩ L$lnr, sp=$sp) => (".round($P_[$pnr][0],3).",".round($P_[$pnr][1],3).")"); return 2; } function PKK($pnr,$k1,$k2,$sp=1){ global $P_,$K_; $XM1=$K_[$k1][0];$YM1=$K_[$k1][1];$R1=$K_[$k1][2]; $XM2=$K_[$k2][0];$YM2=$K_[$k2][1];$R2=$K_[$k2][2]; $A=sqrt(sqr($XM2-$XM1)+sqr($YM2-$YM1)); if($A<1e-10||$A>=$R1+$R2||$A<=abs($R1-$R2)){logMsg("PKK: kein Schnitt ($k1,$k2)");return;} $H=sqrt(max(0,sqr($R1)*sqr($R2)*4-sqr(sqr($A)-sqr($R1)-sqr($R2))))/2/$A; $AX_=($XM2-$XM1)/$A;$AY_=($YM2-$YM1)/$A; $A1_=sqrt(max(0,sqr($R1)-sqr($H))); if($sp==1){$P_[$pnr][0]=$XM1+$A1_*$AX_-$H*$AY_;$P_[$pnr][1]=$YM1+$A1_*$AY_+$H*$AX_;} else {$P_[$pnr][0]=$XM1+$A1_*$AX_+$H*$AY_;$P_[$pnr][1]=$YM1+$A1_*$AY_-$H*$AX_;} logMsg("PKK(P$pnr = Schnitt K$k1/K$k2, sp=$sp) => (".round($P_[$pnr][0],3).",".round($P_[$pnr][1],3).")"); snapshot('PKK', "PKK(P$pnr = K$k1 ∩ K$k2, sp=$sp) => (".round($P_[$pnr][0],3).",".round($P_[$pnr][1],3).")"); } function PD($pneu,$palt,$mp,$betrag,$winkel='W',$sep=' '){ global $P_; if($betrag==0.0){PPW($pneu,$palt,0,0);return;} if(strtoupper($winkel)=='W'){ $Bogen=-2*M_PI*$betrag/360.0; }else{ $d=AD($mp,$palt); if($d<1e-10){PPW($pneu,$palt,0,0);return;} $R=$betrag/(2*$d); $Bogen=-2*atan($R/sqrt(max(1-$R*$R,1e-15))); } $x=$P_[$palt][0]-$P_[$mp][0];$y=$P_[$palt][1]-$P_[$mp][1]; $xr=$x*cos($Bogen)-$y*sin($Bogen);$yr=$x*sin($Bogen)+$y*cos($Bogen); $sep=strtoupper($sep); if($sep=='X'){$P_[$pneu][0]=$xr+$P_[$mp][0];$P_[$pneu][1]=$P_[$palt][1];} elseif($sep=='Y'){$P_[$pneu][0]=$P_[$palt][0];$P_[$pneu][1]=$yr+$P_[$mp][1];} else{$P_[$pneu][0]=$xr+$P_[$mp][0];$P_[$pneu][1]=$yr+$P_[$mp][1];} snapshot('PD', "PD(P$pneu = P$palt gedreht um P$mp, ".round($betrag,2)."°)"); } // ============================================================ // Catmull-Rom Spline → SVG cubic bezier path // ============================================================ $defaults = [ 'uBr'=>88.0,'uGe'=>94.0,'lKoe'=>168.0, 'uHg'=>16.0,'uTa'=>68.0,'lTV'=>0.0, 'uOa'=>28.0,'uHa'=>36.0,'lGe'=>20.0, 'lAr'=>60.0,'lOa'=>34.0,'lTa'=>40.0, 'lVo'=>42.0,'lBr'=>25.0,'lRue'=>38.0, 'lSu'=>12.5,'alfaSu'=>22.0, 'zBr'=>12.0,'hPo'=>0.50, 'bTAv'=>2.00,'bTAh'=>2.50, 'VHtv'=>-1.20,'VHth'=>0.80, 'VHh'=>1.50,'bSuM'=>1.00, 'bUb'=>2.00,'hSaT'=>-10.0, ]; // POST-Werte übernehmen $vals = $defaults; if (($_SERVER['REQUEST_METHOD'] ?? '') === 'POST') { foreach ($defaults as $k=>$def) if (isset($_POST[$k]) && is_numeric($_POST[$k])) $vals[$k]=(float)$_POST[$k]; } // Kurzformen $uBr_=$vals['uBr'];$uGe_=$vals['uGe'];$lKoe_=$vals['lKoe']; $uHg_=$vals['uHg'];$uTa_=$vals['uTa'];$lTV_=$vals['lTV']; $uOa_=$vals['uOa'];$uHa_=$vals['uHa'];$lGe_=$vals['lGe']; $lAr_=$vals['lAr'];$lOa_=$vals['lOa'];$lTa_=$vals['lTa']; $lVo_=$vals['lVo'];$lBr_=$vals['lBr'];$lRue_=$vals['lRue']; $lSu_=$vals['lSu'];$alfaSu_=$vals['alfaSu']; $zBr=$vals['zBr'];$hPo=$vals['hPo']; $bTAv=$vals['bTAv'];$bTAh=$vals['bTAh']; $VHtv=$vals['VHtv'];$VHth=$vals['VHth'];$VHh=$vals['VHh']; $bSuM=$vals['bSuM'];$bUb=$vals['bUb'];$hSaT=$vals['hSaT']; // ============================================================ // VORDERTEIL (VT) // ============================================================ logMsg("=== VORDERTEIL (VT) ==="); $currentPart = 'VT'; define('VT',100); $A=100;$B=101;$C=102;$D=103;$E=104;$F=105;$G=106;$H=107; $I=108;$J=109;$K=110;$L=111;$M=112;$N=113;$O=114; $P1=115;$P2=128;$P3=133;$P4=134;$P5=135;$P6=136;$P7=137; $P9=138;$P10=116;$P11=117;$P11i=119;$P11a=118;$P12=120; $P13=121;$P14=122;$P15=123;$P16=124;$P17=125;$P18=126; $P19=127;$P20=129;$P21=130;$P22=131;$P23=132;$PPKT=139; $T=($uGe_*10-430*$uBr_/48-280/3-abs(10*$uBr_-1040)/48)/10; $hBr=(30*$lKoe_/40+125+(10*$uBr_-920)/20)/10; $hAV=$zBr/4;$hTa=$lTa_-$lTV_; PW($A,0.0,0.0); $bVo=(10*$uBr_/5+5+3*10*$zBr/20)/10; PPW($B,$A,$bVo,0.0); PPW($C,$B,0.0,-($hTa-$hBr)); PW($D,$P_[$A][0],$P_[$C][1]); $hVo=$lVo_-$lTV_; PPW($E,$D,0.0,$hVo); $bHlv=$uHa_/6+$zBr/40; PPW($F,$E,$bHlv,0.0); PPW($G,$A,(10*$uBr_/10+2+10*$zBr/20)/10,0.0); $betaBA=10*$uBr_/40-5.4-abs(10*$uBr_-1040)/200; PD($H,$F,$G,$betaBA,'W',' '); $l1=(3*10*$uBr_/40+140)/10; PPW($I,$B,0.0,$hBr-($l1+$hAV)); $hAVv=$uBr_/20+0.1+$zBr/20;$bAlv=$hAVv; PPW($J,$I,0.0,$hAVv); PPW($K,$I,$bAlv,0.0); PPW($L,$J,$bAlv,0.0); $betaSuv=$betaBA+$alfaSu_-3-2*10*$hPo/5; $bSuv=(10*$lSu_+3*(10*$uBr_-920)/40-1+10*$zBr/10)/10; PPW(1,$H,$bSuv,0.0); PD($M,1,$H,$betaSuv,'W',' '); $hHlv=$uHa_/3-4.4+$zBr/40; PPW($N,$E,0.0,-$hHlv); PPW($O,$N,0.0,$bHlv); PPW($PPKT,$O,$bHlv,0.0); PW($P1,$P_[$K][0],$P_[$D][1]); PPW($P3,$D,0.0,-$lGe_); PW($P12,$P_[$G][0],$P_[$P3][1]); PW($P2,$P_[$P1][0],$P_[$P3][1]); PPW($P15,$P2,1.0,0.0); PPW($P13,$P12,0.0,$lGe_/2); PW($P11,$P_[$G][0],$P_[$D][1]); PPW($P11i,$P11,-$bTAv/2,0.0); PPW($P11a,$P11,+$bTAv/2,0.0); PPW($P14,$P1,-1.0,0.0); LPP(1,$P14,$P15); PPW($P16,$D,0.0,$hSaT); PPW(1,$P1,0.0,$hSaT); LPP(2,$P16,1); LPP(3,$P13,$P11a); LPP(4,$P13,$P11i); PLL($P17,2,4); PLL($P18,2,3); PLL($P19,1,2); PPW($P6,$N,0.0,$VHtv); PD($P9,$P6,$O,-45.0,'W',' '); PPW($P20,$P6,-$bUb,0.0); PPW($P21,$A,-$bUb,0.0); PPW($P22,$D,-$bUb,0.0); PPW($P23,$P16,-$bUb,0.0); $l1=$bSuv/2; PZP($P4,$H,$M,$l1/AD($H,$M)*100); KR(1,$G,AD($G,$P4)); KR(2,$F,$bSuv/2); PKK(1,1,2,1);PKK(2,1,2,2); if($P_[1][0]>$P_[2][0])PPW($P5,1,0.0,0.0);else PPW($P5,2,0.0,0.0); PZP($P7,$F,$P5,$VHh/AD($F,$P5)*100); PZP($P10,$H,$M,(AD($H,$M)+$bSuM)/AD($H,$M)*100); $vt_contour=[ ['nr'=>$P23,'lbl'=>'P23','info'=>''], ['nr'=>$P20,'lbl'=>'P20','info'=>''], ['nr'=>$P6, 'lbl'=>'P6', 'info'=>'A'], ['nr'=>$P9, 'lbl'=>'P9', 'info'=>'X'], ['nr'=>$P7, 'lbl'=>'P7', 'info'=>'E'], ['nr'=>$P5, 'lbl'=>'P5', 'info'=>'K'], ['nr'=>$P4, 'lbl'=>'P4', 'info'=>'K'], ['nr'=>$P10,'lbl'=>'P10','info'=>'A'], ['nr'=>$J, 'lbl'=>'J', 'info'=>'X'], ['nr'=>$K, 'lbl'=>'K', 'info'=>'E'], ['nr'=>$P14,'lbl'=>'P14','info'=>'K'], ['nr'=>$P19,'lbl'=>'P19','info'=>''], ['nr'=>$P18,'lbl'=>'P18','info'=>'K'], ['nr'=>$P11a,'lbl'=>'P11a','info'=>''], ['nr'=>$G, 'lbl'=>'G', 'info'=>''], ['nr'=>$P11i,'lbl'=>'P11i','info'=>''], ['nr'=>$P17,'lbl'=>'P17','info'=>'K'], ['nr'=>$P16,'lbl'=>'P16','info'=>''], ['nr'=>$P23,'lbl'=>'','info'=>''], ]; $vt_internal=[[$P6,$P16],[$A,$B],[$P5,$G],[$P4,$G]]; // ============================================================ // RÜCKENTEIL (RT) // ============================================================ logMsg("=== RÜCKENTEIL (RT) ==="); $currentPart = 'RT'; $RA=200;$RB=201;$RC=202;$RD=203;$RE=204;$RF=205;$RG=206; $RH=207;$RI=208;$RJ=209;$RK=210;$RL=211;$RM=212;$RN=213;$RO=214; $RP1=215;$RP2=228;$RP3=235;$RP4=236;$RP5=237;$RP6=238; $RP7=239;$RP8=240;$RP9A=241;$RP9I=242; $RP10=216;$RP11=217;$RP12=218;$RP13=219;$RP14=220;$RP15=221; $RP16=222;$RP17=223;$RP18=224;$RP18A=225;$RP18I=226; $RP19=227;$RP20=229;$RP21=230;$RP22=231;$RP23=232; $RP24=233;$RP25=234; $LMih=20; $T=($uGe_*10-430*$uBr_/48-280/3-abs(10*$uBr_-1040)/48)/10; $hBr=(30*$lKoe_/40+125+(10*$uBr_-920)/20)/10; $hAV=$zBr/4;$hTa=$lTa_-$lTV_; $li=(3*10*$uBr_/40+140+10*$hAV)/10; PW($RA,0.0,0.0); PPW($RB,$RA,0.0,$hBr); PPW($RC,$RB,0.0,-$hTa); $bRAo=1.3; PPW($RD,$RC,-$bRAo,0.0); LPP($LMih,$RD,$RB); $bHlh=(10*$uHa_/6+8+10*$zBr/40)/10; PPW($RE,$RB,-$bHlh,0.0); $hHlh=(10*$uHa_/6-39+3*10*$zBr/200)/10; PPW($RF,$RE,0.0,$hHlh); LPP(1,$RA,$RB); LSP(2,$RA,1); PLL($RG,$LMih,2); $bRue=(10*$uBr_/8+56+10*$zBr/8)/10; PPW($RH,$RG,-$bRue,0.0); PW($RI,$P_[$RH][0],$P_[$RB][1]-$li); PPW($RJ,$RI,0.0,(10*$uBr_/20-6+10*$zBr/20)/10); $bAlh=(10*$uBr_/8-62+7*10*$zBr/40)/10; PPW($RK,$RI,-$bAlh,0.0); PPW($RL,$RJ,-6/10,0.0); $bSuh=(10*$lSu_+7*10*$uBr_/80-57.5+10*$zBr/10)/10; PPW(1,$RF,-$bSuh,0.0); $betaSuh=$alfaSu_-4-2*10*$hPo/5;$wi=-$betaSuh; PD($RM,1,$RF,$wi,'W',' '); $hAVh=(10*$uBr_/20+43+10*$zBr/20)/10; PPW($RN,$RI,0.0,$hAVh); $betaHl=2*$alfaSu_-7;$wi=-$betaHl; $bHlv_rt=(10*$uHa_/6+10*$zBr/40)/10; PPW(1,$RF,$bHlv_rt,0.0); PD($RO,1,$RF,$wi,'W',' '); PW($RP1,$P_[$RK][0],$P_[$RC][1]); PW($RP2,$P_[$RK][0],$P_[$RC][1]-$lGe_); PPW(1,$RC,0.0,-$lGe_); LPP(3,$RP2,1); PLL($RP3,$LMih,3); $l1_rt=AD($RF,$RM); PZP($RP4,$RF,$RM,($bSuM+$l1_rt)/$l1_rt*100); $bSuv_rt=(10*$lSu_+3*(10*$uBr_-920)/40-1+10*$zBr/10)/10; $bSA_rt=(10*$uBr_/80+12.5)/10; $l2_rt=$bSuv_rt/2+$bSA_rt/2; PZP($RP5,$RF,$RM,$l2_rt/$l1_rt*100); PW($RP6,$P_[$RG][0]-$bRue/2+1.0,0.0); LPP(4,$RP6,$RP5); PZP($RP7,$RP5,$RP6,9.0/AD($RP5,$RP6)*100); KR(1,$RF,$bSuv_rt); KR(2,$RP7,AD($RP7,$RP4)); PKK(1,1,2,1);PKK(2,1,2,2); if($P_[1][0]<$P_[2][0])PPW($RP8,1,0.0,0.0);else PPW($RP8,2,0.0,0.0); PZP($RP9I,$RF,$RP8,($bSuv_rt/2)/AD($RF,$RP8)*100); KR(1,$RP4,$bSuv_rt/2+$bSuM); KR(2,$RP7,AD($RP7,$RP9I)); PKK(1,1,2,1);PKK(2,1,2,2); if($P_[1][1]>$P_[2][1])PPW($RP9A,1,0.0,0.0);else PPW($RP9A,2,0.0,0.0); PPW($RP10,$RG,-$bRue/2-1.0,0.0); LPDP(5,$RP10,$LMih); PLL($RP11,3,5); $l1_rt=AD($RP10,$RP11); PZP($RP12,$RP10,$RP11,2.0/$l1_rt*100); PZP($RP13,$RP11,$RP10,($lGe_/4)/$l1_rt*100); LPDP(6,$RK,$LMih); LPP(7,$RC,$RP1); PLL($RP14,6,7); PLL($RP15,6,3); PPW($RP16,$RP14,1.0,0.0); PPW($RP17,$RP15,-1.0,0.0); LSP(8,$RP16,$LMih); PLL($RP18,5,8); PLL($RP19,8,$LMih); KR(1,$RP18,$bTAh/2); PKL(1,1,8,1);PKL(2,1,8,2); if($P_[1][0]>$P_[2][0]){PPW($RP18I,1,0,0);PPW($RP18A,2,0,0);} else {PPW($RP18A,1,0,0);PPW($RP18I,2,0,0);} LPA(9,-abs($hSaT),8); PLL($RP20,$LMih,9); LPP(10,$RP13,$RP18I); LPP(11,$RP13,$RP18A); LPP(12,$RP16,$RP17); PLL($RP21,9,10); PLL($RP22,9,11); PLL($RP23,9,12); $l1_rt=AD($RB,$RG); PZP($RP24,$RB,$RG,$VHth/$l1_rt*100); $l1_rt=AD($RF,$RP9I); PZP($RP25,$RF,$RP9I,$VHh/$l1_rt*100); $rt_contour=[ ['nr'=>$RP20,'lbl'=>'P20','info'=>''], ['nr'=>$RP21,'lbl'=>'P21','info'=>'K'], ['nr'=>$RP18I,'lbl'=>'P18i','info'=>''], ['nr'=>$RP12,'lbl'=>'P12','info'=>''], ['nr'=>$RP18A,'lbl'=>'P18a','info'=>''], ['nr'=>$RP22,'lbl'=>'P22','info'=>'K'], ['nr'=>$RP23,'lbl'=>'P23','info'=>''], ['nr'=>$RP16,'lbl'=>'P16','info'=>'K'], ['nr'=>$RK, 'lbl'=>'K', 'info'=>'A'], ['nr'=>$RL, 'lbl'=>'L', 'info'=>'X'], ['nr'=>$RN, 'lbl'=>'N', 'info'=>'X'], ['nr'=>$RP4, 'lbl'=>'P4', 'info'=>'E'], ['nr'=>$RP9A,'lbl'=>'P9a','info'=>'K'], ['nr'=>$RP7, 'lbl'=>'P7', 'info'=>''], ['nr'=>$RP9I,'lbl'=>'P9i','info'=>''], ['nr'=>$RP25,'lbl'=>'P25','info'=>'A'], ['nr'=>$RP24,'lbl'=>'P24','info'=>'E'], ['nr'=>$RP20,'lbl'=>'','info'=>''], ]; $rt_internal=[[$RD,$RC],[$RA,$RB],[$RH,$RG]]; // ============================================================ // SVG-Hilfsfunktionen // ============================================================ // ============================================================ // Bounding-Box + Skalierung // ============================================================ $vtXs=[];$vtYs=[]; foreach($vt_contour as $cp){$nr=$cp['nr'];if($P_[$nr][0]<1e14){$vtXs[]=$P_[$nr][0];$vtYs[]=$P_[$nr][1];}} $rtXs=[];$rtYs=[]; foreach($rt_contour as $cp){$nr=$cp['nr'];if($P_[$nr][0]<1e14){$rtXs[]=$P_[$nr][0];$rtYs[]=$P_[$nr][1];}} $vtMinX=min($vtXs);$vtMaxX=max($vtXs); $rtMinX=min($rtXs);$rtMaxX=max($rtXs); $comMinY=min(min($vtYs),min($rtYs)); $comMaxY=max(max($vtYs),max($rtYs)); $margin=44; $gap=36; $SVG_H=680; $scale=($SVG_H-2*$margin)/($comMaxY-$comMinY+0.001); $vtW=($vtMaxX-$vtMinX)*$scale; $rtW=($rtMaxX-$rtMinX)*$scale; $SVG_W=(int)ceil($margin+$vtW+$gap+$rtW+$margin+8); $vtOx=$margin-$vtMinX*$scale; $rtOx=$margin+$vtW+$gap-$rtMinX*$scale; $Oy =$SVG_H-$margin+$comMinY*$scale; // ============================================================ // SVG-Hilfsfunktionen // ============================================================ function toSvgXY($nr,&$P,$sc,$ox,$oy){ return [round($P[$nr][0]*$sc+$ox,2), round(-$P[$nr][1]*$sc+$oy,2)]; } function catmullRomPath(array $pts):string{ $n=count($pts); if($n<2)return ''; if($n==2)return "M {$pts[0][0]},{$pts[0][1]} L {$pts[1][0]},{$pts[1][1]}"; $p=array_merge([$pts[0]],$pts,[$pts[$n-1]]); $d="M {$p[1][0]},{$p[1][1]}"; for($i=1;$i1e14)continue; $sx=round($P[$nr][0]*$sc+$ox,2); $sy=round(-$P[$nr][1]*$sc+$oy,2); if(!$inCurve && $cp['info']==='A'){ if($path==='')$path="M $sx,$sy"; else $path.=" L $sx,$sy"; $inCurve=true; $curveStart=['sx'=>$sx,'sy'=>$sy,'nr'=>$nr]; $curvePts=[[$sx,$sy]]; $curveNrs=[$nr]; }elseif($inCurve){ $curvePts[]=[$sx,$sy]; $curveNrs[]=$nr; if($cp['info']==='E'||$cp['info']==='X'){ // Echte Datenbankwerte suchen $startNr=$curveNrs[0]; $endNr=$nr; $ckey=$teil.'_'.$startNr.'_'.$endNr; $p1=['', $curveStart['sx'], $curveStart['sy']]; $p2=['', $sx, $sy]; // Kurven-Key aus Mapping: Teil_StartNr_EndNr global $CURVE_MAP, $CURVES; $mapkey = $teil.'_'.$startNr.'_'.$endNr; $dbkey = $CURVE_MAP[$mapkey] ?? null; if($dbkey && !empty($CURVES[$dbkey]) && count($CURVES[$dbkey]['pts'])>=2){ // Echte Kurve aus Datenbank → einhängen $path.=' '.applyCurve( [$curveStart['sx'],$curveStart['sy']], [$sx,$sy], $CURVES[$dbkey]['pts'], $sc); } else { // Fallback: Catmull-Rom mit vorhandenen Stützpunkten $seg=catmullRomPath($curvePts); $cOnly=preg_replace('/^M[\s\d.,\-]+\s*/','', $seg); $path.=' '.$cOnly; } if($cp['info']==='E'){$inCurve=false;} else{ $curveStart=['sx'=>$sx,'sy'=>$sy,'nr'=>$nr]; $curvePts=[[$sx,$sy]]; $curveNrs=[$nr]; } } }else{ if($path==='')$path="M $sx,$sy"; else $path.=" L $sx,$sy"; } } return $path.' Z'; } function svgIL($p1,$p2,&$P,$sc,$ox,$oy,$col,$dash='5,3'){ if($P[$p1][0]>1e14||$P[$p2][0]>1e14)return ''; [$x1,$y1]=[round($P[$p1][0]*$sc+$ox,1),round(-$P[$p1][1]*$sc+$oy,1)]; [$x2,$y2]=[round($P[$p2][0]*$sc+$ox,1),round(-$P[$p2][1]*$sc+$oy,1)]; return "\n"; } function svgLbl($nr,$lbl,&$P,$sc,$ox,$oy,$col){ if($P[$nr][0]>1e14||!$lbl)return ''; [$x,$y]=[round($P[$nr][0]*$sc+$ox,1),round(-$P[$nr][1]*$sc+$oy,1)]; return "\n" ."$lbl\n"; } // ============================================================ // Linie klippen auf sichtbaren SVG-Bereich // Gibt [x1,y1,x2,y2] in SVG-Koordinaten zurück oder null // ============================================================ function clipLine($A,$B,$C,$ox,$oy,$W,$H){ // Ax+By+C=0 (Model-Koordinaten) // Wir berechnen Schnittpunkte mit den 4 Rändern im Modellraum $sc = $GLOBALS['scale']; // Modellbereich: x von (0-ox)/sc bis (W-ox)/sc, y von (oy-H)/sc bis oy/sc $xmin=(0-$ox)/$sc; $xmax=($W-$ox)/$sc; $ymin=($oy-$H)/$sc; $ymax=$oy/$sc; $pts=[]; if(abs($B)>1e-9){ // x=xmin → y $y=(-$C-$A*$xmin)/$B; if($y>=$ymin&&$y<=$ymax) $pts[]=[$xmin,$y]; // x=xmax → y $y=(-$C-$A*$xmax)/$B; if($y>=$ymin&&$y<=$ymax) $pts[]=[$xmax,$y]; } if(abs($A)>1e-9){ // y=ymin → x $x=(-$C-$B*$ymin)/$A; if($x>=$xmin&&$x<=$xmax) $pts[]=[$x,$ymin]; // y=ymax → x $x=(-$C-$B*$ymax)/$A; if($x>=$xmin&&$x<=$xmax) $pts[]=[$x,$ymax]; } if(count($pts)<2) return null; // SVG-Koordinaten $x1=round($pts[0][0]*$sc+$ox,1); $y1=round(-$pts[0][1]*$sc+$oy,1); $x2=round($pts[1][0]*$sc+$ox,1); $y2=round(-$pts[1][1]*$sc+$oy,1); return [$x1,$y1,$x2,$y2]; } // ============================================================ // Punkt-Namen-Map (für Label im Player) // ============================================================ $PNAMES = [ 100=>'A',101=>'B',102=>'C',103=>'D',104=>'E',105=>'F',106=>'G',107=>'H', 108=>'I',109=>'J',110=>'K',111=>'L',112=>'M',113=>'N',114=>'O', 115=>'P1',116=>'P10',117=>'P11',118=>'P11a',119=>'P11i',120=>'P12', 121=>'P13',122=>'P14',123=>'P15',124=>'P16',125=>'P17',126=>'P18', 127=>'P19',128=>'P2',129=>'P20',130=>'P21',131=>'P22',132=>'P23', 133=>'P3',134=>'P4',135=>'P5',136=>'P6',137=>'P7',138=>'P9',139=>'Ppkt', 200=>'A',201=>'B',202=>'C',203=>'D',204=>'E',205=>'F',206=>'G',207=>'H', 208=>'I',209=>'J',210=>'K',211=>'L',212=>'M',213=>'N',214=>'O', 215=>'P1',216=>'P10',217=>'P11',218=>'P12',219=>'P13',220=>'P14', 221=>'P15',222=>'P16',223=>'P17',224=>'P18',225=>'P18a',226=>'P18i', 227=>'P19',228=>'P2',229=>'P20',230=>'P21',231=>'P22',232=>'P23', 233=>'P24',234=>'P25',235=>'P3',236=>'P4',237=>'P5',238=>'P6', 239=>'P7',240=>'P8',241=>'P9a',242=>'P9i', ]; // ============================================================ // SVG-Elemente je Step aufbauen // Jeder Step bekommt genau die NEU hinzugekommenen Elemente // ============================================================ // Wir vergleichen aufeinanderfolgende Snapshots $svgSteps = []; // ['type'=>'P'|'L'|'K', 'svg'=>'...', 'desc'=>'...', 'fn'=>'...'] $prevP=[]; $prevL=[]; $prevK=[]; foreach($steps as $si=>$step){ $curP=$step['P']; $curL=$step['L']; $curK=$step['K']; $part=$step['part']; $ox=($part==='RT')?$rtOx:$vtOx; $col=($part==='RT')?'#8a3a3a':'#3a5a8a'; $hlcol=($part==='RT')?'#cc3333':'#1155cc'; $newSvg=''; // --- Neue Punkte --- foreach($curP as $nr=>$p){ if(isset($prevP[$nr])) continue; $sx=round($p[0]*$scale+$ox,2); $sy=round(-$p[1]*$scale+$Oy,2); $lbl=$PNAMES[$nr]??('P'.$nr); // Kleiner Punkt + Label $newSvg.=""; $newSvg.="$lbl"; } // --- Neue Linien --- foreach($curL as $nr=>$l){ if(isset($prevL[$nr])) continue; $seg=clipLine($l[0],$l[1],$l[2],$ox,$Oy,$SVG_W,$SVG_H); if($seg){ [$x1,$y1,$x2,$y2]=$seg; $newSvg.=""; // Linienbezeichnung in der Mitte $mx=round(($x1+$x2)/2,1); $my=round(($y1+$y2)/2-6,1); $newSvg.="L$nr"; } } // --- Neue Kreise --- foreach($curK as $nr=>$k){ if(isset($prevK[$nr])) continue; $kpart=$k[3]??$part; $kox=($kpart==='RT')?$rtOx:$vtOx; $cx=round($k[0]*$scale+$kox,2); $cy=round(-$k[1]*$scale+$Oy,2); $cr=round($k[2]*$scale,2); $newSvg.=""; $newSvg.="K$nr"; } $svgSteps[]=[ 'fn' =>$step['fn'], 'desc'=>$step['desc'], 'part'=>$part, 'svg' =>$newSvg, ]; $prevP=$curP; $prevL=$curL; $prevK=$curK; } // Mapping: Teil_StartNr_EndNr → Kurven-Schlüssel $CURVE_MAP = [ 'VT_136_138' => 'VT_Halsloch_vorn_unten', 'VT_138_137' => 'VT_Halsloch_vorn_oben', 'VT_116_109' => 'VT_Armloch_vorn_oben', 'VT_109_110' => 'VT_Armloch_vorn_unten', 'RT_210_211' => 'RT_Armloch_vorn_unten', 'RT_211_213' => 'RT_Armloch_vorn_Mitte', 'RT_213_236' => 'RT_Armloch_vorn_oben', 'RT_234_233' => 'RT_Halsloch_vorn_unten', ]; // Label-Maps für Kurven-Lookup (Punktnummer → Name) $CURVES = [ // Halslochkurve, vorn unten 'VT_Halsloch_vorn_unten' => [ 'teil'=>'VT', 'loc1'=>'Halsloch', 'loc2'=>'vorn,unten', 'n'=>5, 'pts'=>[[0.0,0.0], [1.6,0.2], [3.1,0.7], [4.3,1.4], [5.4,2.3]], 'spl'=>[[0.0,0.0], [0.805,0.061], [1.6,0.2], [2.362,0.413], [3.1,0.7], [3.716,1.021], [4.3,1.4], [4.868,1.829], [5.4,2.3]], ], // Halslochkurve, vorn oben 'VT_Halsloch_vorn_oben' => [ 'teil'=>'VT', 'loc1'=>'Halsloch', 'loc2'=>'vorn,oben', 'n'=>5, 'pts'=>[[0.0,0.0], [1.2,1.7], [1.9,3.3], [2.4,5.0], [2.6,6.6]], 'spl'=>[[0.0,0.0], [0.639,0.822], [1.2,1.7], [1.584,2.484], [1.9,3.3], [2.18,4.141], [2.4,5.0], [2.534,5.796], [2.6,6.6]], ], // Armlochkurve vorne oben 'VT_Armloch_vorn_oben' => [ 'teil'=>'VT', 'loc1'=>'Armloch', 'loc2'=>'vorn,oben', 'n'=>7, 'pts'=>[[0.0,0.0], [-1.6,-1.9], [-3.1,-3.9], [-4.6,-6.3], [-5.6,-8.6], [-6.3,-11.3], [-6.5,-14.2]], 'spl'=>[[0.0,0.0], [-0.813,-0.939], [-1.6,-1.9], [-2.368,-2.886], [-3.1,-3.9], [-3.883,-5.08], [-4.6,-6.3], [-5.146,-7.43], [-5.6,-8.6], [-6.007,-9.936], [-6.3,-11.3], [-6.466,-12.745], [-6.5,-14.2]], ], // Armlochkurve vorne unten 'VT_Armloch_vorn_unten' => [ 'teil'=>'VT', 'loc1'=>'Armloch', 'loc2'=>'vorn,unten', 'n'=>5, 'pts'=>[[0.0,0.0], [0.5,-2.1], [1.5,-3.6], [2.9,-4.7], [5.3,-5.3]], 'spl'=>[[0.0,0.0], [0.166,-1.07], [0.5,-2.1], [0.934,-2.892], [1.5,-3.6], [2.148,-4.223], [2.9,-4.7], [4.074,-5.105], [5.3,-5.3]], ], // Armloch vorne unten 'RT_Armloch_vorn_unten' => [ 'teil'=>'RT', 'loc1'=>'Armloch', 'loc2'=>'vorn,unten', 'n'=>5, 'pts'=>[[0.0,0.0], [2.4,0.4], [4.4,1.4], [5.9,2.8], [6.8,4.7]], 'spl'=>[[0.0,0.0], [1.214,0.115], [2.4,0.4], [3.436,0.827], [4.4,1.4], [5.211,2.038], [5.9,2.8], [6.438,3.708], [6.8,4.7]], ], // Armloch vorn Mitte 'RT_Armloch_vorn_Mitte' => [ 'teil'=>'RT', 'loc1'=>'Armloch', 'loc2'=>'vorn,Mitte', 'n'=>4, 'pts'=>[[0.0,0.0], [0.4,1.7], [0.5,3.1], [0.6,4.9]], 'spl'=>[[0.0,0.0], [0.23,0.843], [0.4,1.7], [0.467,2.398], [0.5,3.1], [0.6,4.9]], ], // Armloch R³ckenteil vorn oben 'RT_Armloch_vorn_oben' => [ 'teil'=>'RT', 'loc1'=>'Armloch', 'loc2'=>'vorn,oben', 'n'=>6, 'pts'=>[[0.0,0.0], [-0.4,2.4], [-1.0,4.5], [-1.8,6.8], [-2.9,8.9], [-4.0,11.2]], 'spl'=>[[0.0,0.0], [-0.168,1.205], [-0.4,2.4], [-0.676,3.456], [-1.0,4.5], [-1.372,5.661], [-1.8,6.8], [-2.335,7.857], [-2.9,8.9], [-4.0,11.2]], ], // R³ckenteil Halsloch vorn unten 'RT_Halsloch_vorn_unten' => [ 'teil'=>'RT', 'loc1'=>'Halsloch', 'loc2'=>'vorn,unten', 'n'=>6, 'pts'=>[[0.0,0.0], [1.4,-1.5], [3.2,-2.4], [5.2,-2.7], [6.9,-2.8], [8.8,-2.8]], 'spl'=>[[0.0,0.0], [0.634,-0.811], [1.4,-1.5], [2.261,-2.025], [3.2,-2.4], [4.19,-2.599], [5.2,-2.7], [6.049,-2.767], [6.9,-2.8], [7.85,-2.813], [8.8,-2.8]], ], ]; $vt_lbl_map=[ $A=>'A',$B=>'B',$C=>'C',$D=>'D',$E=>'E',$F=>'F',$G=>'G', $H=>'H',$I=>'I',$J=>'J',$K=>'K',$L=>'L',$M=>'M',$N=>'N', $P4=>'P4',$P5=>'P5',$P6=>'P6',$P7=>'P7', $P10=>'P10',$P16=>'P16',$P19=>'P19', $P11a=>'P11a',$P11i=>'P11i']; $rt_lbl_map=[ $RA=>'A',$RB=>'B',$RC=>'C',$RD=>'D',$RE=>'E',$RF=>'F',$RG=>'G', $RH=>'H',$RI=>'I',$RJ=>'J',$RK=>'K',$RL=>'L',$RM=>'M',$RN=>'N', $RP4=>'P4',$RP7=>'P7',$RP9A=>'P9a',$RP9I=>'P9i', $RP16=>'P16',$RP20=>'P20',$RP24=>'P24',$RP25=>'P25']; // Konturpfade mit echten Kurven aus Datenbank $vtPath=buildPath($vt_contour,$P_,$scale,$vtOx,$Oy,'VT',$CURVES,$vt_lbl_map); $rtPath=buildPath($rt_contour,$P_,$scale,$rtOx,$Oy,'RT',$CURVES,$rt_lbl_map); // Kurven nach Teil+Punktnummern indexieren // (wird nach Konstruktion befüllt, hier Vorinitialisierung) $CURVE_IDX = []; foreach ($CURVES as $key => $cv) { $CURVE_IDX[$cv['teil'].'_'.$cv['loc1'].'_'.$cv['loc2']] = $key; } // ================================================================ // AYSPLINE – Kubischer Hermite-Spline (klassisch) // PHP-Implementierung für AutoCons // ================================================================ function ayspline_norm(float $a, float $b): float { return sqrt($a*$a + $b*$b); } function ayspline_rtb(array $PK, int $N): ?array { $EK = array_fill(0, $N, [0.0, 0.0]); for ($i=1; $i<=$N-2; $i++) { $EK[$i][0] = $PK[$i+1][0] - $PK[$i-1][0]; $EK[$i][1] = $PK[$i+1][1] - $PK[$i-1][1]; } $a=$PK[1][0]-$PK[0][0]; $b=$PK[1][1]-$PK[0][1]; $be=ayspline_norm($a,$b); if($be<1e-10) return null; $EK[0][0]=$a/$be; $EK[0][1]=$b/$be; $skal=($PK[2][0]-$PK[1][0])*$EK[0][0]+($PK[2][1]-$PK[1][1])*$EK[0][1]; $EK[0][0]=2*$skal*$EK[0][0]-$PK[2][0]+$PK[1][0]+$a; $EK[0][1]=2*$skal*$EK[0][1]-$PK[2][1]+$PK[1][1]+$b; $a=$PK[$N-1][0]-$PK[$N-2][0]; $b=$PK[$N-1][1]-$PK[$N-2][1]; $be=ayspline_norm($a,$b); if($be<1e-10) return null; $EK[$N-1][0]=$a/$be; $EK[$N-1][1]=$b/$be; $skal=($PK[$N-3][0]-$PK[$N-2][0])*$EK[$N-1][0] +($PK[$N-3][1]-$PK[$N-2][1])*$EK[$N-1][1]; $EK[$N-1][0]=$a-2*$skal*$EK[$N-1][0]+$PK[$N-3][0]-$PK[$N-2][0]; $EK[$N-1][1]=$b-2*$skal*$EK[$N-1][1]+$PK[$N-3][1]-$PK[$N-2][1]; for ($j=0; $j<$N; $j++) { $be=ayspline_norm($EK[$j][0],$EK[$j][1]); if($be<1e-10) return null; $EK[$j][0]/=$be; $EK[$j][1]/=$be; } return $EK; } function ayspline(array $PK, float $eps=0.4): array { $N=count($PK); if($N<2) return $PK; if($N==2) { $out=[]; for($t=0;$t<=8;$t++){$f=$t/8; $out[]=[$PK[0][0]+$f*($PK[1][0]-$PK[0][0]), $PK[0][1]+$f*($PK[1][1]-$PK[0][1])];} return $out; } $EK=ayspline_rtb($PK,$N); if($EK===null) return $PK; $XP=[]; for($i=0;$i<$N-1;$i++){ $dx=$PK[$i+1][0]-$PK[$i][0]; $dy=$PK[$i+1][1]-$PK[$i][1]; $S=sqrt($dx*$dx+$dy*$dy); if($S<1e-10) continue; $A=[[$PK[$i][0],$PK[$i][1]],[$EK[$i][0]*$S,$EK[$i][1]*$S], [$PK[$i+1][0],$PK[$i+1][1]],[$EK[$i+1][0]*$S,$EK[$i+1][1]*$S]]; $nSub=max(4,(int)($S/$eps)+1); for($k=0;$k<$nSub;$k++){ $f=$k/$nSub; $f2=$f*$f; $f3=$f2*$f; $u0=1-3*$f2+2*$f3; $u1=$f-2*$f2+$f3; $u2=3*$f2-2*$f3; $u3=$f3-$f2; $XP[]=[round($u0*$A[0][0]+$u1*$A[1][0]+$u2*$A[2][0]+$u3*$A[3][0],3), round($u0*$A[0][1]+$u1*$A[1][1]+$u2*$A[2][1]+$u3*$A[3][1],3)]; } } $XP[]=$PK[$N-1]; return $XP; } // Kurve aus DB auf Kontur-Segment anwenden (p1,p2 in SVG-Koordinaten) function applyCurve(array $p1, array $p2, array $rawPts, float $sc): string { $n=count($rawPts); if($n<2) return "L {$p2[0]},{$p2[1]}"; // Rohdaten: cm-Koordinaten relativ zum Startpunkt // Letzter Punkt = Endpunkt der Kurve $endX=$rawPts[$n-1][0]; $endY=$rawPts[$n-1][1]; $rawLen=sqrt($endX*$endX+$endY*$endY); if($rawLen<1e-10) return "L {$p2[0]},{$p2[1]}"; // Ziel: p1→p2 in SVG-Koordinaten $tgtDX=$p2[0]-$p1[0]; $tgtDY=$p2[1]-$p1[1]; $tgtLen=sqrt($tgtDX*$tgtDX+$tgtDY*$tgtDY); if($tgtLen<1e-10) return "L {$p2[0]},{$p2[1]}"; // Rotationsmatrix: raw-Koordinatensystem → SVG-Koordinatensystem // raw: x nach rechts, y nach oben (Modell) // SVG: x nach rechts, y nach unten → y invertieren $rawEndX=$endX; $rawEndY=-$endY; // y invertieren $rawEndLen=sqrt($rawEndX*$rawEndX+$rawEndY*$rawEndY); $cos_a=($tgtDX*$rawEndX+$tgtDY*$rawEndY)/($tgtLen*$rawEndLen); $sin_a=($tgtDY*$rawEndX-$tgtDX*$rawEndY)/($tgtLen*$rawEndLen); $scale=$tgtLen/$rawEndLen; // Alle Stützpunkte transformieren $pts=[]; foreach($rawPts as $rp){ $rx=$rp[0]; $ry=-$rp[1]; // y invertieren $tx=($cos_a*$rx-$sin_a*$ry)*$scale; $ty=($sin_a*$rx+$cos_a*$ry)*$scale; $pts[]=[round($p1[0]+$tx,2), round($p1[1]+$ty,2)]; } // Hermite-Spline interpolieren $splined=ayspline($pts, 0.5); // SVG-Pfad erzeugen $path=''; foreach($splined as $sp) $path.=" L {$sp[0]},{$sp[1]}"; return ltrim($path); } /** * AutoCons – Kurvendaten aus curves.dbf (Optikon-Oberteil) * Originalwerte: Georg Müller, ASSYST/CONEX ca. 1992-1996 * Jede Kurve: Stützpunkte (POINTSIN) + interpolierte Spline-Punkte (POINTSSPLI) * Koordinaten relativ: Kurvenanfang = (0,0) */ // ============================================================ // HTML ausgeben // ============================================================ header('Content-Type: text/html; charset=utf-8'); ?> AutoCons – Schnittmusterkonstruktion

AutoCons

✎ Editor v0.5

Schnittmusterkonstruktion · Vorderteil & Rückenteil

Konstruktionsskizze

\n"; // Raster $step=5*$scale; echo "\n"; for($gx=$margin;$gx<$SVG_W;$gx+=$step) echo "\n"; for($gy=0;$gy<$SVG_H;$gy+=$step) echo "\n"; echo "\n"; // ---- Konstruktionsschritte als einzelne -Gruppen ---- // Alle zunächst sichtbar (Normalzustand = fertige Zeichnung) // Im Player-Modus werden sie animiert ein-/ausgeblendet echo "\n"; foreach($svgSteps as $si=>$st){ $pid='s'.($si+1); echo "" .$st['svg']."\n"; } echo "\n"; // ---- Kontur-Layer (VT + RT) ---- immer sichtbar im Normalmodus echo "\n"; // VT interne Linien echo "\n"; foreach($vt_internal as $il) echo svgIL($il[0],$il[1],$P_,$scale,$vtOx,$Oy,'#7a9abf'); echo "\n"; // VT Konturpfad echo "\n"; // VT Beschriftungen echo "\n"; foreach($vt_lbl_map as $nr=>$lbl) echo svgLbl($nr,$lbl,$P_,$scale,$vtOx,$Oy,'#3a5a8a'); echo "\n"; // VT Wasserzeichen $cx=0;$cy=0;$cnt=0; foreach($vt_contour as $cp){$nr=$cp['nr'];if($P_[$nr][0]<1e14){$cx+=$P_[$nr][0];$cy+=$P_[$nr][1];$cnt++;}} if($cnt){$tx=round($cx/$cnt*$scale+$vtOx);$ty=round(-$cy/$cnt*$scale+$Oy); echo "VT\n";} // RT interne Linien echo "\n"; foreach($rt_internal as $il) echo svgIL($il[0],$il[1],$P_,$scale,$rtOx,$Oy,'#bf7a7a'); echo "\n"; // RT Konturpfad echo "\n"; // RT Beschriftungen echo "\n"; foreach($rt_lbl_map as $nr=>$lbl) echo svgLbl($nr,$lbl,$P_,$scale,$rtOx,$Oy,'#8a3a3a'); echo "\n"; // RT Wasserzeichen $cx=0;$cy=0;$cnt=0; foreach($rt_contour as $cp){$nr=$cp['nr'];if($P_[$nr][0]<1e14){$cx+=$P_[$nr][0];$cy+=$P_[$nr][1];$cnt++;}} if($cnt){$tx=round($cx/$cnt*$scale+$rtOx);$ty=round(-$cy/$cnt*$scale+$Oy); echo "RT\n";} echo "\n"; // contour-layer // Maßstab $barX=$margin;$barY=$SVG_H-14;$barLen=10*$scale; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "10 cm\n"; echo "\n"; // Ende SVG ?>
\n"; // Player-Checkbox (wird unter das SVG verschoben) $totalSteps=count($svgSteps); // Legende echo "
\n

Legende

\n"; echo "
Vorderteil (VT)
\n"; echo "
Rückenteil (RT)
\n"; echo "
Hilfslinien
\n"; echo "
Hilfskreise
\n"; echo "
\n"; // Protokoll echo "
\nKonstruktionsprotokoll\n"; echo "
\n"; foreach($log as $l) echo htmlspecialchars($l)."
\n"; echo "
\n"; // Konturpunkte echo "
\nKonturpunkte VT\n
\n"; foreach($vt_contour as $cp){ $nr=$cp['nr']; if($P_[$nr][0]<1e14 && $cp['lbl']!=='') printf("
%s x=%.2f y=%.2f%s
\n", $cp['lbl'],$P_[$nr][0],$P_[$nr][1], $cp['info']?" [{$cp['info']}]":''); } echo "
\n"; echo "
\nKonturpunkte RT\n
\n"; foreach($rt_contour as $cp){ $nr=$cp['nr']; if($P_[$nr][0]<1e14 && $cp['lbl']!=='') printf("
%s x=%.2f y=%.2f%s
\n", $cp['lbl'],$P_[$nr][0],$P_[$nr][1], $cp['info']?" [{$cp['info']}]":''); } echo "
\n"; // ---- Export-Sektion ---- echo "
\n"; echo "

Export & Druck

\n"; // Button: Zeichnung als PNG echo "\n"; // Button: Zeichnung als PDF echo "\n"; // Button: Drucken (Zeichnung) echo "\n"; // Button: Sidebar drucken echo "\n"; // Button: Konstruktionsdaten herunterladen (PHP-Link) echo "\n"; echo "\n"; echo " 📜 PHP-Quellcode
autocons.php im Browser anzeigen
\n"; echo "
\n"; ?>
Schritte  ·  ←→ Pfeiltasten  ·  Leertaste Play/Pause  ·  Esc Schließen
0 /
\nconst DESCS = [\n"; foreach($svgSteps as $i=>$st){ echo " ".json_encode($st['desc'],JSON_UNESCAPED_UNICODE); echo ($i\n"; ?>