Featured Post

Helppo ja nopea kolmionpiirtorutiini.

Vau. Kehitys kehittynyt ja oppi opittu. public static void SolidTriangle(Point a, Point b, Point c, Color color) {             Point[] po...

Friday, December 21, 2012

PHP array_update


function array_update($source, $updates, $keyGen = NULL) {
$out_array = array();
foreach ($source as $key=>$item) {
foreach($updates as $k=>$v){
if (isset($item[$k])) {
$item[$k] = $v;
} else {
throw new Exception("Item has no key $k");
}
}

if (NULL === $keyGen || !is_callable($keyGen)) {
$out_array[$key] = $item;
} else {
$out_array[$keyGen($item)] = $item;
}
}
return $out_array;
}

Although, array_map....

*update*

for some reason, no array_reduce with PHP5.3.3 in Debian, so...


function array_reduce($input, $callback, $initial = NULL) {
$v = $initial;
foreach ($input as $item) {
if (is_callable($callback)) {
$v = $callback($v, $item);
}
}
return $v;
}

Wednesday, December 19, 2012

Tekstuurimappaus

Ei ole vielä auennut, ei.

Mutta siis,

kun meillä on kolmio abc, jonka pisteet on järjestetty Y:n mukaan,

josta piirretään vaakasuora segmentti (x1, x2, y)

ja meillä on tekstuuri, jossa on määritelty kolmio ijk niin että i vastaa a:ta jne,

piste u, v vastaa pistettä x1, y ja
piste u', v' vastaa pistettä x2, y, niin

piste u = delta ij.X * ((x1-a.X)/delta ab.X)
piste v = delta ij.Y * ((y-a.Y)/delta ab.Y)


piste u' = delta ik.X * ((x2-a.X)/delta ac.X)
piste v' = delta ik.Y * ((y-a.Y)/delta ac.Y)

ensimmäinen näytepiste tekstuurista on u, v.

tämän jälkeen, otamme seuraavan näytteen pisteestä
u + ((u'-u)/(x2-x1))
v + ((v'-v)/(x2-x1))

kunnes näytteenottopiste on u', v' ja näytteitä on otettu (x2-x1) kappaletta.

x2, x1 ja y vastaavat todellisia koordinaatteja bufferissa.

Kokeilen mennä tällä ja katson mitä tapahtuu. Lisään ehkä havainnollistavan kuvan tänne johonkin väliin.

Tuesday, December 18, 2012

Dieetti, missä sitä ollaan?

Eli, nyt on 43. päivä, kuusi viikkoa takana.
En hoksannut punnita itseäni, kun pyörähdin salilla viime... mm, lauantaina, vai perjantaina? Olin viikonlopun Turussa, jolloin dieetti EI ollut voimassa, vaikka en isommin mättänytkään ruokaa - en tiedä, onko se tottumiskysymys vai johtuuko se kromin syönnistä, mutta ruokahalu on enimmäkseen kurissa.

Tämän päivän syönnit tulevat olemaan:
kuppi jugurttia, mandariini, kahvia, viinirypäleitä, ja n. 3-4 desin ruoka-annos.

En ole varma riittääkö tuo, ja joka tapauksessa, pitää käydä ruoka-kaupassa. Saatan ostaa kananmunia. Yhtä kaikki, en ainakaan kovin paljoa tuon ohi mene. Arvelisin että olen n. 7 kiloa pahimman alapuolella nyt. Saattaa olla optimistinen arvio, tosin.

Muuten, tuntuu että olen flunssasta taas toipunut, joten käyn salilla varmaan joko tänään tai huomenna.

Saatanpa värkätä naiivin, eli perspektiivin huomiotta jättävän,  tekstuurimappaus-algoritmin kanssa tänään.

Friday, December 14, 2012

Helppo ja nopea kolmionpiirtorutiini.

Vau. Kehitys kehittynyt ja oppi opittu.

public static void SolidTriangle(Point a, Point b, Point c, Color color) {
            Point[] points = { a, b, c };
            points = points.OrderBy((i => i.Y)).ToArray();
            a = points[0];
            b = points[1];
            c = points[2];
            double dabx = b.X - a.X;
            double daby = b.Y - a.Y;
            double dacx = c.X - a.X;
            double dacy = c.Y - a.Y;

            double x1 = a.X;
            double x2 = a.X;
            int y = a.Y;
            while (y != b.Y) {              
                HorizontalLine((int)Math.Round(x1),
(int)Math.Round(x2), y, color);
                x1 += dabx / daby;
                x2 += dacx / dacy;
                y++;
            }
            double dbcx = c.X - b.X;
            double dbcy = c.Y - b.Y;
            x1 = b.X;
            y = b.Y;
            while (y != c.Y)
            {
                HorizontalLine((int)Math.Round(x1),
(int)Math.Round(x2), y, color);
                x1 += dbcx / dbcy;
                x2 += dacx / dacy;
                y++;
            }

  }
Samat periaatteet kuin mitä aikanaan päättelin, mutta nätimmin  tehtynä. Tämä on toimivaa c-sharppia.
Voisi testiksi vääntää saman tuonne JavaGraphicsiin, jos jaksaa.

Tätäkin voi vielä yksinkertaistaa, tarvitaan ainoastaan kolme relevanttia deltaa., ja saa kaksi jakolaskua while-looppien ulkopuolelle. Olkoonkin että fiksu kääntäjä osaa optimoida tuon automaagisesti.

Thursday, December 13, 2012

Laatikkotörmäys ja dieetti

Pienensin annoskokoa. Saas nähdä tuleeko miten nälkä. Tänään voisi käydä silleen nätisti salilla, lähinnä saunassa, mutta voisi myös kävellä. En varmaan rääkkää itseäni, on sen verta flunssainen olo.

BOX COLLISION

eli siis se laatikkotörmäys. Kun kaksi kappaletta liikkuu ruudulla, on hyvä tietää josko net ovat törmäämässä. 
Tähän tuli pyörä, vai liekkö tässä tapauksessa laatikko, keksittyä uudelleen. 

A

B


Eli meillä on laatikot A, ja B, joilla on koordinaatit x, y, leveys & korkeus w, h.

Pystyakselin törmäys:
Jos A.x + A.w // oikea ylänurkka
on suurempi tai yhtäsuuri kuin B.x // vasen ylänurkka
JA
A.x on pienempi kuin B.x + B.w
Niin, kappaleet ovat samalla pystylinjalla, ja voimme tarkistaa varsinaisen törmäyksen.
Jos samalla linjalla olevissa kappaleissa,
A.y + A.h eli kappaleen A alareuna, on suurempi kuin B.y,
JA
A.y on pienempi kuin B.y, A ja B ovat törmänneet reunoistaan, B:n yläreunasta.

alapuolen törmäykseen voimme vain nakata A:n ja B:n ristiin.

Vaakasuuntaisessa törmäyksessä käännämme vain  yhtälön kyljelleen.

A

B


Pseudokoodia:

if a.x+a.w <= b.x and a.x <= b.x+b.w then:
    if a.y+a.h >= b.y and a.y < b.y then:
        collision at b.y
    if b.y+b.h >= a.y and b.y < a.y then: 
        collision at b.y+b.h
if a.y+a.h <= b.y and a.y <= b.y+b.h then:



    if a.x+a.w >= b.x and a.x < b.x then:
        collision at b.x
    if b.x+b.w >= a.x and b.x < a.x then: 
        collision at b.x+b.w

Nyt, tämä koodi tuottaa ongelmia kun useassa tilanteessa rekisteröidään sekä x- ja y-akselin törmäys.
Tämän voi ratkaista laskemalla kollisio linjalle keskipisteestä. Esimerkiksi ylläolevassa kuvassa, kappaleen A keskipisteestä piirretyssä pysty- ja vaakasuuntaisissa linjoissa x-akselilla ei tapahdu törmäystä kappaleeseen B, kun taas y-akselilla tapahtuu. Yleisesti, boxcollision on lähinnä lähtökohta tarkemmalle törmäystarkastelulle

Monday, December 10, 2012

Dieetti: Kilo pois taas. No, ehkä.

Ja paino dippasi pitkästä aikaa alle sadan ja kymmenen. Kiva.
Käyn tänään salilla varmaankin, ja pienennän taas vähän annoskokoa seuraavaan satsiin. Kyllä se tämä tästä.

Hobitti, kohta.

Näpyttelin boxcollisionin javascriptillä viikonloppuna, pitänee kirjoittaa siitä jotain tässä lähiaikoina.

Wednesday, December 05, 2012

Dieetti!

Pitää. Tosin paino ei ole niin innolla enää tippunut. Pitänee tiputtaa ruoka-annoksen kokoa entisestään.
Ja kehitellä jotain muutakin millä painoa lähtee, veikkaisin. Juuri nyt on todella helppo vahingossa syödä tarpeeksi, jolloin ei laihdu, ellei sitten käy liikkumassa, noin esimerkiksi.

Nyt on tulossa neljän päivän paussi, pitää ensi maanantaina käydä salilla, niin voi raportoida sitten mikä on tilanne.

Missasin yhden salikerran tavallaan eilen, tosin.

Monday, December 03, 2012

Miksi The Binding of Isaac on niin hyvä?

The Binding of Isaac. Minut teema jätti kylmäksi, mutta luin Postmortemin pelille, ja katsoin Let's Playn Youtubesta.

Ja toisen.
Ja kolmannen.
...
...
Ja seitsemännen.

Eli peli itsessään on lyhyt, alle tunnin per läpipeluu, ja koostuu cutsceneillä siivitetyistä Legend of Zelda(se originaali) - tyyppisistä luolastoista.

Se millä peli vetää, on se että lähes jokainen läpipeluukerta avaa uuden hahmon tai esineen pelattavaksi, ja löydetyt esineet vaikuttavat todella paljon paitsi pelityyliin, myös hahmon ulkonäköön.

Eli siinä mielessä perinteinen, "Jokainen pelikerta on uusi" - ratkaisu.

Tämän lisäksi, kunkin kentän pomot arvotaan satunnaisesti, tietyistä vaikeusryhmistä. JA, peli vaikeutuu sen mukaan, miten monesti sen on pelannut läpi ( ja siis saanut kovempia varusteita löydettäväksi luolastossa.

Lisäksi pelissä on välianimaatiot, ja useampi loppu - ei niinkään vaihtoehtoinen, kuin tarinaa pidemmälle vievä aina pykälä kerrallaan, vähän kuten Dark Corners of the Earthin loppu, josta näkee sitä enemmän, mitä paremmin on pelin pelannut.