Der Lageplan des Aussengelaendes ist gezeichnet

Die elf Flaechen sind am Luftbild abgeklickt und danach gerichtet worden:
von Hand trifft man keine rechten Winkel, und Ecken, die derselbe Punkt sein
sollten, lagen ein paar Dezimeter auseinander.

Gerichtet wurde im Bezugssystem des Grundstuecks. Dessen Ausrichtung steckt
in den Hauskanten - laengengewichtet gemittelt ueber den vierfachen Winkel,
weil vier Kanten in vier Richtungen desselben Rasters zeigen und erst der
vierfache Winkel sie zusammenfallen laesst. Ergebnis: -9,77 Grad.

In diesem System sind die Gebaeude achsparallel. Sie durch ihr umschliessendes
Rechteck zu ersetzen macht sie damit genau rechtwinklig, und das anschliessende
Zusammenschnappen der Koordinaten - u und v getrennt - laesst sie Rechtecke
bleiben. Andersherum waere das nicht gegangen: schnappt man vorher, stehen die
Winkel wieder schief.

Hof, Garten und Pergola bleiben, wie sie abgeklickt wurden. Die ersten beiden
sind gewachsene Formen, und am dritten haengt ein Sonnensegel - die sind
selten rechteckig. Ihre Ecken schnappen trotzdem mit, sonst klafften Luecken
zu den Gebaeuden.

Ergebnis, alle acht Gebaeude auf 90,0 Grad:

  Haus         15,3 x 14,2 m      Veranda EG/OG   2,4 x 11,5 m
  Garage        6,5 x  6,4 m      Terrasse EG/OG  2,6 x  5,0 m
  Carport OG    4,0 x  6,4 m      Carport EG      9,0 x  4,3 m

Die groesste Verschiebung einer Ecke betrug 0,92 m, die meisten lagen unter
einem halben Meter.

