Files
admGitAICDSandClaude Opus 5 1ac99b1660
Deploy App / deploy (push) Successful in 27s
Nordgrenze zum Nachbarn, Torbogen, einfacher Rundgang
Nordgrenze
- Sitzmauer und Travertinmauer waren vertauscht. Der Plan zeichnet aussen,
  auf der Terrasse der Nachbarn, die "Sitzmauer" (0.55 tief, rund 40 cm
  hoch: Terrasse -1.77, Krone -1.35) und direkt dahinter die
  "Travertinmauer", die jetzt bis auf das Niveau der Nachbarn hinunter-
  reicht - sie sehen Naturstein statt Beton.
- Terrasse der Nachbarn fest auf -1.77.
- Schotterwiese (Flaechen 4 und 5) eben: quer kein Hang mehr, laengs folgt
  sie der Feuerwehrzufahrt. Unter der Ligusterhecke fassen Winkelelemente
  den Garten der Nachbarn, so wie der Plan sie dort beschriftet. Wiesen mit
  fester Ebene werden jetzt plan gerendert statt dem Raster zu folgen.
- Eingang fuer die Nachbarn: Travertinstufe in der Luecke zwischen Hecke
  und Mauer ("Stufe" im Plan), darueber ein Torbogen aus Cortenstahl mit
  Kletterrose. Kein Tor.

Rundgang
- Klick auf den Boden laeuft dorthin, Ziehen dreht den Blick. Kein
  Mausfang mehr.
- Weiches Anfahren und Bremsen, gedaempftes Nachfuehren bei Stufen statt
  Fall-und-Aufprall, Rutschen an Hindernissen.
- Travertinmauern mit fester Krone sind begehbar; man steigt ueber die
  Sitzmauer vom Sitzplatz auf den Rasen, statt springen zu muessen.
- Gartentor oeffnet sich beim Naehertreten und schliesst hinter einem, E
  uebersteuert. Schwelle unter dem Tor schliesst die Luecke zum Podest.
- Blickrichtung blieb beim Wechsel Uebersicht/Rundgang nicht erhalten
  (Vorzeichenfehler in yawDegrees).
- mergeGeometries loest indizierte Geometrien vorher auf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:50:44 +02:00

611 lines
28 KiB
JavaScript

