Hoppa till innehållet

Användardiskussion:Mike/Arkiv2

Sidans innehåll stöds inte på andra språk.
Från Wikipedia

Juliahjälp?

[redigera wikitext]

Hej /Mike! Jag håller på att försöka sakapa den reverserade Juliamängrden i 3D men har en del strul med matten. Jag får det att funka, verkar det, i basic men kan inte få nått vettigt 3D perspektiv där, (minnet är allt för begränsat för att skapa en Z-tabell så jag använder skärmens 16 färger som en 4-bit tabell men det ser inte så bra ut) Därför har jag försökt i C men det krachar bara för mig hela tiden. Antagligen division med noll men jag kan inte se felet i koden, (jag använder samma kod som i Basic och där får jag ingen error och där får jag konvergenser i 3D så jag är på G om man säger). Efter typ 40 omstarter av datorn gav jag upp försöket i C och tänkte att jag nog behöver lite hjälp. Har du lust att titta på min matte om jag förklarar vad jag försöker göra. Det handlar om 3D rot ur tre koordinater - använd quads säger dom men jag VET att det går =), jag ger dig en ordentlig förklaring hur sen om du vill hjälpa mig? // Solkoll 20 februari 2005 kl.19.32 (CET)

Visst, jag ska försöka hjälpa dig att reda ut lite matte - är bara skoj om jag kan vara till hjälp. \Mike 21 februari 2005 kl.08.09 (CET)
Tror jag löste det, råkade dividera samma variabel två ggr med samma konstant. Meningen var att det skulle bilda ett tal mellan 0 - 1 men fick inversen av det 1 - oändlig. Detta belopp drar jag sedan från ett och sedan roten ur det. Felet gorde att subtaktionen alltid skapade minustal och min FPU hade ingen lust att dra roten ur det så allting bara dog då =P Men jag vill nog att du kollar lite på det ändå. Efter jag löste buggen så får jag 3D fraktaler och tar man och skivar ut det plan där z = 0 så ser det ut som dom vanliga juliamängderna. Det jag får är alltså 3D kroppar men om det är 3D Julia eller en modifierad 3D julia det är tusan inte lätt att veta =) När man gör den reverserade Julian så väljer man slumpvis mellan dom två rötterna x, y, z, eller -x, -y, -z och gör jag så så är det ganska tunna prylar jag får, typ böjda linjer. Men om man "fuskar" lite och väljer alla tre tecken helt slumpvis och inte alla samtidigt så blir det fylligare saker, i det närmaste en mycket bucklig sfär. Jag skall ladda upp ett par bilder till Commons när jag fixat ett snyggt sätt att färglägga "sakerna". Då skall jag även visa dig matten, jag är inte säker på att det verkligen är en 3D rot jag får eller något som bara fungerar på ett liknande sätt. Du kanske kan reda ut det. // Solkoll 21 februari 2005 kl.10.41 (CET)
Jag väntar med spänning på att få se dem :) \Mike 21 februari 2005 kl.12.39 (CET)

Fixade ett par "preview" bilder, (kommer att ladda upp nya versioner av dessa senare så bli inte förvånad om dom ändras).

Två rötter
Samma fast alla tre tecken slumpvis

Det tar en faslig tid att rendera bilderna så att alla detaljer fylls i så det kan ta en da ellr två innan jag har fixat ett par som är snyggare än dessa, (bättre färger har jag redan men då var dom här redan fixade).

Kan förklara lite hur jag gort: En 2D rot med absolutbeloppet 1,0 ligger alltid någonstans på enhetscirkeln. Skillnaden mot det tidigare värdet är att roten får halva vinkeln. Om tar en 3D koordinat (abs = 1,0 även där) så kan man se det som att även den ligger på en cirkel men i ett annat plan, ett plan som har x-axeln gemensam med det normala 3D rummet men y och z-axlarna är roterade till en viss grad runt x-axeln. Tar man roten ur det så kommer absolutbeloppet fortfarande vara 1,0 (givetvis) och vinkeln kommer att vara halva i cirkeln i det roterade planet. Så borde det vara tänker jag i vilket fall =). Så vad jag gör är att först beräkna absolutbeloppet, spara det i en variabel och sen normaliserar jag min 3D koordinat, (delar alla tre komponenterna med asolutbeloppet) och får en punkt på cirkeln i det roterade planet. Nu gäller det bara att försöka nå halva vinkeln. Det gör jag genom att först normalisera även y/z paret och sedan dra roten ur det i 2D - sparar z. Sedan gör jag likadant med x/y. Nästa steg är att åter normalisera x/y/z så att absolutbeloppet blir 1,0. Drar jag sedan roten ur det första absolutbeloppet som jag sparade tidigare och multiplicerar x/y/z (1,0 och halva vinklar), med det så borde jag nått roten men det är där jag är osäker - fungerar det som det skall? Jag ger dig min algoritm sen när jag har nåra bättre bilder, det går först =) // Solkoll 21 februari 2005 kl.13.42 (CET)

Ok, när du drar roten ur y/z-paret, så drar du egentligen roten ur det komplexa talet y+iz, om jag förstår dig rätt?
Jo, jag behandlar paren som separata 2D komplexa tal. // S
Tja, av bildbevisen att döma så innebär denna algoritm att man kan skapa en fraktal. Om du däremot undrar om denna algoritm definierar en "rot" i ungefär samma betydelse som i planet, så är svaret tyvärr nej - helt enkelt därför (är jag 99,9% säker på) att det inte finns någon "rot"-funktion som i likhet med roten ur ett komplext tal avbildar ett komplext tal på ett (nytt) komplext tal. Detta, hävdar jag, beror på att om det funnes en rot"funktion" (den är egentligen aldrig en riktig funktion såvida man inte begränsar värdemängden...), så hade det också funnits en kvadratfunktion, det vill säga en funktion från R^3 till R^3 som uppfyller (x+y)^2=x^2+xy+yx+y^2. Men om denna kvadrat finns, så vi kan beräkna (x+y)^2, x^2 och y^2, så har vi också ett uttryck för produkter (xy). Men som William Rowan Hamilton så mödosamt kom på på 1800-talet finns inga sådana produkter i R^3.
Så hur jag än försöker så verkar jag inte kunna hitta något "naturligt" sätt att generalisera avbildningen z -> z²+c till tredimensionella rum - den avbildning du har känns ganska ad hoc på något vis - även om den naturligtvis definierar en fraktal, så finns troligen andra sätt att skapa generaliserade Juliamängder... Exemplevis specificerar du att en rotation ska ske runt just x- och z-axlarna - om du hade valt att rotera runt y-axeln också så hade det givit (troligen) en helt ny yta, och en sådan algoritm är inte "längre ifrån" att vara en "rot" än vad den nuvarande är. Hade du valt rotationer runt två axlar som inte är ortogonala, så ksulle det troligen ge ytterligare varianter. För att inte tala om att det, som du vet, i allmänhet kan ge olika resultat beroende på i vilken ordning man utför rotationer, så att i det här fallet (även om jag inte räknat på det) så hyser jag ganska starka misstankar om att rotationernas ordning skulle ge ganska stora effekter på slutresultatet. \Mike 21 februari 2005 kl.17.44 (CET)
PS. har du försökt titta på juliamängden i R^4? Där finns däremot en naturlig generalisering via kvaternionerna, där kvadreringen ju ges av (a,x,y,z) -> (a^2-x^2-y^2-z^2, 2ax, 2ay, 2az)
Den ytan blir ju dock lite svårare att åskådliggöra - den är 12-dimensionell... (c är en 4-dimensionell vektor, varje värde på c ger en 3-dimensionell yta i R^4...) \M
Jag förstår direkt problematiken, 3D rotaioner är ordningsberonde det vet jag. Jag kan testa med att kasta om axlarna men använda samma C i lite olika kombinationer så får jag se att du antgligen har rätt =) Anledningen till att jag valde denna kombination är att roten ur roten o.s.v (x upphöjt till 1 delat med oändligheten, eller x^0 om du vill om nu x är större än noll det vill säga) blir 1,0 Som jag definerat detta så går alla |3D koordinat| större än noll mot just x=1, y=0, z=0 om man itererar utan att ändra tecken på roten. Men ok, detta är inte Juliamängden men så länge jag använder x, y, 0 (z=noll) så ger funktionen helt vanliga reversedade julia så det är bra nära =) Men vad skall vi då kalla detta? för, som du säger: en 3D fraktal är det ju =)
Jo, jag känner till 4D julias, man brukar rendera dessa så kallade "Quaternions" (engelska) i ray-tracers Exempel Så det går att visa dessa, riktigt hur har jag inte satt mig in i, orkar inte lära mig matrisräkning, (ännu men det kommer nog). // Solkoll 21 februari 2005 kl.18.15 (CET)
Tja, det är väl standard att upptäckaren får namnge saker och ting, och är det ingen annan som beskrivit dem förut, så är det väl du som har första tjing :) \Mike 21 februari 2005 kl.18.38 (CET)
Jag får väl hitt på nått då. By the way, skulle man inte kunna använda quads och sätta den fjärde dimensionen till 0 i "Z" och "C"? Alltså bara använda sqrt ( x - a, y - b, z - c, 0 ) Fast det kanske inte går att få en rot ur det heller? Nåja jag renderar vidare ett tag. Kolla bilderna om en timme eller så, då skall det finnas nya där. Har en klar där jag använde C=[-1.8, 0.1, 0.01) typ du vet ungefär i spetsen på mandelbroten (fast här något utanför 2D planet). Där är juliamängden långsmal i x-led och därför lättare att rendera (mindre volym = färre pixlar) och dessa är väldigt 3D-"julia" om man slumpar alla tre koordinaters tecken separat. Härda ut en stund så får du se, skitsnygga om jag får säga så =) // Solkoll 21 februari 2005 kl.21.34 (CET)
hmm, nå, jag får fundera vidare på det hela, men imorgon. Du får härda ut tills dess :) \Mike 21 februari 2005 kl.22.00 (CET)
Och än mer "hmmm"! Tja, jag ska inte uttala mig om matte innan jag räknat på det hela :/ Operationen du gör med vinklarna är nämligen kommutativ (ursäkta) - det spelar ingen roll i vilken ordning du roterar. Detta beror på att det enbart är en punkt som roteras runt de här två axlarna - egentligen (vilket märks om man roterar något "större" som en vektor) så roteras objektet runt sin egen axel på olika sätt beroende på vilken ordning man roterar den runt axlarna i koordinatsystemet. Men hur roterar man en punkt runt sig själv?
(Hade skrivit en ~sida om 4d-juilan, men kom för en gångs skull på att jag gjort ett fel innan jag tryckte på spara :/ Ska titta igenom igen vad jag gjort...) \Mike 23 februari 2005 kl.17.42 (CET)
Efter att pedian la ner i förrgår så fick jag aldrig iväg nån bild :-/ Sen satt jag uppe hela natten och testade varianter och fixade ett litet fel jag hade innan, Så nu har jag två bra varianter =) Sen, igår sov jag hela dan och idag vare RL-sysslor, men nu är jag igång igen. Här en bild: (bilden flyttad nedan "set a 8x") Jag fixar ett par snippets på min C-kod och wikimailar dom till dig så ser du hur jag gort om det är ok? Annars får jag försöka beskriva funktionen i "math" här =). // Solkoll 23 februari 2005 kl.19.29 (CET)

Oj, jo de ser snygga ut :) Jag antar att den i mitten motsvarar c=0? (Det ska gå att maila mig, ja. Jag hoppas bara jag tar mig igenom c-koden ;) \M

Det grejar du nog, det är inte många rader, nåra if-satser för att filtrera risken för division med noll, resten är matte. Här en bild till: (bilden flyttad nedan "set a 2x") Som synes är det vanliga julia i mittenraden ( C = [ x, y, z=0 ] ) och dom andra är inte mycket annorlunda tycker jag =) Därför bestämde jag mig för att kalla det för "Revererad juliamängd i 3D variation" tills jag kommer på nått bättre. Nåja jag har en variant på detta också där funktionen är lite annorluna, simplare faktiskt. Så det blir två bilder till. (när jag renderat dom =) // Solkoll 23 februari 2005 kl.20.46 (CET)

(Ovan en liten editrubrik så det inte blir så mycket i redigeringsfönstret, det börjar bli långt det här =)

Set b 8x

Glömde frågan förra gången, jo mitten C = 0. När jag skrev om mina nollfilter förra gången så kollade jag på min kod igen, mest för att klippa ut en snutt att maila, så kom jag på att jag gort ett fel där. Det kan inte bli vanliga juliamängder med min funktion fast jag hade en "if ( z != 0 )" som skippade hela y/z delen om z var noll. Borde insett det tidigare då sqrt ( Z = [0, -b, 0] ) blir Z = [0, 0, ±c]. Den nedre halvan kommer alltid att vrida sig mot z-axeln. Så den förra bilden är lite fel. Dom i mitten liknar mer dom andra när jag fixade felet. I övrigt gorde det ingen skillnad. Nåja, det är fortfarade en variant av den reverserade julian =). Du får koden strax, nu är den nog felfri (hoppas jag). // S

Så, nu har jag en bild en bild av varje: (flyttade bilderna ovan. Även: ny version av den som var "felfiltrerad")

Set a 8x
Set b 2x
Set a 2x
Set b 8x

Dom med 8x (tre tecken ) är helt klart roligast, kolla hålen med fraktalformer i "b 8x", fixar en närbild av det senare =) // Solkoll 24 februari 2005 kl.01.20 (CET)

P.s. Det var nåra utkommenterade slaskrader "// cos = x/len" som jag glömde ta bort i koden jag mailade, men du hajjade nog det. Fick du det föresten? D.s.

Underligt, det har inte kommit fram... (hoppas bara det inte beror på nåt spam-filter - jag brukar använda ett antal sådana - så de är allihopa avstängda nu) \Mike 24 februari 2005 kl.14.15 (CET)
Oj, det var knasigt? Jag får väl försöka ta det här i stället då =) Jag har totalt fyra metoder numera som alla ger lite olika resultat och därmed olika fraktal-set, om någon av metoderna verkligen ger halva vinkeln är däremot frågan?

