Tree Gen 1.34.0: Ziel-Cardzahl statt Dichte-Konstanten + Ursprung aus dem Stamm

Zwei Befunde von der Spielseite.

1) Dichte-Kompensation ueberschoss preset-abhaengig
   Die Eichung am Standardbaum (11 Cards / 486 Tris) kam auf der Eiche als
   1008 Tris an. Ursache ist strukturell: "Dichte" ist Punkte pro m2
   Zweigflaeche, und die verteilt sich je Preset voellig anders. Jeder
   Konstanten-Satz haette fuer den naechsten Baum neu geeicht werden muessen.

   Strukturwechsel wie vorgeschlagen: in LEAF_STUFEN steht jetzt die
   ZIEL-STUECKZAHL (S1 10, S2 40, S3 120, S4 = volle Dichte), und der Generator
   regelt die Dichte per Bisektion dagegen ein. Der Seed wird dabei nicht
   angefasst - gleicher Baum und Seed ergeben dieselbe Verteilung.

   Gemessen ueber vier Presets (Ziel 10 / 40 / 120):
     baum    9   41  104     eiche  10   43  138
     birke   9   36  136     tanne   9   38  125
   Die Eiche liegt bei S1 jetzt bei 576 Tris statt 1008.

   Der Test prueft die Anzahl DIREKT, statt ueber Dichte x Anteil x Flaeche zu
   rechnen - genau der Punkt des Vorschlags.

2) Baum stand "etwas in der Luft"
   Der Export-Ursprung kam aus der Gesamt-Bbox inklusive Blatt-Cards. Eine
   einzige tief haengende Card hebt damit den ganzen Baum an. Jetzt kommt er aus
   der STAMM-Geometrie (Slot 0). Gemessen an der Eiche: Stamm-min.Z 0.000 auf
   allen vier Stufen, waehrend die Gesamtbox bei S1 auf -0.106 liegt - das waren
   die 10 cm, um die er zu hoch stand.

Beim Einbauen selbst verursacht und behoben: eine abgebrochene Befehlskette
liess die Operator-Verdrahtung aus, wodurch die Dichte mit der ZIEL-ANZAHL
multipliziert wurde (170 x 40) - 732 Cards statt 40. Faellt sofort auf, wenn man
die Zahlen anschaut, statt den Durchlauf fuer erfolgreich zu halten.

23 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-06 10:32:15 +02:00
co-authored by Claude Opus 4.8
parent d02562fb53
commit 1b833bf44a
8 changed files with 197 additions and 28 deletions
+30 -2
View File
@@ -52,8 +52,8 @@ if not (130.0 <= s.leaf_density <= 200.0):
% s.leaf_density)
# Die Deckung steht als Tabelle pro Stufe, nicht als Formel. Card-ANZAHL muss
# ueber die Stufen steigen, Card-Groesse auch.
_d0, _g0, _h0 = tg._stufen_anteile(0.0)
_d1, _g1, _h1 = tg._stufen_anteile(1.0)
_z0, _g0, _h0 = tg._stufen_anteile(0.0)
_z1, _g1, _h1 = tg._stufen_anteile(1.0)
if _g0 >= _g1:
fails.append("Groessen-Anteil steigt nicht ueber die Stufen (%.2f -> %.2f)"
% (_g0, _g1))
@@ -275,6 +275,34 @@ if abs(kante_ohne - kanten[-1]) > 0.02:
fails.append("Ein Baum ohne Wachstums-Stufen (%.2f) sieht anders aus als "
"die letzte Stufe (%.2f)" % (kante_ohne, kanten[-1]))
# --- 3c) Ziel-Cardzahl wird preset-UNABHAENGIG eingeregelt ---------------
# Frueher standen hier Dichte-Faktoren. Die mussten je Preset neu geeicht
# werden: "Dichte" ist Punkte pro m2 Zweigflaeche, und die verteilt sich je
# Baum voellig anders - ein Faktor, der am Standardbaum 11 Cards ergab,
# ueberschoss auf der Eiche um mehr als das Doppelte. Jetzt steht die
# Stueckzahl da und wird eingeregelt; der Test prueft sie DIREKT.
print("")
print("%-10s %8s %8s %8s %8s" % ("Preset", "S1", "S2", "S3", "S4"))
for pname in ("baum", "eiche", "birke"):
reihe = bauen(pname, wachstum=True, stufen=4)
pro = tg._cards_pro_stueck(card, None)
dg = bpy.context.evaluated_depsgraph_get()
zellen = []
for st in reihe:
bl = bpy.data.objects.get(st.name + "_Leaf")
n = tg._card_zahl(bl, pro, dg) if bl else 0
gt = float(st.get("growth_t", 1.0))
ziel, _, _ = tg._stufen_anteile(gt)
zellen.append((n, ziel))
if ziel:
# 25 % Toleranz: die Bisektion arbeitet auf einer diskreten
# Punktverteilung, exakt treffen kann sie nicht.
if abs(n - ziel) > max(2, ziel * 0.25):
fails.append("%s/%s: %d Cards, Ziel %d - die Regelung trifft "
"nicht" % (pname, st.name, n, ziel))
print("%-10s %8s %8s %8s %8s"
% (pname, *["%d/%s" % (n, z if z else "voll") for n, z in zellen]))
print("")
if fails:
print("ERGEBNIS: %d FEHLER" % len(fails))