Moro.
Kännykälle tehdään ohjelmaa, jossa pienen kolmion pitäisi pyöriä keskellä näyttöä. Ikään kuin kellon viisari.
Viivan pyöritys olisi suhteellisen helppo tehdä, mutta jostain syystä tuo kolmio ei ole niin simppeli. Tällä hetkellä kolmio "pyörii", mutta samalla myös pienenee jalopulta häviää kokonaa. Ilmeisesti liukulukujen puute aiheuttaa kärkipisteitä laskettaessa niin rankkoja pyöristyksiä, että kolmio lähtee kutistumaan.
Kolmio piirretään fillTriangle(x1,y1,x2,y2,x3,y3) -funktiolla. Käytössäni on myös luokka, johon on laskettu sinit ja cosinit 0-360, yhden asteen välein. Nämä on vielä kerrottu 10000, jotta tarkkuus riittäisi paremmin pisteiden kanssa käpistelyyn.
Pisteet lasketaan tällä hetkellä kaavalla:
newx = (oldx * cos(a)) - (oldy * sin(a))
newy = (oldy * cos(a)) - (oldx * sin(a))
Saadut pisteet tietysti jaetaan tämän jälkeen 10000.
"a" on asteluku jonka verran pistettä halutaan kääntää
Miten tätä hommaa kannattaisi lähteä lähestymään? Tuon kaavan ongelma on myös se, että kolmio kiertää 0,0 pistettä...
x1 = pituus * sin(a); y1 = pituus * cos(a); x2 = leveys * sin(a + b); y2 = leveys * cos(a + b); x3 = leveys * sin(a - b); y3 = leveys * cos(a - b);
A on kolmion kulma (0 = kärki kohti pistettä [0, 1]). Pituus on kärjen etäisyys origosta, leveys on kolmion kantakulmien etäisyys origosta, b on haluttu kulma origosta kärkeen menevän viivan ja kantakulmaan menevän viivan välillä. Kokeilemalla selviää, miten nuo vaikuttavat :) Kolmio kiertää origoa, mutta koska vanhoja arvoja ei kaivata laskuissa, noihin voi lisätä keskipisteen halutun sijainnin.
Sinitaulusta, jos et jo tiennyt:
cos(a) = sin(a + 90), radiaaneina: sin(a + (pi / 2))
cos(a) = cos(-a)
sin(a) = -sin(-a)
sin(a) = sin(180 - a), radiaaneina: sin(pi - a)
Noita yhdistelemällä päästään siihen, että tarvitaan vain yksi neljäsosa taulu (eli 90 astetta), jotta saadaan kaikki sinit ja kosinit.
Päätä aluksi, kuinka kaukana keskipisteestä kolmion kärkipisteet ovat ja missä kulmassa ne ovat verrattuna vaakasuoraan viivaan. Näin kärkipisteiden paikat saadaan kaavalla:
x = kx + cos(k) * p y = ky + sin(k) * p
Tässä (x, y) on kärkipisteen koordinaatit, (kx, ky) on näytön keskipiste, k on kärkipisteen suunnan osoittava kulma ja p on kärkipisteen etäisyys keskipisteestä. Sitten kun nämä pisteet yhdistetään, muodostuu kolmio. Kun kolmiota pyöritetään, kunkin kärkipisteen suuntakulmaa muutetaan saman verran.
Aihe on jo aika vanha, joten et voi enää vastata siihen.