/**
* Handgepflegte Ergaenzungen zum Plan.
*
* Der PDF-Plan liefert Flaechen, Pflanzensymbole und Hoehenkoten. Alles, was
* im Plan nur beschriftet ist (Mauerhoehen, Bauteile, Gebaeude), steht hier -
* abgeleitet aus den Planbeschriftungen, den Architekturplaenen von EHLE
* Architekten (Haus 9a, 27.04.2021) und den Fotos des Ist-Zustands.
*
* Alle Koordinaten im Site-Frame in Metern:
* X = Hausachse ENE (Peilung 61.16 deg)
* Z = senkrecht SSE (Peilung 151.16 deg)
* Y = Hoehe relativ zum Fixpunkt 0.00 = 651.17 m ue. M. (= OK FB EG Haus 9a)
*/
/** Farbe im Plan -> Belagsart. Reihenfolge egal, Zuordnung ueber Hex. */
export const SURFACE_BY_COLOR = {
'#ffffcc': 'travertin80', // Travertinplatten: grosse Felder 80x80x3, kleine Rechtecke 40x60x3
'#fcffe7': 'dekorkies', // Dekorkies-Bett; noerdlich der Grenze die Keramikterrasse Zollet
'#f8ffcc': 'travertinstell',// Travertinstellplatten-Streifen
'#eee8cc': 'travertinmauer',// Mauerkronen, Sitzmauern, schwebende Stufen
'#e5ffe5': 'rasen',
'#ccffcc': 'rasen',
'#ccff99': 'schotterwiese',
'#eeeeee': 'keramik', // Keramikplatten 60x60x2 (bauseits vorhanden)
'#bbbbbb': 'verbundstein', // Anpassung Verbundsteine Nachbar
'#ddba99': 'beet',
'#c0bab4': 'spielsand',
'#ffaa00': 'holzscheiter', // orange markiert: die beiden Holzscheiterwaende im Sichtschutz
'#ddd299': 'travertinstell',
'#73e900': 'ligusterhecke',
'#cccccc': 'winkelelement',
'#aaaaaa': 'spielhaus',
'#b29f3c': 'spielhaus',
'#80712a': 'gartenhaus',
'#335533': 'roboter',
};
/** Pflanzensymbole: Planfarbe -> Art. Radius kommt aus dem Plankreis. */
export const PLANT_BY_COLOR = {
'#00bb00': 'eibe', // Eiben `Hilli` 80/100 cm - Heckenpflanzen und ein Solitaer
'#66ff33': 'solitaer',
'#33ff99': 'solitaer',
'#cc5599': 'solitaer', // Parrotia persica, persischer Eisenholzbaum
'#99ff66': 'strauch', // Heidelbeeren / Beerenstraeucher
'#7fff00': 'gras',
'#99ff00': 'kraut',
'#cbe900': 'kraut',
'#74ff63': 'kraut',
'#e8ff64': 'kraut',
'#59b500': 'kraut',
'#0c8e2d': 'kraut',
'#00e93c': 'kraut',
'#33ff66': 'kraut',
'#339966': 'kraut',
'#00dbdd': 'kraut',
'#ccccff': 'kraut',
'#ff66cc': 'kraut',
'#7863ff': 'kraut',
};
/**
* Solitaergehoelze und Baeume. Die Kronenradien stammen aus den Plankreisen,
* die Stammhoehen sind Erfahrungswerte fuer die im Plan gezeigten Groessen.
*/
export const TREES = [
{ name: 'Solitärgehölz Sitzplatz Süd', x: -17.5, z: 1.6, crown: 1.34, height: 4.6, species: 'parrotia' },
{ name: 'Solitärgehölz Terrasse NW', x: -19.1, z: -5.5, crown: 0.67, height: 3.2, species: 'parrotia' },
{ name: 'Solitärgehölz Flammengrill', x: -4.0, z: 3.9, crown: 0.63, height: 3.0, species: 'parrotia' },
{ name: 'Apfelbaum', x: 1.69, z: 4.05, crown: 0.9, height: 3.4, species: 'apfel' },
// Nachbargarten Zollet, im Plan mitgezeichnet
{ name: 'Solitärgehölz Zollet', x: -17.6, z: -10.2, crown: 1.34, height: 4.6, species: 'parrotia', neighbour: true },
];
/**
* Die beiden Hauptebenen des Gartens.
*
* Der Garten liegt auf zwei Niveaus: der Hauptsitzplatz aus Travertinplatten
* liegt auf -0.33, dahinter steht die Travertinsitzmauer mit 31 cm Ansichtshoehe,
* und direkt hinter ihr geht es eben weiter auf -0.02 mit Rasen, Kiesfeld und
* Flammengrill. Flaechen, deren Schwerpunkt in einem dieser Bereiche liegt,
* werden exakt auf das Niveau gelegt statt aus streuenden Koten geschaetzt.
*
* Gegen Osten steigt der Garten laut Plan weiter an (0.26 bis 0.63) - dort
* bleibt die Ausgleichsebene aus den Koten stehen.
*/
export const LEVELS = [
{
// Terrasse der Nachbarn: Kote -1.77 auf den Keramikplatten. Die -1.35
// daneben ist die Krone ihrer Sitzmauer.
id: 'zollet-terrasse', level: -1.77, flatten: true, types: ['keramik'],
note: 'Keramikterrasse der Nachbarn',
polygon: [[-20.12, -12.10], [-13.90, -12.10], [-13.90, -6.60], [-20.12, -6.60]],
},
{
// Die Schotterwiese zwischen Grenze und Winkelelementen ist eben - quer
// dazu kein Hang, laengs folgt sie der Feuerwehrzufahrt.
id: 'schotterwiese', plane: [0, 0.1364, -1.096], flatten: true, types: ['schotterwiese'],
note: 'Schotterwiese, eben neben der Feuerwehrzufahrt',
polygon: [[-22.12, -13.60], [-19.99, -13.60], [-19.99, -7.67], [-20.52, -7.49], [-20.52, -6.70],
[-20.02, -6.67], [-20.56, 0.45], [-21.74, 0.45], [-21.74, 0.35], [-22.12, 0.35]],
},
{
// Vor dem Gartentor liegt ein Podest auf -0.14 (Plan: dreimal -0.14 bis
// zur Suedwestecke). Es ist der westliche Arm des Wegs um das Haus und
// geht an der Ecke in den Weg entlang der Suedgrenze ueber. Erst von hier
// fuehrt die Treppe hinunter auf die Feuerwehrzufahrt.
id: 'weg-west', level: -0.14, types: ['tegula'],
note: 'Podest vor dem Gartentor',
polygon: [[-23.40, 2.15], [-21.70, 2.15], [-21.70, 6.05], [-23.40, 6.05]],
},
{
// Die Feuerwehrzufahrt ist eine Rampe: der Plan gibt -2.08 bei z -7.21
// und -1.08 bei z 0.12 an, also rund 13.6 % Steigung. Ohne feste Vorgabe
// legt sich der Belag als schwebende Platte ueber das Gelaende.
id: 'feuerwehrzufahrt', plane: [0, 0.1364, -1.096], types: ['tegula'],
note: 'Feuerwehrzufahrt als Rampe',
polygon: [[-25.90, -13.80], [-21.90, -13.80], [-21.90, 6.60], [-25.90, 6.60]],
},
{
// Der Ostweg steigt von der Treppenkrone (-0.37 bei z -4.18) bis zur
// Suedostecke (0.63 bei z 4.31) gleichmaessig an - im Architekturplan
// steht dort "Steigung 9.9%".
id: 'weg-ost', plane: [0, 0.1178, 0.1224], types: ['tegula'],
note: 'Ostweg als Rampe',
polygon: [[2.05, -4.30], [4.55, -4.30], [4.55, 5.05], [2.05, 5.05]],
},
{
id: 'stellplatte-nordost', level: -1.57, types: ['tegula'],
note: 'Stellplatte des Nachbarn auf der Hoehe des Treppenfusses',
polygon: [[0.30, -11.30], [4.70, -11.30], [4.70, -7.25], [0.30, -7.25]],
},
{
id: 'weg-ost-unten', level: -1.57, types: ['tegula'],
note: 'Podest am Fuss der Osttreppe',
polygon: [[2.10, -7.40], [4.55, -7.40], [4.55, -6.45], [2.10, -6.45]],
},
{
// Der Weg an der Suedgrenze folgt dem Anstieg der Grenzkoten von -0.04
// im Westen auf 0.63 im Osten.
id: 'weg-sued', plane: [0.0305, 0, 0.5231], types: ['tegula'],
note: 'Weg an der Suedgrenze als Rampe',
polygon: [[-21.90, 4.45], [4.55, 4.45], [4.55, 6.05], [-21.90, 6.05]],
},
{
// Der Rasen der oberen Ebene ist eben. Die Koten 0.09 bis 0.26 liegen
// schon im angehobenen Kiesbett des Sichtschutzes, nicht mehr im Rasen -
// ohne feste Vorgabe zieht die Interpolation den Rasen huegelig hoch.
id: 'oben', level: -0.02, flatten: true,
note: 'Obere Ebene: Rasen und Kiesfeld, eben auf -0.02',
polygon: [[-18.30, 0.90], [-4.70, 0.90], [-4.70, 4.00], [-18.30, 4.00]],
},
{
id: 'unten',
level: -0.33,
note: 'Untere Ebene: Hauptsitzplatz Travertin mit Kiesstreifen und Eiben',
polygon: [
[-21.90, -6.65], [-13.75, -6.65], [-13.75, 0.90],
[-18.42, 0.90], [-18.42, 4.15], [-21.90, 4.15],
],
},
{
id: 'oben',
level: -0.02,
note: 'Obere Ebene beim Uebergang: gedeckter Sitzplatz und Rasen an der Mauer',
polygon: [[-14.00, -3.20], [-10.20, -3.20], [-10.20, 1.00], [-14.00, 1.00]],
types: ['keramik'],
},
];
/**
* Mauern, Stuetzelemente und Waende.
* `path` = Mittellinie, `t` = Dicke, `top`/`base` = Hoehe der Krone bzw. des Fusses
* (null = folgt dem Gelaende). Alle Werte aus den Planbeschriftungen und Koten.
*/
export const WALLS = [
{
// Der Plan zeichnet an der Nordgrenze zwei Baender: aussen, auf der
// Terrasse der Nachbarn, die "Sitzmauer" (0.55 tief), direkt dahinter die
// "Travertinmauer". Die Sitzmauer ist eine Bank fuer die Nachbarn - rund
// 40 cm hoch (Terrasse -1.77, Krone -1.35). Die Travertinmauer dahinter
// reicht bis auf ihr Niveau hinunter, damit sie eine Natursteinwand sehen
// und keinen Betonblock.
id: 'sitzmauer-nachbar', type: 'travertin',
note: 'Sitzmauer auf der Terrasse der Nachbarn, rund 40 cm hoch',
path: [[-18.17, -6.895], [-13.82, -6.895]], t: 0.55, top: -1.35, base: -1.95,
},
{
id: 'travertinmauer-nord', type: 'travertin',
note: 'Travertinmauer an der Nordgrenze, von der Terrasse der Nachbarn bis knapp ueber das Kiesbett des Gartens',
path: [[-20.08, -6.47], [-13.82, -6.47]], t: 0.30, top: -0.08, base: -2.15,
},
{
// Der Plan beschriftet auch entlang der Ligusterhecke "Winkelelemente":
// sie fassen den Garten der Nachbarn ueber der ebenen Schotterwiese.
id: 'winkelelemente-liguster', type: 'beton',
note: 'Winkelelemente unter der Ligusterhecke, stuetzen den Garten der Nachbarn',
path: [[-20.10, -13.60], [-20.10, -7.60]],
t: 0.22, top: null, base: null, retains: 'zollet',
},
{
// Die "Stufe" des Plans in der Luecke zwischen Ligusterhecke und Mauer:
// hier betreten die Nachbarn ihren Garten von der Schotterwiese her.
id: 'stufe-eingang-nachbar', type: 'travertin',
note: 'Travertinstufe unter dem Torbogen zum Garten der Nachbarn',
path: [[-20.31, -7.47], [-20.31, -6.67]], t: 0.42, top: -1.77, base: -2.20,
},
{
id: 'winkelelemente-west', type: 'beton',
note: 'Winkelelemente aus Beton entlang der Westgrenze, stuetzen den Garten ueber der Feuerwehrzufahrt',
path: [[-20.12, -6.62], [-20.66, 0.51], [-21.70, 0.52], [-21.70, 2.37]],
t: 0.22, top: null, base: null, retains: 'west',
},
{
// Diese Mauer ist der Hoehensprung zwischen den beiden Ebenen: Krone
// buendig mit der oberen Ebene (-0.02), Fuss auf der unteren (-0.33).
// Ansichtshoehe damit genau 31 cm.
id: 'travertinsitzmauer-west', type: 'travertin',
note: 'Travertinsitzmauer: 31 cm Hoehensprung vom Hauptsitzplatz zum Rasen',
path: [[-18.64, 0.755], [-14.73, 0.755]], t: 0.41, top: -0.02, base: -0.55, seating: true,
},
{
id: 'travertinsitzmauer-sued', type: 'travertin',
note: 'Schenkel der Travertinsitzmauer laengs des Rasens, gleicher Hoehensprung',
path: [[-18.44, 0.55], [-18.44, 3.94]], t: 0.40, top: -0.02, base: -0.55, seating: true,
},
{
// Der Plan beschriftet die Linien an der Ostgrenze mit "Winkelelemente":
// sie stuetzen den Garten gegen den tiefer liegenden Fussweg ab.
id: 'winkelelemente-ost', type: 'beton',
note: 'Winkelelemente aus Beton an der Ostgrenze, gegen den Fussweg',
path: [[4.45, -6.90], [4.45, 4.90]],
t: 0.16, top: null, base: null, retains: 'ost',
},
{
id: 'betonmauer-nachbar', type: 'beton',
note: 'Bestehende Betonmauer des Suednachbarn entlang der Grenze',
path: [[-17.41, 6.07], [1.99, 6.07]], t: 0.20, top: 1.10, base: -0.60,
},
{
id: 'betonmauer-nachbar-ost', type: 'beton',
note: 'Rueckspringender Schenkel der Nachbarmauer',
path: [[2.09, 6.07], [2.09, 9.05]], t: 0.20, top: 1.10, base: -0.60,
},
// Der Plan zeigt zwei orange markierte Felder von 1.50 x 0.46 m in der
// Sichtschutzlinie; die Beschriftung "Holzscheiterwand 150 cm x 200 cm"
// steht zwischen ihnen und gilt fuer beide.
{
id: 'holzscheiterwand-west', type: 'holzscheiter',
note: 'Holzscheiterwand 150 cm breit, 200 cm hoch, hinter dem Flammengrill',
path: [[-6.08, 4.18], [-4.58, 4.18]], t: 0.46, top: 2.32, base: 0.22,
},
{
id: 'holzscheiterwand-ost', type: 'holzscheiter',
note: 'Zweite Holzscheiterwand 150 cm breit, 200 cm hoch',
path: [[-8.74, 4.18], [-7.24, 4.18]], t: 0.46, top: 2.28, base: 0.18,
},
{
// Das Podest liegt bis 0.65 m ueber der Feuerwehrzufahrt. Ohne Abschluss
// stuende dort eine Grasboeschung von einer Rasterzelle Breite.
id: 'abschluss-podest-west', type: 'beton',
note: 'Betonabschluss des Podests gegen die Feuerwehrzufahrt',
path: [[-23.42, 2.20], [-23.42, 6.00]], t: 0.16, top: -0.10, base: -1.00,
},
{
id: 'lamellenwand', type: 'lamellen',
note: 'Lamellenwand zum Sitzen: senkrechte Holzlamellen am gedeckten Sitzplatz',
path: [[-13.26, 0.91], [-8.73, 0.91]], t: 0.34, top: 2.72, base: -0.05, openSlats: true,
},
];
/** Freistehende Bauteile und Moeblierung. rot = Drehung um Y in Grad. */
export const PROPS = [
// Schwelle unter dem Gartentor: schliesst die Luecke zwischen der oberen
// Torstufe und dem Podest, damit man eben durch das Tor geht.
{ id: 'schwelle-gartentor', type: 'stufe', x: -21.60, z: 3.06, w: 0.34, d: 1.10, h: 0.08, rot: 0, top: -0.13,
note: 'Travertinschwelle unter dem Gartentor' },
// Kleiner Eingang fuer die Nachbarn: ein Torbogen aus Cortenstahl ueber der
// Travertinstufe, ohne Tor. Durchgang in Site-X, der Bogen spannt laengs Z.
{ id: 'torbogen-nachbar', type: 'torbogen', x: -20.31, z: -7.07, w: 0.84, d: 0.42, h: 1.95, rot: 90,
base: -1.77, note: 'Torbogen zum Garten der Nachbarn' },
// Der Plan reserviert 1.8 x 1.8 m fuer das Gartenhaus. Gebaut wird dort ein
// schmaler Gartenschrank: 1.80 m breit, nur 0.50 m tief, rund 2.00 m hoch,
// mit dem Ruecken zum Beerenbeet und den Tueren zum Hauszugang hin.
{ id: 'gartenschrank', type: 'gartenhaus', x: 1.215, z: -4.23, w: 0.50, d: 1.80, h: 2.00, rot: -90,
note: 'Gartenschrank 1.80 x 0.50 m, 2.00 m hoch' },
// Der Plan zeichnet zwei Rechtecke: das Podest 1.81 x 2.70 m (x -0.95 bis
// 0.86) und darauf die Huette 1.01 x 2.70 m an der Ostseite (x -0.15 bis
// 0.86). Die Kote 1.47 im Podest ist die Hoehe des Bodens - ein Stelzenhaus,
// rund 0.9 m ueber dem Gelaende.
{ id: 'spielhaus', type: 'spielhaus', x: -0.045, z: 3.15, w: 1.81, d: 2.70, h: 1.90, rot: 0,
top: 1.47, note: 'Spielhaus durch Zimmermann, Podest auf 1.47' },
{ id: 'flammengrill', type: 'flammengrill', x: -6.95, z: 2.45, w: 0.7, d: 0.7, h: 0.85, rot: 0,
note: 'Flammengrill im Dekorkiesfeld' },
{ id: 'baenkli', type: 'bank', x: -20.62, z: 1.42, w: 0.50, d: 1.50, h: 0.45, rot: 90,
note: 'Baenkli aus Travertin' },
{ id: 'maehroboter', type: 'roboter', x: -17.87, z: 3.72, w: 0.75, d: 0.55, h: 0.40, rot: 0,
note: 'Garage Maehroboter' },
{ id: 'wasserhahn', type: 'wasserhahn', x: -13.90, z: -4.60, w: 0.12, d: 0.12, h: 0.85, rot: 0 },
{ id: 'schlaufschacht', type: 'schacht', x: -14.35, z: -3.95, w: 0.30, d: 0.30, h: 0.02, rot: 0,
note: 'Schlaufschacht D = 30 cm' },
// Der Torfluegel liegt im Plan bei x -21.53 und laeuft ueber z 2.56 bis 3.56.
{ id: 'gartentor', type: 'tor', x: -21.53, z: 3.06, w: 1.00, d: 0.06, h: 1.20, rot: 90,
base: -0.13, note: 'Gartentor 100 cm, Stabgitter aus Stahl, auf dem oberen Niveau' },
// Zwei schwebende Travertinplatten fuehren vom gedeckten Sitzplatz (-0.02)
// auf den Hauptsitzplatz (-0.33). Lage und Format stehen im Plan, die
// Ausbildung als auskragende Platte zeigt das Referenzbild des Planers.
{ id: 'stufe-oben', type: 'stufe', x: -14.335, z: -1.065, w: 0.81, d: 3.25, h: 0.08, rot: 0,
top: -0.02, note: 'Schwebende Travertinstufe, Tritthoehe -0.02 (Kote im Plan)' },
{ id: 'stufe-unten', type: 'stufe', x: -14.880, z: -1.480, w: 0.80, d: 3.20, h: 0.08, rot: 0,
top: -0.17, note: 'Schwebende Travertinstufe, Tritthoehe -0.17 (Kote im Plan)' },
// Beim Gartentor liegen ebenfalls zwei schwebende Travertinstufen: der Plan
// zeichnet ein Feld 0.80 x 1.60 m mit den Koten -0.13 (Podest am Tor) und
// -0.32 (Anschluss an den Hauptsitzplatz).
{ id: 'stufe-tor-oben', type: 'stufe', x: -21.05, z: 3.35, w: 0.80, d: 0.80, h: 0.08, rot: 0,
top: -0.13, note: 'Schwebende Travertinstufe am Gartentor, Tritthoehe -0.13' },
{ id: 'stufe-tor-unten', type: 'stufe', x: -21.05, z: 2.55, w: 0.80, d: 0.80, h: 0.08, rot: 0,
top: -0.32, note: 'Schwebende Travertinstufe am Gartentor, Tritthoehe -0.32' },
];
/**
* Flaechen, die der Plan nur als weisses Raster zeigt und die deshalb bei der
* Farbklassierung durchfallen - Masse aus den Planlinien.
*/
export const EXTRA_SURFACES = [
{
type: 'keramik',
note: 'Gedeckter Sitzplatz 14.4 m2, Keramikplatten 60x60x2 cm',
polygon: [[-13.93, -3.06], [-8.73, -3.06], [-8.73, 0.86], [-13.93, 0.86]],
},
{
type: 'tegula',
note: 'Feuerwehrzufahrt und Zugangsweg westlich der Grenze, Tegula-Pflastersteine grau',
polygon: [[-25.60, -13.50], [-22.10, -13.50], [-22.10, 0.35], [-23.40, 0.35], [-23.40, 6.40], [-25.60, 6.40]],
},
{
type: 'tegula',
note: 'Podest vor dem Gartentor, westlicher Arm des Wegs um das Haus',
polygon: [[-23.34, 2.20], [-21.74, 2.20], [-21.74, 5.97], [-23.34, 5.97]],
},
{
// Der Plan zeigt oestlich der Grenze einen gepflasterten Weg, erst dahinter
// beginnt die Wiese. Zwei Leuchten stehen daran.
type: 'tegula',
note: 'Weg an der Ostseite, Rampe oberhalb der Treppe (Steigung rund 12%)',
polygon: [[2.12, -4.18], [4.45, -4.18], [4.45, 4.96], [2.12, 4.96]],
},
{
type: 'tegula',
note: 'Weg an der Ostseite, Podest unterhalb der Treppe auf -1.57',
polygon: [[2.17, -7.35], [4.45, -7.35], [4.45, -6.52], [2.17, -6.52]],
},
{
// Schmaler gepflasterter Streifen jenseits der Suedgrenze, zwischen
// Grenze (z 4.49) und den Winkelelementen des Nachbarn (z 4.96).
type: 'tegula',
note: 'Weg entlang der Suedgrenze: von der Grenze bis an die Nachbarmauer gepflastert',
polygon: [[-21.74, 4.49], [4.45, 4.49], [4.45, 5.97], [-21.74, 5.97]],
},
{
type: 'tegula',
note: 'Stellplatte und Sitzplatz des Nachbarn im Nordosten',
polygon: [[0.40, -11.20], [4.60, -11.20], [4.60, -7.30], [0.40, -7.30]],
},
{
// Die schwebenden Stufen im Plan: eine Zwischenebene zwischen dem
// gedeckten Sitzplatz (-0.02) und dem Hauptsitzplatz (rund -0.15).
// Die Hoehensprünge zeigen sich als Sichtkanten der Belaege.
type: 'travertin80',
note: 'Schwebende Stufen (Travertin) zwischen den beiden Sitzplaetzen',
polygon: [[-15.32, -3.12], [-13.87, -3.12], [-13.87, 0.60], [-15.32, 0.60]],
},
];
/**
* Lineare Bauteile, die der Plan benennt, aber nur als Linienbuendel zeichnet:
* Treppen mit Rampe, die zugehoerigen Gelaender und die Entwaesserungsrinnen.
*
* `path` ist die Achse in Laufrichtung, `fromY`/`toY` die Hoehe an Anfang und
* Ende. Die Hoehen stammen aus den Koten beidseits des jeweiligen Bauteils.
*/
export const LINEAR = [
{
// Der Plan zeichnet acht Trittlinien bei z -4.18 bis -6.52 ueber die
// Breite x 2.17 bis 3.78; die Koten daneben lauten -0.37 und -1.57.
id: 'treppe-ost', kind: 'treppe',
note: 'Treppe und Rampe hinunter zum Stellplatz des Nachbarn (-0.37 auf -1.57)',
path: [[3.31, -4.18], [3.31, -6.52]], width: 2.28, fromY: -0.37, toY: -1.57, steps: 7,
},
{
id: 'gelaender-ost', kind: 'gelaender',
note: 'Gelaender laengs der Osttreppe',
path: [[2.17, -4.18], [2.17, -6.52]], fromY: -0.37, toY: -1.57, height: 0.95,
},
{
// Trittlinien bei x -21.94 bis -22.54 im Abstand von 20 cm, Block bis
// x -23.34; Koten -0.28 oben und -1.08 auf der Feuerwehrzufahrt.
id: 'treppe-west', kind: 'treppe',
// Die Trittlinien liegen im Plan parallel zur Rinne, die Treppe laeuft
// also laengs der Grenze nach Norden - nicht quer von ihr weg.
note: 'Treppe und Rampe vom Podest vor dem Gartentor hinunter zur Feuerwehrzufahrt (-0.14 auf -1.08)',
path: [[-22.54, 2.20], [-22.54, 0.35]], width: 1.60, fromY: -0.14, toY: -1.08, steps: 6,
},
{
id: 'gelaender-west', kind: 'gelaender',
note: 'Gelaender an der Treppe zur Feuerwehrzufahrt',
path: [[-23.38, 2.20], [-23.38, 0.35]], fromY: -0.14, toY: -1.08, height: 0.95,
},
{
id: 'rinne-gartentor', kind: 'rinne',
note: 'Entwaesserungsrinne vor dem Gartentor',
path: [[-23.34, 2.295], [-21.74, 2.295]], width: 0.15,
},
{
id: 'edelstahlrinne', kind: 'rinne',
note: 'Edelstahlrinne laengs der Fassade am Hauptsitzplatz',
path: [[-13.98, -6.55], [-13.98, -2.95]], width: 0.13,
},
];
/**
* Hoehe des Sichtschutzes. Er besteht aus aufrechten Travertinstelen
* (50 x 6 cm im Grundriss) und Eibengruppen, die sich abwechseln und
* gemeinsam in einem Dekorkiesbett stehen. Die Stelenpositionen kommen
* direkt aus dem Plan, die Hoehe haengt davon ab, wohin abgeschirmt wird:
*
* - gegen den Suednachbarn, entlang der langen Flaeche: 1.80 m
* - gegen Zollet und die Feuerwehrzufahrt, untere Ebene: 1.50 m
*/
export const STELE_HEIGHTS = [
{ id: 'sued', height: 1.80, test: (x, z) => z > 3.0 },
{ id: 'nord', height: 1.50, test: (x, z) => z < -5.0 },
{ id: 'west', height: 1.50, test: (x) => x < -19.4 },
];
/**
* Gebaeude. Das Wohnhaus 9a ist massgetreu aus dem Gartenplan uebernommen,
* die Hoehen stammen aus der Suedwest- und Nordostfassade 1:100:
* OK FB EG 651.17 -> 0.00 OK FB OG 654.07 -> +2.90
* OK Attika 657.32 -> +6.15 Nachbar Nr. 9 OK FB EG 649.47 -> -1.70
*/
export const BUILDING = {
id: 'haus-9a',
name: 'Haus 9a - Jeanine und Damian Kellenberger',
floorLevel: 0.0,
upperLevel: 2.9,
roofLevel: 6.15,
parapet: 0.35,
/**
* Aussenkante Fassade. Der Baukoerper ist im Grundriss ein Rechteck von
* 14.10 x 7.83 m; die Masse stammen aus den schwarzen Wandflaechen des
* Gartenplans (Nordostfassade z = -6.87, Suedwestfassade z = +0.96).
*/
outline: [[-13.82, -6.87], [0.28, -6.87], [0.28, 0.96], [-13.82, 0.96]],
/**
* Gedeckter Sitzplatz 14.4 m2: im Erdgeschoss zurueckspringende Nische in
* der Suedwestecke, oben vom Obergeschoss ueberdeckt.
*/
loggia: { x0: -13.82, z0: -3.06, x1: -9.06, z1: 0.96, ceiling: 2.75 },
/**
* Vordach ueber dem Hauszugang an der Nordostfassade (x = +0.28). Der
* Situationsplan zeigt ein Eingangspodest von 1.05 + 1.13 m Tiefe, darueber
* das "Vordach (Holzbauer)".
*/
canopy: { face: 'east', a: -2.95, b: 0.75, depth: 2.20, y: 2.28, thickness: 0.16 },
/**
* Oeffnungen, abgegriffen aus den Fassadenplaenen von EHLE Architekten
* (1:100, 27.04.2021). Die Fassaden heissen dort nach Himmelsrichtung:
* Suedostfassade = z +0.96 (lang, zum Garten) -> face 'south'
* Nordostfassade = x +0.28 (kurz, Hauszugang) -> face 'east'
* Suedwestfassade = x -13.82 (kurz, zur Terrasse) -> face 'west'
* Nordwestfassade = z -6.87 (lang, zum Nachbarn) -> face 'north'
* Die Nordwestfassade ist im Plansatz nicht gezeichnet; sie steht am
* Nachbarbau und bleibt geschlossen.
*/
openings: [
// -- Suedostfassade (z = +0.96), zum Garten ---------------------------
// Erdgeschoss: das Lamellenband vor dem gedeckten Sitzplatz und die
// grosse, mittig sitzende Fensterfront.
{ face: 'south', a: -12.44, b: -9.32, sill: 0.15, head: 2.20, kind: 'slats' },
{ face: 'south', a: -8.82, b: -4.67, sill: 0.0, head: 2.19, kind: 'glass' },
// Obergeschoss: zwei Fenster aussen, dazwischen zwei schmale Lamellen.
{ face: 'south', a: -12.44, b: -9.98, sill: 3.08, head: 4.90, kind: 'window', upper: true },
{ face: 'south', a: -8.90, b: -7.67, sill: 3.30, head: 4.90, kind: 'slats', upper: true },
{ face: 'south', a: -6.55, b: -5.40, sill: 3.30, head: 4.90, kind: 'slats', upper: true },
{ face: 'south', a: -3.60, b: -1.10, sill: 3.08, head: 4.90, kind: 'window', upper: true },
// -- Nordostfassade (x = +0.28), Hauszugang ---------------------------
// Der Zugang ist ein Element aus Tuerfluegel und feststehender
// Verglasung, zusammen rund 3.15 m breit.
{ face: 'east', a: -0.65, b: 0.48, sill: 0.0, head: 2.20, kind: 'door' },
{ face: 'east', a: -2.67, b: -0.71, sill: 0.0, head: 2.20, kind: 'glass' },
{ face: 'east', a: -6.40, b: -5.54, sill: 1.19, head: 2.15, kind: 'slats' },
{ face: 'east', a: -5.93, b: -3.36, sill: 3.18, head: 4.94, kind: 'window', upper: true },
// -- Suedwestfassade (x = -13.82), zur Terrasse -----------------------
// Der grosse Ausschnitt daneben ist der gedeckte Sitzplatz selbst.
{ face: 'west', a: -5.60, b: -3.91, sill: 0.42, head: 2.01, kind: 'slats' },
{ face: 'west', a: -5.71, b: -3.07, sill: 3.17, head: 4.97, kind: 'window', upper: true },
],
};
/**
* Nachbargebaeude als Kontext-Volumen. Haus 9 (Zollet) haengt am gleichen
* Baukoerper, liegt aber 1.70 m tiefer und ist gegen Nordwesten versetzt.
*/
export const NEIGHBOUR_BUILDINGS = [
{
// Gleicher Baukoerper wie 9a, gegen Nordwesten versetzt und 1.70 m tiefer.
// Die Westkante endet bei x = -13.9, damit die Keramikterrasse des
// Nachbargartens (Plan: Schwerpunkt -17.1 / -8.6) frei bleibt.
id: 'haus-9', name: 'Haus 9 - Sharon und Alan Zollet',
outline: [[-13.90, -14.70], [0.20, -14.70], [0.20, -6.87], [-13.90, -6.87]],
floorLevel: -1.70, roofLevel: 4.45,
},
];
/**
* Gelaendezonen. Innerhalb einer Zone wird zwischen den Hoehenkoten
* interpoliert; ueber Zonengrenzen hinweg nicht - dort stehen die Stuetzmauern.
*/
export const TERRAIN_ZONES = [
{
id: 'garten', label: 'Garten Kellenberger',
polygon: [[-20.90, -6.60], [4.55, -6.60], [4.55, 5.97], [-20.90, 5.97]],
fallback: -0.05,
},
{
id: 'zufahrt', label: 'Feuerwehrzufahrt / Schotterwiese West',
polygon: [[-26.00, -9.00], [-20.90, -9.00], [-20.90, 6.50], [-26.00, 6.50]],
fallback: -1.20,
},
{
id: 'zollet', label: 'Nachbargarten Zollet',
polygon: [[-24.00, -14.50], [3.00, -14.50], [3.00, -6.60], [-24.00, -6.60]],
fallback: -1.70,
},
{
// Die Grenze der Zone liegt auf den Winkelelementen bei z 4.96: dort
// faengt der Nachbar sein hoeher liegendes Terrain, dahinter steht die
// bestehende Betonmauer.
id: 'sued', label: 'Nachbargrundstück Süd',
polygon: [[-22.00, 5.97], [6.00, 5.97], [6.00, 12.00], [-22.00, 12.00]],
fallback: 0.45,
},
{
id: 'ost', label: 'Wiese Ost',
polygon: [[4.55, -6.60], [9.00, -6.60], [9.00, 5.97], [4.55, 5.97]],
fallback: 0.55,
},
];
/**
* Zusaetzliche Hoehenpunkte, die im Plan nicht als Kote stehen, fuer ein
* plausibles Gelaende aber noetig sind (Auslauf gegen die Grundstuecksraender).
*/
export const EXTRA_SPOTS = [
// Auf der Zufahrt selbst gelten die Plankoten -2.08 (z -7.21) und -1.08
// (z 0.12); quer dazu ist sie eben, sonst entsteht eine Gelaendekante.
{ x: -25.0, z: -12.0, y: -2.75, zone: 'zufahrt' },
{ x: -25.0, z: -7.2, y: -2.08, zone: 'zufahrt' },
{ x: -25.0, z: 0.1, y: -1.08, zone: 'zufahrt' },
{ x: -25.0, z: 6.0, y: -0.28, zone: 'zufahrt' },
{ x: -22.4, z: -7.2, y: -2.08, zone: 'zufahrt' },
{ x: -22.4, z: 6.0, y: -0.28, zone: 'zufahrt' },
{ x: -20.0, z: -12.5, y: -1.75, zone: 'zollet' },
{ x: -8.0, z: -12.5, y: -1.70, zone: 'zollet' },
{ x: 2.0, z: -11.5, y: -1.65, zone: 'zollet' },
// Das Nachbargrundstueck im Sueden liegt hoeher als der Garten - genau
// deshalb stehen dort Winkelelemente und die bestehende Betonmauer. Die
// Werte setzen den Trend der Grenzkoten (-0.04 / 0.26 / 0.63) fort.
{ x: -18.0, z: 5.6, y: 0.10, zone: 'sued' },
{ x: -6.0, z: 5.6, y: 0.45, zone: 'sued' },
{ x: 4.0, z: 5.6, y: 0.85, zone: 'sued' },
{ x: -18.0, z: 9.0, y: 0.25, zone: 'sued' },
{ x: -6.0, z: 9.0, y: 0.60, zone: 'sued' },
{ x: 4.0, z: 9.0, y: 1.00, zone: 'sued' },
// Oestlich der Grenze faellt das Gelaende nach Norden zum Stellplatz des
// Nachbarn ab - die Plankoten dort lauten -0.72 und -1.57. Ohne diese
// Werte legt sich ein Huegel neben den Weg und deckt ihn zu.
{ x: 7.5, z: -6.4, y: -1.25, zone: 'ost' },
{ x: 7.5, z: -3.0, y: -0.35, zone: 'ost' },
{ x: 7.5, z: 0.0, y: 0.20, zone: 'ost' },
{ x: 7.5, z: 5.0, y: 0.75, zone: 'ost' },
{ x: 5.0, z: -6.4, y: -1.35, zone: 'ost' },
// Fuss der Osttreppe: hier liegt das Gelaende auf Hoehe des Podests, sonst
// steht neben dem Treppenfuss ein Grashuegel.
{ x: 4.70, z: -6.55, y: -1.52, zone: 'ost' },
{ x: 4.70, z: -5.40, y: -0.95, zone: 'ost' },
{ x: 3.0, z: -8.5, y: -1.55, zone: 'zollet' },
];
/** Startposition und Blickrichtung beim Betreten der Szene. yaw = Grad ab Nord. */
export const START_VIEWS = [
{ id: 'sitzplatz', label: 'Hauptsitzplatz', x: -18.6, z: -2.6, yaw: 135, note: 'Travertinplatten 80x80x3 cm, Blick über den Sitzplatz gegen den Rasen' },
{ id: 'gedeckt', label: 'Gedeckter Sitzplatz', x: -11.0, z: -1.2, yaw: 215, note: 'Keramikplatten unter dem Obergeschoss, hinter der Lamellenwand' },
{ id: 'rasen', label: 'Rasen Süd', x: -13.0, z: 2.8, yaw: 75, note: 'Blick der Südfassade entlang zum Spielbereich' },
{ id: 'grill', label: 'Flammengrill', x: -7.8, z: 2.6, yaw: 110, note: 'Dekorkiesfeld mit Flammengrill und Holzscheiterwand' },
{ id: 'spielplatz', label: 'Spielbereich', x: -3.4, z: 1.4, yaw: 150, note: 'Spielsand, Spielhaus und Apfelbaum' },
{ id: 'eingang', label: 'Hauseingang', x: 1.3, z: -1.8, yaw: 250, note: 'Keramikplatten beim Fixpunkt 0.00' },
];
/** Standort fuer den Sonnenstand: Abtwil SG. */
export const SITE_LOCATION = {
name: 'Egglihaldenstrasse 9a, 9030 Abtwil SG',
lat: 47.4206,
lon: 9.2903,
/** Peilung der Site-X-Achse gegenueber Nord, in Grad. */
northBearingOfSiteX: 61.1615,
groundMasl: 651.17,
};