Introductie:
Ik liep een paar maanden geleden rond met het idee om caustics (is geen Nederlands woord voor) te gaan simuleren, zoals hier, dit naar aanleiding van een wiskunde leraar die ik had die ook gefascineerd was door de 'dubbele curve in zijn koffie beker', mijn passie voor 3D en aanverwante render programma's (zoals Brazil en FR) die ook caustics kunnen produceren, en mijn voorkeur voor PHP als beste programmeertaal ever (just kidding, ik ben alleen een fan en te onwetend wat C betreft).
Na een aantal keren wat schetsjes te hebben gemaakt en wat algemene aanpak ideeen op papier te hebben gemaakt, vond ik het twee weken geleden wel eens tijd om het ook in de praktijk te brengen.
Na veel typen, zweten, nadenken en zwoegen is er uiteindelijk een redelijk resultaat uitgekomen, maar hij is zeker nog steeds niet af en moet nog geoptimaliseerd worden.
Plaatje:

CL, OL en PL zijn niet echt interessant, het is een oud schetsje, maar zo krijg je een idee van hoe ik het heb willen aanpakken. Beta boeide uiteindelijk ook niet echt, want ik was overgestapt over vector berekeningen.
A.d.h.v OP en PL wordt dus de reflectierichting uitgerekend.
Als er belangstelling voor is kan ik wel een uitgebreide beschrijving geven van hoe ik het heb gedaan.
Plan'o'work:
In short:
- Neem Positie van lamp (puntbron) + Positie op 'ring'
- Bereken Reflectie richting vanaf ring adhv Pring
- Bereken aan de hand van hoogteverschil tussen Plamp en Pring het aantal nog af te leggen units in de reflectierichting
- Met pythagoras is dan de positie te bepalen waar de 'ray' de grond gekruist wordt.
- Het uiteindelijke showen gebeurt op een hardcore methode: een tabel met 250x5000 td's waarvan de achtergrond grijswaarde de (genormaliseerde) intensiteit weergeeft. Lelijk? Dom? Uberkill? Tsja, maybe, maar het werkt wel, en who cares about 20Mb HTML files?
Ik weet het, het is lomp, maar ik heb nog geen andere oplossing gevonden (GD zuigt!).
Dit alles heb ik zo veel mogelijk met 'vectoren' (arrays) uitgerekend. Vooral de reflectierichting berekening was even nadenken, maar uiteindelijk na heel wat denkwerk had ik toch een algoritme / methode verzonnen die het naar behoren uitvoerde. Voor de wiskundigen onder ons: het is een soort Gram-Schmidt methode (bepaling loodrechte vector), gepruts met inproducten dus.
Resultaat:
Anyways:
Resultaten willen jullie natuurlijk zien...
Hier een (dit resultaat is niet helemaal correct dus), ik was al redelijk tevreden dat ik dit eruit heb gekregen omdat het sterk overeenkomt met de werkelijkheid en resultaten van anderen. Hier stond de puntbron op een x-positie van 0:

En hier het resultaat met de puntbron niet in een 0 positie, het resultaat is deels veel beter, maar zoals je ziet lijkt het alsof maar een deel van de cirkel reflecteert. Ik weet waar dit aan ligt, ik moet het alleen nog oplossen!

En een composit van twee verschillende oplossingen die ik geprogrammeerd dus nog niet helemaal voor elkaar heb:

Nog te doen:
- Het belangrijkste probleem wat ik nog heb is dat het berekenen van het crosspoint met de grond nog niet helemaal naar behoren verloopt, aangezien de berekende richting twee betekenissen heeft (de richting is een vector en dan met de positie vector van het reflectie punt heb je een lijn, alleen deze kan je dus op twee manieren aflopen...). Als ik deze te pakken krijg is hij eigenlijk af en heb ik mijn doel bereikt, alleen dat vereist nog even wat denkwerk.
- Optimaliseren van vector functies: ik ga nog wat benches uitvoeren om te kijken of mijn functies bepaalde acties sneller uitvoeren dan ingebouwde array functies.
Het 'programma' is tot nu toe 220 regels lang. Misschien zal ik binnenkort de source nog posten, als hij helemaal naar behoren werkt.
Ik kan hem niet online laten werken, aangezien hij ~300000 rays berekent, wat op mijn computer al zo'n 30 seconden duurt.
Dat was het, als er nog vragen en/of op|aanmerkingen zijn: post.
--------------------------------------------------------------------------------------
PS: Je kan zien wat ik wil bereiken door een beker te pakken en dan bij een felle lamp deze erin te laten schijnen, beweeg de beker een beetje totdat je een dergelijk patroon ziet verschijnen.
PS 2: Ik hoop dat er hier niet alleen 'problemen' mogen worden gepost in P&W, was niet geheel duidelijk in de FAQ, maar ach een beetje 'showen' mag toch wel?
PS 3: Het is inderdaad een totaal nutteloos project als iemand dat zich afvraagt, maar een beetje hersen gymnastiek is wel een nuttig bezigheid IMHO + ik train mezelf weer meer in effectief PHP programmeren.
Ik liep een paar maanden geleden rond met het idee om caustics (is geen Nederlands woord voor) te gaan simuleren, zoals hier, dit naar aanleiding van een wiskunde leraar die ik had die ook gefascineerd was door de 'dubbele curve in zijn koffie beker', mijn passie voor 3D en aanverwante render programma's (zoals Brazil en FR) die ook caustics kunnen produceren, en mijn voorkeur voor PHP als beste programmeertaal ever (just kidding, ik ben alleen een fan en te onwetend wat C betreft).
Na een aantal keren wat schetsjes te hebben gemaakt en wat algemene aanpak ideeen op papier te hebben gemaakt, vond ik het twee weken geleden wel eens tijd om het ook in de praktijk te brengen.
Na veel typen, zweten, nadenken en zwoegen is er uiteindelijk een redelijk resultaat uitgekomen, maar hij is zeker nog steeds niet af en moet nog geoptimaliseerd worden.
Plaatje:

CL, OL en PL zijn niet echt interessant, het is een oud schetsje, maar zo krijg je een idee van hoe ik het heb willen aanpakken. Beta boeide uiteindelijk ook niet echt, want ik was overgestapt over vector berekeningen.
A.d.h.v OP en PL wordt dus de reflectierichting uitgerekend.
Als er belangstelling voor is kan ik wel een uitgebreide beschrijving geven van hoe ik het heb gedaan.
Plan'o'work:
In short:
- Neem Positie van lamp (puntbron) + Positie op 'ring'
- Bereken Reflectie richting vanaf ring adhv Pring
- Bereken aan de hand van hoogteverschil tussen Plamp en Pring het aantal nog af te leggen units in de reflectierichting
- Met pythagoras is dan de positie te bepalen waar de 'ray' de grond gekruist wordt.
- Het uiteindelijke showen gebeurt op een hardcore methode: een tabel met 250x5000 td's waarvan de achtergrond grijswaarde de (genormaliseerde) intensiteit weergeeft. Lelijk? Dom? Uberkill? Tsja, maybe, maar het werkt wel, en who cares about 20Mb HTML files?
Dit alles heb ik zo veel mogelijk met 'vectoren' (arrays) uitgerekend. Vooral de reflectierichting berekening was even nadenken, maar uiteindelijk na heel wat denkwerk had ik toch een algoritme / methode verzonnen die het naar behoren uitvoerde. Voor de wiskundigen onder ons: het is een soort Gram-Schmidt methode (bepaling loodrechte vector), gepruts met inproducten dus.
Resultaat:
Anyways:
Resultaten willen jullie natuurlijk zien...
Hier een (dit resultaat is niet helemaal correct dus), ik was al redelijk tevreden dat ik dit eruit heb gekregen omdat het sterk overeenkomt met de werkelijkheid en resultaten van anderen. Hier stond de puntbron op een x-positie van 0:

En hier het resultaat met de puntbron niet in een 0 positie, het resultaat is deels veel beter, maar zoals je ziet lijkt het alsof maar een deel van de cirkel reflecteert. Ik weet waar dit aan ligt, ik moet het alleen nog oplossen!

En een composit van twee verschillende oplossingen die ik geprogrammeerd dus nog niet helemaal voor elkaar heb:

Nog te doen:
- Het belangrijkste probleem wat ik nog heb is dat het berekenen van het crosspoint met de grond nog niet helemaal naar behoren verloopt, aangezien de berekende richting twee betekenissen heeft (de richting is een vector en dan met de positie vector van het reflectie punt heb je een lijn, alleen deze kan je dus op twee manieren aflopen...). Als ik deze te pakken krijg is hij eigenlijk af en heb ik mijn doel bereikt, alleen dat vereist nog even wat denkwerk.
- Optimaliseren van vector functies: ik ga nog wat benches uitvoeren om te kijken of mijn functies bepaalde acties sneller uitvoeren dan ingebouwde array functies.
Het 'programma' is tot nu toe 220 regels lang. Misschien zal ik binnenkort de source nog posten, als hij helemaal naar behoren werkt.
Ik kan hem niet online laten werken, aangezien hij ~300000 rays berekent, wat op mijn computer al zo'n 30 seconden duurt.
Dat was het, als er nog vragen en/of op|aanmerkingen zijn: post.
--------------------------------------------------------------------------------------
PS: Je kan zien wat ik wil bereiken door een beker te pakken en dan bij een felle lamp deze erin te laten schijnen, beweeg de beker een beetje totdat je een dergelijk patroon ziet verschijnen.
PS 2: Ik hoop dat er hier niet alleen 'problemen' mogen worden gepost in P&W, was niet geheel duidelijk in de FAQ, maar ach een beetje 'showen' mag toch wel?
PS 3: Het is inderdaad een totaal nutteloos project als iemand dat zich afvraagt, maar een beetje hersen gymnastiek is wel een nuttig bezigheid IMHO + ik train mezelf weer meer in effectief PHP programmeren.
[ Voor 26% gewijzigd door Cavorka op 29-08-2003 21:08 ]
the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.