Miten selvitetään kulma kahden pisteen suhteen. Hyviä ja huonoja tapoja esillä. :)
havainnollistavana esimerkkinä http://sooda.dy.fi/foo/kulmahommeli.exe
Alkuperäinen versio, älä tee näin kun viznut ei tykkää siitä:
Private Sub Form_Load() 'helpottaa AutoRedraw = True ScaleMode = 3 End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single) Cls 'vanha pois 'keskix ja keskiy kx = ScaleWidth / 2 ky = ScaleHeight / 2 'pituus, keskipisteen ja hiiren koordien välinen etäisyys p = Sqr((kx - x) * (kx - x) + (ky - Y) * (ky - Y)) + 0.001 '+0.001 estää nollalla jakamisvirheen 'aste 1 ja 2, radiaaneina a1 = acos((x - kx) / p) a2 = asin((Y - ky) / p) Line (kx - 5, ky - 5)-(kx + 5, ky + 5), , B 'keskikohtaan hieno neliö Line (x - 5, Y - 5)-(x + 5, Y + 5), , B 'hiiren kohdalle hieno neliö 'tässä voitaisiin sitte tehdä a1:llä ja a2:lla vaikka mitä. 'Esim joku ylhäältäpäin kuvattu räiskintäpeli jossa ukkeli osoittaa hiiren suuntaan, 'voitaisiin piirtää kuva tietyllä asteella. Line (kx, ky)-(kx + p / 2 * Cos(a1), ky + p / 2 * Sin(a2)) 'viiva osoittaa hiirtä päin! End Sub Function asin(x) 'arkussinifunkkari, vb:n helpistä kopsittu asin = Atn(x / Sqr(-x * x + 1)) End Function Function acos(x) 'arkuskosinifunkkari, vb:n helpistä kopsittu acos = Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1) End Function
Miten se kannattaisi tehdä:
Const pi = 3.14 Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) Cls 'vanha pois 'keskix ja keskiy kx = ScaleWidth / 2 ky = ScaleHeight / 2 'pituus, keskipisteen ja hiiren koordien välinen etäisyys p = Sqr((kx - x) * (kx - x) + (ky - y) * (ky - y)) + 0.001 '+0.001 estää nollalla jakamisvirheen 'aste 1 ja 2, radiaaneina angle = atan2((x - kx), (y - ky)) angle = angle * pi / 180 Line (kx - 5, ky - 5)-(kx + 5, ky + 5), , B 'keskikohtaan hieno neliö Line (x - 5, y - 5)-(x + 5, y + 5), , B 'hiiren kohdalle hieno neliö Line (kx, ky)-(kx + p / 2 * Cos(angle), ky + p / 2 * Sin(angle)) 'viiva osoittaa hiirtä päin! End Sub Function atan2(x, y) fact = 180 / pi If (x > 0) And (y > 0) Then a = Atn(y / x) * fact If (x > 0) And (y < 0) Then a = Atn(y / x) * fact + 360 If (x < 0) And (y > 0) Then a = 180 - Atn(y / Abs(x)) * fact If (x < 0) And (y < 0) Then a = 180 + Atn(Abs(y) / Abs(x)) * fact atan2 = a End Function
Jotain vielä?
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) Cls 'vanha pois 'keskix ja keskiy kx = ScaleWidth / 2 ky = ScaleHeight / 2 Line (kx - 5, ky - 5)-(kx + 5, ky + 5), , B 'keskikohtaan hieno neliö Line (x - 5, y - 5)-(x + 5, y + 5), , B 'hiiren kohdalle hieno neliö Line (kx, ky)-((kx + x) / 2, (ky + y) / 2) End Sub
Miksi tätä ei ole julkaistu?
Onhan se ^_^
Aijai! Hieno!
No nytpä tiedän ainakin, kuinka laskea sin:n ja cos:n(kin) vasta funktioneilla!
Mäki oon joskus miettiny miten tää tehdään mut en oo sit keksiny. Hyvä ku on nyt koodivinkki siitä ^__^
Joo, kyllä tän mun tietääkseni voi helpomminkin tehdä. Ainakin itse sain laskettua kulman lyhemmällä funktiolla ja siinä tarvitsin ainoastaan arkustangenttia, enkä joutunut tekemään itse arkussiniä-, ja kosinia. Tuon +0.001 -varmistuksen olen myös korvannut toisella tavalla täsmällisemmän vastauksen saamiseksi.
Mutta kyllähän tuokin yhtä kaikki hyvin toimii.
muuten ihan kiva mutta tökki aika paljon (voi kyllä johtua koneestakin :P)
Eikö vb:ssä tosiaan ole arkus-funktioita vakiona?
Niin, siis helpoin tapa on IMO atan((y2-y1)/(x2-x1)).
Hyvä vinkki. akx, tuossa tarvitaan juuri yo. tarkistus, ettei x2-x1 satu olemaan nolla jolloin tulee virhe. Mutta viivan piirtoon keskipisteestä hiirikursoria kohden ei tarvita kulmaa lainkaan.
akx kirjoitti:
Niin, siis helpoin tapa on IMO atan((y2-y1)/(x2-x1)).
Mähän sanoin että sen varmaan voi tehdä helpomminkin :D
Turambar kirjoitti:
Eikö vb:ssä tosiaan ole arkus-funktioita vakiona?
Arkustangentti on muttei tietääkseni arkussiniä ja -kosinia.
akx kirjoitti:
Niin, siis helpoin tapa on IMO atan((y2-y1)/(x2-x1)).
Paitsi ettei tuo toimi suoraan noin. Enkä tarkoita ainoastaan tuota nollatarkistusta. Uskokaa huviksenne.
Aivan, nollarakistuksen lisäksi on tarkistettava jakajan etumerkki, jolla päätellään, onko kulma 90 ... 270 vai -90 ... 90.
Dodih. Nyt on oikeakin tapa :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.