Onko joku käyttänyt tätä kuvankäsittely ominaisuutta perlillä?
Kuvan kääntö onnistuu kohtalaisesti copyRotated metodilla, pikku pulmia tulee minulla silloin, kun kuvaa ei käännetä suorakulmaisesti.
Onko perlissä ominaisuutta, joka laskee mikä on uuden kuvan korkeus ja leveys, jos sitä kääntää esim. 45 tai 25 astetta?
Trigonometriset funktio löytyy käsittääkseni Math::Trig
Kiitos.
Tuo matematiikka ei oikein ole minun heiniä....
Olen tässä nyt itse värkännyt kuvan koon 45 asteen käännön perusteella. Laskin sen yhden kuvan peruskoon mukaan, jossa lyhyemmän sivun pituus on 74.7 prosenttia pitkän sivun pituudesta.
Kun vaakakuva käännettään 45 asteen kulmaan, sen uusi leveys on 65.7296 prosenttia suurempi kuin kuvan alkuperäinen korkeus ja uusi korkeus on 24 prosenttia suurempi kuin kuvan alkuperäinen leveys.
Siinäpä jollekkin purtavaa.. :)
Minusta helpointa on muistaa kompleksinen muoto: Jos fii on kulma radiaaneissa, niin e^{i fii} kiertää kuvaa kulman fii verran origon ympäri positiiviseen kiertosuuntaan. Jos pitää kiertää jonkun muun pisteen suhteen, niin ensiksi tuo piste voidaan siirtää origoksi, sitten tehdä kierto ja siirtää koordinaatisto taas alkuperäiselle paikalleen. Jos taas ei jaksa ajatella kompeksiluvuilla, niin kiertäminen pisteen ympäri tuottaa tasakylkisen kolmion, josta loppukoordinaatit voi päätellä trigonometrian avulla.
Jos kierto on 0-90 astetta:
UusiLeveys = VanhaLeveys * cos(kulma) + VanhaKorkeus * sin(kulma)
UusiKorkeus = VanhaLeveys * sin(kulma) + VanhaKorkeus * cos(kulma)
Jos kierto on 90-180 astetta:
UusiLeveys = VanhaLeveys * sin(kulma-90°) + VanhaKorkeus * cos(kulma-90°)
UusiKorkeus = VanhaLeveys * cos(kulma-90°) + VanhaKorkeus * sin(kulma-90°)
Yli 180° jälkeen voi vaan vähentää kulmasta 180° ja samat kaavat toimii.
Grez kirjoitti:
(21.02.2018 21:08:19): Jos kierto on 0-90 astetta: UusiLeveys...
Kiitos. Tämä melkein toimii, tekkee kuiten mieli kysyä olekko unohtanut jotakin?
Tämä melkein toimii, kun astelukema on 45 tai 135 astetta. Niilläkin kuvan leveys jää alamittaiseksi (n. 80px tässä kuvan koossa), korkeus n. 3 px liian korkeaksi.
Mikäli astelukemaksi muuttaa vaikka 44, se kuvan leveys ja korkeus muuttuvat hyvin pieniksi.
Ps. Teoriassa tuntuu siltä, että kun kuvaa kääntää 45, 135 tai 225 asteen kulmassa, kuvan leveys ja korkeus tulisi olla samat.
Ootko varma että laitat kulman oikeassa muodossa? Luultavasti Pythonin trigonometriset funktiot haluaa kulmat radiaaneina (eli 360° = 2pi)
pistemies kirjoitti:
Ps. Teoriassa tuntuu siltä, että kun kuvaa kääntää 45, 135 tai 255 asteen kulmassa, kuvan leveys ja korkeus tulisi olla samat.
Niinhän se menee
cos(45°) = n. 0,7071
sin(45°) = n. 0,7071
Grez kirjoitti:
Ootko ny varma että oot laittanut funktiot oikeen? Luultavasti Pythonin trigonometriset funktiot haluaa kulmat radiaaneina (eli 360° = 2pi)
Näin:
if($angle < 91){ $w = $width * cos($angle) + $height * sin($angle); $h = $width * sin($angle) + $height * cos($angle); } if($angle > 90 and $angle < 181){ $w = $width * sin($angle-90) + $height * cos($angle-90); $h = $width * cos($angle-90) + $height * sin($angle-90); } if($angle > 180){ $w = $width * sin($angle-180) + $height * cos($angle-180); $h = $width * cos($angle-180) + $height * sin($angle-180); }
Juu eli tosta eka rivi
$w = $width * cos(deg2rad($angle)) + $height * sin(deg2rad($angle));
Muut sit samaan tyyliin.
Grez kirjoitti:
Juu eli tosta eka rivi
$w = $width * cos(deg2rad($angle)) + $height * sin(deg2rad($angle));Muut sit samaan tyyliin.
Kiitos! Nyt alkoi toimimaa...
Ja sit jos korjaa noi muutkin bugit tuolta niin:
$lim_angle = $angle < 180 ? $angle : ($angle - 180); if($angle < 90){ $w = $width * cos(deg2rad($lim_angle)) + $height * sin(deg2rad($lim_angle)); $h = $width * sin(deg2rad($lim_angle)) + $height * cos(deg2rad($lim_angle)); } else { $w = $width * sin(deg2rad($lim_angle-90)) + $height * cos(deg2rad($lim_angle-90)); $h = $width * cos(deg2rad($lim_angle-90)) + $height * sin(deg2rad($lim_angle-90)); }
Grez kirjoitti:
(21.02.2018 22:05:13): Ja sit jos korjaa noi muutkin bugit tuolta niin: ...
Kiitos! Just huomasin, että ei toimi yli 180 asteen käännöt, mutta sinulta tulikin tähän heti korjaus :)
Hiukan säätöpeliä vielä:
Grez kirjoitti:
$lim_angle = $angle <= 180 ? $angle : ($angle - 180); if($angle <= 90){
Miten olisi pyöritykseen valmis funktio copyRotateInterpolated?
$uusikuva = $kuva->copyRotateInterpolated($kulma, $taustavari);
Aihe on jo aika vanha, joten et voi enää vastata siihen.