Forum » Programiranje » 2D differential growth
2D differential growth

BRBR ::
Če se je kdo s tem ukvarjal ..... če imamo na zaćetku v ravni liniji točke med katere vrivamo nove točke, ki so spet na tej isti ravni liniji,
dokler pač space med to novo in dvema sosednjima ni premajhen, kako vemo kam to novo izrine, gor ali dol ?
Stare točke se ne premikajo nikamor, ali pač ? Naj se ne bi, po logiki , če damo kulturo v petrijevko, stare kolonije ne gredo nikamor, nove jih obraščajo ?
animacija
src
dokler pač space med to novo in dvema sosednjima ni premajhen, kako vemo kam to novo izrine, gor ali dol ?
Stare točke se ne premikajo nikamor, ali pač ? Naj se ne bi, po logiki , če damo kulturo v petrijevko, stare kolonije ne gredo nikamor, nove jih obraščajo ?
animacija
src
Never underestimate the power of idiots in large groups.
- spremenil: BRBR ()
hidetr ::
Opus 4.6:
Bistvo differential growth simulacije je, da se vse točke premikajo -- ne samo nove. Ravno to premikanje ustvari tiste organske oblike. Tukaj je osnoven algoritem:
1. Vrivanje novih točk
Ko je razdalja med dvema sosednjima točkama prevelika, vstaviš novo točko na sredino. Ta nova točka je na začetku res na isti liniji.
2. Sile, ki premikajo točke
Vsaka točka na krivulji čuti dve sili:
Privlačnost/odbojnost sosedov -- točke na krivulji hočejo biti na optimalni razdalji od svojih neposrednih sosedov (spring force / edge force). Če so preblizu, se odbijejo, če predaleč, se privlačijo.
Odbojnost vseh bližnjih točk -- če se del krivulje približa drugemu delu krivulje, se med njimi pojavi odbojna sila (repulsion), da se ne prekrivajo. To je tisto, kar preprečuje samopresečišča.
3. Kam se izrine?
Nova točka se ne izrine "gor ali dol" po nekem pravilu -- namesto tega naravno zdrsi iz linije, ker:
Ko jo vstaviš, je sistem lokalno prenatrpan
Odbojne sile med bližnjimi točkami jo potisnejo stran
Smer je pravokotna na lokalno tangento krivulje (normala)
Drobne numerične razlike (floating point) ali nameren majhen random offset na normalo razbijejo simetrijo, in krivulja se začne gubati
4. Analogija s Petrijevko
Analogija s kolonijami ni čisto točna. Pri differential growth se vse točke premikajo v vsakem koraku simulacije -- ker če bi stare točke fiksiral, ne bi nikoli dobil gubanja. Pomisli bolj kot na rastočo žico v omejenem prostoru -- raste, se daljša, in ker nima kam, se začne gubati.
Minimalen pseudokod:
za vsak korak:
za vsak par sosednjih točk:
če razdalja > prag: vmetni novo točko na sredini
za vsako točko:
sila = vec2(0,0)
# spring sile od sosedov na krivulji
sila += spring_force(levi_sosed, desni_sosed)
# odbojna sila od VSEH bližnjih točk
za vsako bližnjo točko (spatial hash/quadtree):
sila += repulsion_force(bližnja_točka)
premakni točko za sila * dt
Če hočeš asimetrično rast (samo v eno smer), lahko dodaš bias na normalo, ampak klasičen differential growth pusti, da se sistem sam organizira.
Ključen insight je torej: ne gre za to, kam "vržeš" novo točko -- gre za to, da fizikalna simulacija sama potisne krivuljo v organske oblike. Brez premikanja vseh točk ostaneš na ravni liniji za vedno.
Bistvo differential growth simulacije je, da se vse točke premikajo -- ne samo nove. Ravno to premikanje ustvari tiste organske oblike. Tukaj je osnoven algoritem:
1. Vrivanje novih točk
Ko je razdalja med dvema sosednjima točkama prevelika, vstaviš novo točko na sredino. Ta nova točka je na začetku res na isti liniji.
2. Sile, ki premikajo točke
Vsaka točka na krivulji čuti dve sili:
Privlačnost/odbojnost sosedov -- točke na krivulji hočejo biti na optimalni razdalji od svojih neposrednih sosedov (spring force / edge force). Če so preblizu, se odbijejo, če predaleč, se privlačijo.
Odbojnost vseh bližnjih točk -- če se del krivulje približa drugemu delu krivulje, se med njimi pojavi odbojna sila (repulsion), da se ne prekrivajo. To je tisto, kar preprečuje samopresečišča.
3. Kam se izrine?
Nova točka se ne izrine "gor ali dol" po nekem pravilu -- namesto tega naravno zdrsi iz linije, ker:
Ko jo vstaviš, je sistem lokalno prenatrpan
Odbojne sile med bližnjimi točkami jo potisnejo stran
Smer je pravokotna na lokalno tangento krivulje (normala)
Drobne numerične razlike (floating point) ali nameren majhen random offset na normalo razbijejo simetrijo, in krivulja se začne gubati
4. Analogija s Petrijevko
Analogija s kolonijami ni čisto točna. Pri differential growth se vse točke premikajo v vsakem koraku simulacije -- ker če bi stare točke fiksiral, ne bi nikoli dobil gubanja. Pomisli bolj kot na rastočo žico v omejenem prostoru -- raste, se daljša, in ker nima kam, se začne gubati.
Minimalen pseudokod:
za vsak korak:
za vsak par sosednjih točk:
če razdalja > prag: vmetni novo točko na sredini
za vsako točko:
sila = vec2(0,0)
# spring sile od sosedov na krivulji
sila += spring_force(levi_sosed, desni_sosed)
# odbojna sila od VSEH bližnjih točk
za vsako bližnjo točko (spatial hash/quadtree):
sila += repulsion_force(bližnja_točka)
premakni točko za sila * dt
Če hočeš asimetrično rast (samo v eno smer), lahko dodaš bias na normalo, ampak klasičen differential growth pusti, da se sistem sam organizira.
Ključen insight je torej: ne gre za to, kam "vržeš" novo točko -- gre za to, da fizikalna simulacija sama potisne krivuljo v organske oblike. Brez premikanja vseh točk ostaneš na ravni liniji za vedno.
Vredno ogleda ...
| Tema | Ogledi | Zadnje sporočilo | |
|---|---|---|---|
| Tema | Ogledi | Zadnje sporočilo | |
| » | Problem stikanja površin/ telesOddelek: Programiranje | 1120 (956) | BlueRunner |
| » | Freehand v krivuljo - C# ali VBOddelek: Programiranje | 1778 (1649) | PaX_MaN |
| » | [matematika] odvodiOddelek: Šola | 3545 (3545) | tx-z |
| » | "Točkovni" vrtinecOddelek: Znanost in tehnologija | 3347 (2633) | Thomas |
| » | Virus uploadanOddelek: Znanost in tehnologija | 3061 (2394) | zee |