Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Käännetyn kuvan leveyden ja korkeuden laskeminen

Sivun loppuun

pistemies [21.02.2018 13:16:52]

#

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?

Grez [21.02.2018 13:32:30]

#

Trigonometriset funktio löytyy käsittääkseni Math::Trig

pistemies [21.02.2018 19:48:16]

#

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.. :)

Jaska [21.02.2018 21:04:40]

#

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.

Grez [21.02.2018 21:08:19]

#

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.

pistemies [21.02.2018 21:43:18]

#

Grez kirjoitti:

(21.02.2018 21:08:19): Jos kierto on 0-90 astetta: Uusi­Le­veys...

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.

Grez [21.02.2018 21:51:27]

#

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

pistemies [21.02.2018 21:53:32]

#

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);
}

Grez [21.02.2018 21:57:18]

#

Juu eli tosta eka rivi

$w = $width * cos(deg2rad($angle)) + $height * sin(deg2rad($angle));

Muut sit samaan tyyliin.

pistemies [21.02.2018 22:03:16]

#

Grez kirjoitti:

Juu eli tosta eka rivi

$w = $width * cos(deg2rad($angle)) + $height * sin(deg2rad($angle));

Muut sit samaan tyyliin.

Kiitos! Nyt alkoi toimimaa...

Grez [21.02.2018 22:05:13]

#

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));
}

pistemies [21.02.2018 22:15:46]

#

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 :)

pistemies [28.02.2018 10:52:05]

#

Hiukan säätöpeliä vielä:

Grez kirjoitti:

$lim_angle = $angle <= 180 ? $angle : ($angle - 180);
if($angle <= 90){

Metabolix [28.02.2018 17:15:36]

#

Miten olisi pyöritykseen valmis funktio copyRotateInterpolated?

$uusikuva = $kuva->copyRotateInterpolated($kulma, $taustavari);

Sivun alkuun

Vastaus

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

Tietoa sivustosta