diff --git a/restricted/aussenplan.php b/restricted/aussenplan.php index 86e99a0..d392b70 100644 --- a/restricted/aussenplan.php +++ b/restricted/aussenplan.php @@ -107,14 +107,21 @@ function aussenFlaechen() [24.3, 19.5], [36.8, 17.2], [39.2, 31.2], [24.2, 33.8], [22.7, 24.2], [19.9, 25.6], [20.2, 28.7], [19.0, 29.8], [19.3, 39.1]]], + // Der Hof laeuft vor dem EG-Carport gerade bis an den Garten weiter; + // der Carport steht also auf ihm. Die suedliche Kante ist die + // Gartengrenze - dieselben beiden Punkte stehen dort im Umriss. ["raum" => null, "z" => 0, "hoehe" => 0, "farbe" => "#6e7278", // Hof - "ecken" => [[9.3, 26.1], [8.9, 36.4], [11.0, 36.0], [18.9, 34.7], [19.0, 29.8], - [20.4, 28.7], [19.8, 25.6], [19.6, 24.3]]], + "ecken" => [[9.3, 26.1], [8.9, 36.4], [8.6, 40.6], [19.3, 39.1], [18.9, 34.7], + [19.0, 29.8], [20.4, 28.7], [19.8, 25.6], [19.6, 24.3]]], // Das Haus. First ueber die laengere Achse, also Ost-West - so liegt // er auch auf dem Luftbild. + // Die Anlage liegt auf der Suedschraege. Die Wiederkehr wird danach + // gezeichnet und deckt die Mitte ab - genau wie auf dem Luftbild, wo + // die Module links und rechts von ihr liegen. ["raum" => null, "z" => 0, "hoehe" => 6, "farbe" => "#d5d9df", "dachfarbe" => "#9aa3ad", "dach" => ["art" => "sattel", "hoehe" => 3], + "pv" => "S", "ecken" => [[36.8, 17.2], [39.2, 31.2], [24.2, 33.8], [21.8, 19.8]]], // Wiederkehr auf der Suedseite: ein Kreuzgiebel quer zum Hauptfirst. @@ -138,14 +145,14 @@ function aussenFlaechen() // Garagendachs an - deshalb 2,23 + 0,27 und nicht glatt 2,5: die // Oberkante der hohen Seite soll die 2,5 treffen, nicht die Wand. ["raum" => "Carport OG", "z" => 0, "hoehe" => 2.23, "farbe" => "#b8b3aa", - "dachfarbe" => "#a8a29a", "pv" => true, + "dachfarbe" => "#a8a29a", "dachdicke" => 0.3, "dach" => ["art" => "pult", "hoehe" => 0.27, "tief" => "W"], "offen" => ["S"], "ecken" => [[12.2, 19.2], [13.3, 25.4], [9.3, 26.1], [8.2, 19.9]]], // Der EG-Carport faellt nach Sueden ab und ist nach Westen offen. ["raum" => "Carport EG", "z" => 0, "hoehe" => 2.2, "farbe" => "#b8b3aa", - "dachfarbe" => "#a8a29a", "pv" => true, + "dachfarbe" => "#a8a29a", "pv" => true, "dachdicke" => 0.3, "dach" => ["art" => "pult", "hoehe" => 0.23, "tief" => "S"], "offen" => ["W"], "ecken" => [[19.0, 34.6], [19.3, 39.1], [10.7, 40.3], [10.4, 35.8]]], @@ -170,7 +177,10 @@ function aussenFlaechen() ["raum" => "Terrasse OG", "z" => 3, "hoehe" => 0, "farbe" => "#c3cbd5", "ecken" => [[23.8, 31.1], [28.3, 30.4], [29.0, 33.0], [24.2, 33.8]]], - ["raum" => "Pergola", "z" => 0, "hoehe" => 0, "farbe" => "#9aa3ad", + // Ein Sonnensegel, kein Bauwerk: eine Bahn Tuch auf zwei Metern. Dass + // sie ohne Sichtbares darunter schwebt, ist richtig so - die Masten + // sind duenner als ein Strich bei diesem Massstab. + ["raum" => "Pergola", "z" => 2, "hoehe" => 0, "farbe" => "#c6cbd2", "ecken" => [[48.0, 36.5], [43.8, 36.4], [46.0, 31.5], [49.4, 32.4]]], ]; } @@ -632,22 +642,59 @@ function aussenZeichnung() $polygone[] = ["punkte" => $schraege, "farbe" => aussenSchatten($f["dachfarbe"] ?? "#9aa3ad", $r === "S" || $r === "W" ? 1.0 : 0.82)]; + // Module auf genau dieser Schraege. Eingezogen wird hier + // im Bild und nicht in Metern: die Flaeche ist schon + // projiziert, und auf ihrer Ebene bleibt der Einzug auch + // nach der Projektion ein Einzug. + if (($f["pv"] ?? null) === $r) { + $polygone[] = ["punkte" => aussenEinzug($schraege, 4.0), + "farbe" => "#2f3a49"]; + } } } $deck = null; } else { // Flach, Pult oder gar kein Dach: die Oberseite ist die Deckflaeche. - $polygone[] = ["punkte" => $oben, "farbe" => $f["dachfarbe"] ?? $farbe]; - $deck = $oben; + // + // Eine Dachdicke braucht zwingend einen Ueberstand. Liegt das Dach + // buendig auf der Wand, sind Stirnflaeche und Wandflaeche + // deckungsgleich - die Dicke waere gerechnet und trotzdem nicht zu + // sehen, und der Koerper saehe aus, als fehle ihm eine Wand. + $dachdicke = $f["dachdicke"] ?? 0; + $dachEcken = $dachdicke > 0 + ? aussenEinzug($ecken, -($f["ueberstand"] ?? 0.25)) + : $ecken; + $deckPunkte = []; + foreach ($dachEcken as $i => $pkt) { + $deckPunkte[] = aussenPunkt($einpassung, $pkt[0], $pkt[1], $zOben[$i]); + } + if ($dachdicke > 0) { + foreach ($dachEcken as $i => $pkt) { + $j = ($i + 1) % count($dachEcken); + $stirn = [ + aussenPunkt($einpassung, $pkt[0], $pkt[1], $zOben[$i] - $dachdicke), + aussenPunkt($einpassung, $dachEcken[$j][0], $dachEcken[$j][1], + $zOben[$j] - $dachdicke), + aussenPunkt($einpassung, $dachEcken[$j][0], $dachEcken[$j][1], $zOben[$j]), + aussenPunkt($einpassung, $pkt[0], $pkt[1], $zOben[$i]), + ]; + if (aussenSichtbar($stirn)) { + $polygone[] = ["punkte" => $stirn, + "farbe" => aussenSchatten($f["dachfarbe"] ?? $farbe, 0.78)]; + } + } + } + $polygone[] = ["punkte" => $deckPunkte, "farbe" => $f["dachfarbe"] ?? $farbe]; + $deck = $dachEcken; } - // Die Module liegen plan auf der Dachflaeche - ein Stueck eingezogen, - // damit der Rand des Daches sichtbar bleibt. - if (!empty($f["pv"]) && $deck) { - $modulEcken = aussenEinzug($ecken, 0.4); + // Module auf einer flachen oder geneigten Deckflaeche - ein Stueck + // eingezogen, damit der Rand des Daches sichtbar bleibt. + if (!empty($f["pv"]) && $f["pv"] === true && $deck) { + $modulEcken = aussenEinzug($deck, 0.4); $modul = []; - foreach ($modulEcken as $i => $p) { - $modul[] = aussenPunkt($einpassung, $p[0], $p[1], $zOben[$i] + 0.05); + foreach ($modulEcken as $i => $pkt) { + $modul[] = aussenPunkt($einpassung, $pkt[0], $pkt[1], $zOben[$i] + 0.05); } $polygone[] = ["punkte" => $modul, "farbe" => "#2f3a49"]; }