Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB6: Kulma kahden pisteen suhteen

Sivun loppuun

sooda [28.07.2004 16:37:23]

#

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

Fisher [29.07.2004 09:08:20]

#

Miksi tätä ei ole julkaistu?

Blaze [30.07.2004 02:02:38]

#

Onhan se ^_^

Bill Keltanen [30.07.2004 08:44:32]

#

Aijai! Hieno!

Gaxx [30.07.2004 09:53:32]

#

No nytpä tiedän ainakin, kuinka laskea sin:n ja cos:n(kin) vasta funktioneilla!

tejeez [30.07.2004 10:42:36]

#

Mäki oon joskus miettiny miten tää tehdään mut en oo sit keksiny. Hyvä ku on nyt koodivinkki siitä ^__^

hunajavohveli [30.07.2004 11:26:32]

#

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.

Koipio-ohjelma [30.07.2004 11:31:56]

#

muuten ihan kiva mutta tökki aika paljon (voi kyllä johtua koneestakin :P)

Turambar [30.07.2004 11:50:41]

#

Eikö vb:ssä tosiaan ole arkus-funktioita vakiona?

akx [30.07.2004 13:24:46]

#

Niin, siis helpoin tapa on IMO atan((y2-y1)/(x2-x1)).

setä [30.07.2004 17:14:39]

#

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.

sooda [30.07.2004 17:20:11]

#

akx kirjoitti:

Niin, siis helpoin tapa on IMO atan((y2-y1)/(x2-x1)).

Mähän sanoin että sen varmaan voi tehdä helpomminkin :D

hunajavohveli [31.07.2004 12:13:49]

#

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.

setä [02.08.2004 08:20:50]

#

Aivan, nollarakistuksen lisäksi on tarkistettava jakajan etumerkki, jolla päätellään, onko kulma 90 ... 270 vai -90 ... 90.

sooda [02.08.2004 19:50:41]

#

Dodih. Nyt on oikeakin tapa :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta