Rueckmeldung Punkt fuer Punkt: Weg rund ums Haus - Der Ostweg ist jetzt durchgehend gepflastert von der Verbundstein- Anpassung (x 2.86) bis zur Grenze (x 4.45) - vorher 0.83 m breit mit Rasenstreifen daneben. Der Weg an der Suedgrenze reicht von der Grenze bis an die Nachbarmauer (z 4.49 bis 5.97). - Winkelelemente Ost auf die Grenzlinie x 4.45; die Linie bei z 4.96 im Sueden war keine eigene Stuetzwand, das ist die Nachbarmauer selbst. Hoehen und Gefaelle - LEVELS koennen jetzt auch eine geneigte Ebene vorgeben. Die Wege sind Rampen: Ostweg rund 12%, Suedweg rund 3%, Feuerwehrzufahrt 13.6% aus den Plankoten -2.08 und -1.08. Der Architekturplan nennt an denselben Stellen "Steigung 9.9%" und "Steigung 13.0%". - Ausserhalb der Zonen wird die Interpolation der naechsten Zone fortgesetzt statt ihres konstanten Ersatzwerts - die Feuerwehrzufahrt stand vorher als schwebende Platte ueber einer Gelaendekante. - Gelaende oestlich der Grenze korrigiert: dort lag ein Huegel ueber dem Weg, obwohl der Plan -0.72 und -1.57 angibt. Obere Ebene - Der Rasen ist eben auf -0.02. Die Koten 0.09 bis 0.26 liegen schon im angehobenen Kiesbett des Sichtschutzes, nicht mehr im Rasen; ohne feste Vorgabe zog die Interpolation den Rasen huegelig hoch. Stufen - Beim gedeckten Sitzplatz stimmen jetzt beide schwebenden Platten: der Plan zeichnet zwei versetzte Rechtecke mit den Koten -0.02 und -0.17, bisher lagen sie auf -0.17 und -0.31 - die untere verschwand im Belag. - Das Gartentor steht auf dem oberen Niveau (-0.13), von dort zwei Stufen hinunter auf den Hauptsitzplatz. - Westtreppe ueber den ganzen Treppenblock (5 Stufen statt 4), die Gelaenderpfosten reichen bis ins Gelaende statt in der Luft zu enden. Rundgang - Treppen und schwebende Stufen sind begehbar: ihre Trittflaechen gehen in die Hoehenabfrage ein, die Stufen sind kein Hindernis mehr. - Springen mit der Leertaste, rund 55 cm. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+19
-6
@@ -293,8 +293,12 @@ for (const s of surfaces) {
|
||||
let plane, ys;
|
||||
|
||||
if (fixed) {
|
||||
plane = { a: 0, b: 0, c: fixed.level };
|
||||
ys = [fixed.level];
|
||||
// Eine Ebene darf auch geneigt vorgegeben sein - Wege sind Rampen.
|
||||
plane = fixed.plane
|
||||
? { a: fixed.plane[0], b: fixed.plane[1], c: fixed.plane[2] }
|
||||
: { a: 0, b: 0, c: fixed.level };
|
||||
const corners = s.polygon.map(([x, z]) => plane.a * x + plane.b * z + plane.c);
|
||||
ys = [Math.min(...corners), Math.max(...corners)];
|
||||
s.level = fixed.id;
|
||||
} else {
|
||||
const inside = terrainSpots.filter((sp) => owner.get(sp) === s);
|
||||
@@ -363,16 +367,25 @@ for (let j = 0; j < nz; j++) {
|
||||
const zone = zoneOf(x, z);
|
||||
let y;
|
||||
if (!zone) {
|
||||
// Ausserhalb aller Zonen: naechstgelegene Zone weiterziehen
|
||||
// Ausserhalb aller Zonen: naechstgelegene Zone weiterziehen. Dabei wird
|
||||
// deren Interpolation fortgesetzt, nicht ihr konstanter Ersatzwert -
|
||||
// sonst entsteht am Zonenrand eine Gelaendekante.
|
||||
let best = null, bd = Infinity;
|
||||
for (const t of TERRAIN_ZONES) {
|
||||
const [cx, cz] = centroid(t.polygon);
|
||||
const d = Math.hypot(cx - x, cz - z);
|
||||
const d = distToPolygon(x, z, t.polygon);
|
||||
if (d < bd) { bd = d; best = t; }
|
||||
}
|
||||
y = best.fallback;
|
||||
y = interpolate(x, z, best.id);
|
||||
} else {
|
||||
y = interpolate(x, z, zone);
|
||||
// Ausdruecklich flach vorgegebene Ebenen: der Rasen der oberen Ebene
|
||||
// ist eben, ohne Vorgabe zieht ihn die Interpolation huegelig hoch.
|
||||
for (const lv of LEVELS) {
|
||||
if (!lv.flatten || !pointInPolygon(x, z, lv.polygon)) continue;
|
||||
y = lv.level;
|
||||
locked[j * nx + i] = 1;
|
||||
break;
|
||||
}
|
||||
for (const f of flatSurfaces) {
|
||||
if (!pointInPolygon(x, z, f.polygon)) continue;
|
||||
y = Math.max(f.min, Math.min(f.max, f.plane.a * x + f.plane.b * z + f.plane.c));
|
||||
|
||||
Reference in New Issue
Block a user