Set a:

  • beräkna ll = |[ x y z ]|
  • beräkna l = |[ y z ]| normalisera paret: y/l = cos z/l = sin
  • sedan roten ur det, här min c kod för detta:
 // Detta för att "minnas" tecknet på z
 t = 1.0f;
 if ( z < 0.0f )
   t = -t;

 // kopiera y (som innehåller cos för vinkeln och det är det vi vill åt =)
 cosy = y;

 // Sen den nya vinkeln
 y = sqrtl ( ( 1.0f + cosy ) / 2.0f );
 z = t * sqrtl ( ( 1.0f - cosy ) / 2.0f );
  • Efter det återställer jag längden på paret: y*l z*l
  • Nästa steg är att göra samma sak med [ x y ] paret, notera att jag använder det nya y från förra rotationen, gör jag inte det så blir det annorlunda, undrar vilket som är bäst?
  • efter rotationenrna så beräknas |[ x y z ]| = l och sedan x/l y/l z/l för att vektorn skall få längden 1,0
  • avsluta med ll = sqrt ( ll ) : x*ll y*ll z*ll för att ge vektorn längden roten ur den ursprungliga längden.

Set b använder samma metod men där normaliserar och återställer jag inte längden på dom separata 2D paren innan rotationerna. Sen kom jag på fler sätt:

Set c Gör två kopior av [ y z ] konjugera den en av dessa och multiplicera [ y z ] med det vilket medför att z komponenten alltid är noll efter operatioen. Talet [ x y z ] är nu lika med [ x y ] och kan behandlas som ett 2D-tal i en vanlig 2D rotutdragning. Efter det så normaliseras den andra kopian av [ y z ] vi gorde tidigare för att få cos och sin för vinkeln, dra roten ur det (halva vinkeln). Avsluta med att multiplicera det nya [ y z ] med det för att rotera tillbaka till halva den ursprungliga vinkeln. Fast i går kom jag på att det finns ett ännu enklare sätt:

Set d:

  • l = |[ x y z ]|
  • x/l y/l z/l
  • x = ( ( x - l ) / 2 ) + l
  • y = y / 2
  • z = z / 2
  • ll = sqrt ( x*x + y*y + z*z )
  • l = sqrt ( l )
  • (x/ll)*l (y/ll)*l (z/ll)*l

Med reservartion för typfel och liknande elände.

Har det senaste dygnet hackat en del på min renderare och även kommit på hur man kan mappa en färgpalett över sfären i "Set a C = 0", (dom andra också för den delen =). Blir skitsnyggt, (lite hippievarning kanske), skall ladda upp en bild av det när jag är nöjd med en =) // Solkoll 25 februari 2005 kl.22.19 (CET)

Kom på ytterligare en variant nyss, 6x! Man gör något som är 3D varianten av Z*i i stället för att slumpa tecken. Alltså x = -y, y = z, z = x Sedan väljer man att utföra det 0-5 gånger med ett slumptal vilket medför att en axel kan komma att peka i någon av de sex möjliga 90 gradersriktningarna. Här en bild på en "set d 6x": Fil:RJV set d 6x.jpg
Liknar Juliamängden en del eller? kolla skuggan =) Tar "bollen" sen. Har dragigt mig lite för att ladda upp en massa bilder, jag kommer på bättre och bättre sätt att rendera dom på hela tiden, men kom på att det faktiskt går att radera dom sen så jag kan ladda på för fullt =) // Solkoll 26 februari 2005 kl.01.35 (CET)

Set a 8x C = 0

Det är "Set d 2x" som gäller om man skall göra juliamängder, tror tammetusan att det är väldigt rätt den här gången. Postade gubbarna på sci.fractals så får vi se vad dom säger. Dom brukar vara intresserade när jag kommer med nått nytt.

http://members.chello.se/solgrop/3D%20Julia%20set.jpg
En "Quartenion" fast ändå inte, bara tre den här gången,(bilden från min site)

Ok, solkollarn, jag kollar... (nu har majlet dessutom kommit fram :/ ) \Mike 1 mars 2005 kl.05.01 (CET)

Du behöver inte jobba på det om du inte har lust, jag har ju uppenbarligen skapat något som mekaniskt fungerar på samma sätt som Juliamängdens formel, (dra ifrån C, rotera till halva vinkeln å skala till roten ur), vilket är kravet för att en fraktal skall skapas, sen om det verkligen rör sig om en rotutdragning är en helt annan sak =). Den sista metoden funkar för övrig i ett obegränsat antal dimensioner, bara att dela alla utom x med två. Skumt att det tog sån tid, kan iofs bero på att servern var skrivskyddad när jag skickade det. // Solkoll 1 mars 2005 kl.14.51 (CET)