» »

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
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.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Problem stikanja površin/ teles

Oddelek: Programiranje
71120 (956) BlueRunner
»

Freehand v krivuljo - C# ali VB

Oddelek: Programiranje
101778 (1649) PaX_MaN
»

[matematika] odvodi

Oddelek: Šola
63545 (3545) tx-z
»

"Točkovni" vrtinec

Oddelek: Znanost in tehnologija
403347 (2633) Thomas
»

Virus uploadan

Oddelek: Znanost in tehnologija
363061 (2394) zee

Več podobnih tem