Dazu zwei Fehler am Dach, die erst die Zeichnung zeigte: die Giebel standen
offen, sodass an den Schmalseiten die Wand durchschien, und der First lag
fest an den Ecken 0/3 und 1/2 - bei einem quer stehenden Gebaeude waere er
damit ueber die kurze Achse gelaufen. Jetzt schliessen zwei Giebeldreiecke
das Dach, und der First richtet sich nach der laengeren Seite.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 20:24:07 +02:00
co-authored by Claude Opus 5
parent e2b97c049e
commit ff74ec3c68
+67 -10
View File
@@ -102,7 +102,39 @@ const PLAN_RAND = 12;
function aussenFlaechen()
{
return [
// Hier kommen die abgeklickten Flächen hinein.
["raum" => null, "z" => 0, "hoehe" => 6, "dach" => 3,
"farbe" => "#c8cdd6",
"ecken" => [[36.8, 17.2], [39.2, 31.2], [24.2, 33.8], [21.8, 19.8]]],
["raum" => null, "z" => 0, "hoehe" => 0, "dach" => 0,
"farbe" => "#57585a",
"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]]],
["raum" => "Carport EG", "z" => 0, "hoehe" => 2.2, "dach" => 0,
"farbe" => "#3f4a63",
"ecken" => [[18.9, 34.7], [19.6, 38.9], [10.7, 40.5], [10.0, 36.2]]],
["raum" => "Carport OG", "z" => 0, "hoehe" => 2.5, "dach" => 0,
"farbe" => "#6f7680",
"ecken" => [[12.2, 19.1], [13.2, 25.4], [9.3, 26.1], [8.2, 19.8]]],
["raum" => "Veranda EG", "z" => 0, "hoehe" => 0, "dach" => 0,
"farbe" => "#9a7b52",
"ecken" => [[24.1, 19.4], [26.1, 30.8], [23.7, 31.2], [21.8, 19.8]]],
["raum" => "Veranda OG", "z" => 3, "hoehe" => 0, "dach" => 0,
"farbe" => "#c9a978",
"ecken" => [[24.1, 19.4], [26.1, 30.8], [23.7, 31.2], [21.8, 19.8]]],
["raum" => "Terrasse EG", "z" => 0, "hoehe" => 0, "dach" => 0,
"farbe" => "#9a7b52",
"ecken" => [[23.7, 31.2], [28.6, 30.3], [29.1, 32.9], [24.2, 33.8]]],
["raum" => "Terrasse OG", "z" => 3, "hoehe" => 0, "dach" => 0,
"farbe" => "#c9a978",
"ecken" => [[23.7, 31.2], [28.6, 30.3], [29.1, 32.9], [24.2, 33.8]]],
["raum" => "Pergola", "z" => 0, "hoehe" => 0, "dach" => 0,
"farbe" => "#7a6a8f",
"ecken" => [[48.0, 36.5], [43.8, 36.4], [46.0, 31.5], [49.4, 32.4]]],
["raum" => "Garage", "z" => 0, "hoehe" => 2.5, "dach" => 1.5,
"farbe" => "#8a9099",
"ecken" => [[12.2, 19.1], [13.2, 25.4], [19.6, 24.3], [18.5, 18.0]]],
["raum" => "Garten", "z" => 0, "hoehe" => 0, "dach" => 0,
"farbe" => "#2e5c33",
"ecken" => [[8.6, 40.8], [7.9, 45.2], [49.0, 38.2], [50.6, 12.5], [23.7, 17.1], [24.1, 19.4], [36.8, 17.2], [39.2, 31.2], [24.2, 33.8], [22.5, 23.8], [19.8, 25.6], [20.4, 28.7], [19.0, 29.8], [19.6, 38.9]]],
];
}
@@ -252,16 +284,41 @@ function aussenZeichnung()
$polygone[] = ["punkte" => $oben, "farbe" => $farbe];
if ($dach > 0 && count($f["ecken"]) === 4) {
// Satteldach mit First über der Mitte der beiden Schmalseiten.
$e = $f["ecken"];
$first1 = aussenPunkt($einpassung, ($e[0][0] + $e[3][0]) / 2,
($e[0][1] + $e[3][1]) / 2, $z + $hoehe + $dach);
$first2 = aussenPunkt($einpassung, ($e[1][0] + $e[2][0]) / 2,
($e[1][1] + $e[2][1]) / 2, $z + $hoehe + $dach);
$polygone[] = ["punkte" => [$oben[0], $oben[1], $first2, $first1],
"farbe" => $f["dachfarbe"] ?? "#b5563a"];
$polygone[] = ["punkte" => [$oben[3], $oben[2], $first2, $first1],
"farbe" => aussenSchatten($f["dachfarbe"] ?? "#b5563a", 0.78)];
// Der First laeuft ueber die laengere Achse - er verbindet die
// Mitten der beiden kuerzeren Seiten. Fest verdrahtet waere das
// bei einem quer stehenden Gebaeude falsch herum.
$laenge = function ($a, $b) {
return hypot($a[0] - $b[0], $a[1] - $b[1]);
};
$langsSeite01 = $laenge($e[0], $e[1]) >= $laenge($e[1], $e[2]);
$paar = $langsSeite01 ? [[0, 3], [1, 2]] : [[0, 1], [2, 3]];
$first = [];
foreach ($paar as $pp) {
$first[] = aussenPunkt($einpassung,
($e[$pp[0]][0] + $e[$pp[1]][0]) / 2,
($e[$pp[0]][1] + $e[$pp[1]][1]) / 2,
$z + $hoehe + $dach);
}
$dachfarbe = $f["dachfarbe"] ?? "#b5563a";
// Erst die beiden Giebeldreiecke, dann die Dachflaechen darueber:
// ohne sie klaffte an den Schmalseiten ein Loch, durch das die
// Wand darunter zu sehen war.
foreach ($paar as $i => $pp) {
$polygone[] = ["punkte" => [$oben[$pp[0]], $oben[$pp[1]], $first[$i]],
"farbe" => aussenSchatten($farbe, 0.88)];
}
if ($langsSeite01) {
$polygone[] = ["punkte" => [$oben[0], $oben[1], $first[1], $first[0]],
"farbe" => $dachfarbe];
$polygone[] = ["punkte" => [$oben[3], $oben[2], $first[1], $first[0]],
"farbe" => aussenSchatten($dachfarbe, 0.78)];
} else {
$polygone[] = ["punkte" => [$oben[1], $oben[2], $first[1], $first[0]],
"farbe" => $dachfarbe];
$polygone[] = ["punkte" => [$oben[0], $oben[3], $first[1], $first[0]],
"farbe" => aussenSchatten($dachfarbe, 0.78)];
}
}
$stuecke[] = ["tiefe" => $tiefe, "polygone" => $polygone,