Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Pisteen (ja kuvion) kääntö asteittain

sooda [29.06.2005 23:15:46]

#

Elikkä ite koodi kääntää tommose koordinaattipisteistä rakennettavan viivamonikulmion tietyn astemäärän verran myötäpäivään.

Algoritmi on täältä.
Ite algoritmi kääntää oikeestaan vaa yhden koordinaattipisteen origon suhteen, mutta selvensin tota tapaa tommosella hauskalla kuviolla. (ja T.M. tartti tollasta, tein tän aluks sitä varten :P)

Egsamppeli

<?php
// kuvan koko
$wid = 400;
$hei = 300;
// keskikohta
$midx = $wid / 2;
$midy = $hei / 2;
$kuva = imagecreate($wid, $hei);
imagecolorallocate($kuva, 192, 192, 192); // taustaväri
// pistetaulukko jossa taulukossa x- ja y-arvot origon suhteen
$pisteet = array(
                array(-50, -100),
                array(100, -100),
                array(100, 100),
                array(-100, 100),
                array(-50, 0)
                );
$pisteit = count($pisteet); // yhteensä pisteitä
// piirretään alkuperäinen kuva
piirräkuva(imagecolorallocate($kuva, 255, 0, 0));

// kulma annetaa skriptille tyyliin kuva_rot.php?kulma
$kulma = deg2rad($_SERVER["QUERY_STRING"]);
$c = cos($kulma);
$s = sin($kulma);
// käännetään pikselit
for ($i = 0; $i < $pisteit; $i++) {
    $x = $pisteet[$i][0];
    $y = $pisteet[$i][1];
    // googletin "rotation matrix", eka osuma:
    // http://mathworld.wolfram.com/RotationMatrix.html
    $pisteet[$i][0] = $x * $c - $y * $s;
    $pisteet[$i][1] = $x * $s + $y * $c;
}
// piirretään käännetty kuva
piirräkuva(imagecolorallocate($kuva, 0, 255, 0));
header("Content-type: image/png");
imagepng($kuva);
imagedestroy($kuva);

function piirräkuva($väri) {
    global $midx, $midy, $kuva, $pisteet, $pisteit;
    // piirretään viivasta viivaan
    for ($i = 1; $i <= $pisteit; $i++) {
        // koordinaatit
        $x1 = $midx + $pisteet[$i - 1][0];
        $y1 = $midy + $pisteet[$i - 1][1];
        // jotta saadaan viimeinenki viiva piirrettyä loppupisteestä alkupisteeseen
        if ($i == $pisteit) $i = 0;
        $x2 = $midx + $pisteet[$i][0];
        $y2 = $midy + $pisteet[$i][1];
        imageline($kuva, $x1, $y1, $x2, $y2, $väri);
        if ($i == 0) break; // vika viiva piirretty
    }
}
?>

peki [03.07.2005 22:28:32]

#

Ihan hyvä esimerkki. Jos ideaa halutaan viedä pitemmälle ja pyörittää kappaletta pisteen x ja y ympäri voidaan rotaatiomatriisi kertoa translaatiomatriisilla, jolloin origo siirtyy toiseen paikkaan ja pyöräytys tapahtuu sen suhteen. Kätevä keino, jos kappale ei sijaitsekaan origossa. :)

translaatiomatriisi on muotoa:

2D:
At = |1 0 dx|
     |0 1 dy|
     |0 0 1 |
3D:
Bt = |1 0 0 dx|
     |0 1 0 dy|
     |0 0 1 dz|
     |0 0 0 1 |

dx = delta x
dy = delta y
dz = delta z

Tällä matriisilla kerrotaan rotaatiomatriisi ennen kertomista pisteen (vektorin) arvoilla.
Ja rotaatiomatriisihan löytyi Soodan linkistä.

Huomaathan, että matriisien kertolasku ei ole kommutatiivista. Ole siis tarkkana, miten päin matriisit kerrot.

Edit: en vähään aikaan ole matriiseilla pelleillyt.. jos puhuin puutaheinää, joku voisi hieman korjailla. :)
Pelkkien rotaatiomatriisien yhdistelyssä raytracerini kanssa kyseinen keino toimi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta