Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Matematiikkaa

Sivun loppuun

nakkikorva [25.06.2004 11:25:59]

#

Miten saisi tietää kummalla puolella joku piste on, kun näyttö on jaettu kahteen sektoriin (keskeltä reunoille kaksi janaa)?

Heikki [25.06.2004 12:19:54]

#

Tarkoitatko, että ruutu on jaettu pystysuunnassa/vaakasuunnassa kahteen osaan?

Eikös se ole sitten näin:

if (pisteenykoordinaatti > keskipiste)
     PisteAlla();
else
     PisteYlla();

Josnyt tajusin ongelmasi oikein...

Tempfile [25.06.2004 15:02:25]

#

Luultavasti nakkikorva tarkoitti tällaista lähempänä piirakkakaaviota olevaa ruudun jakoa. En ole asiaan tutustunut, mutta luulisin että ongelman saa ratkaistuksi jotenkin pisteen ja janojen päiden etäisyyksiä laskemalla.

hunajavohveli [25.06.2004 17:41:03]

#

Tässä tapauksessa täytyisi tietää molempien janojen päiden kulmat keskipisteeseen nähden. Tämänhän saisi laskettua arkustangentilla, joka käsittääkseni löytyy math.h:sta.

nakkikorva [03.07.2004 08:48:27]

#

En saa tuota atan-funktiota oikein toimimaan. Eikös sen pitäisi palauttaa vektorin kulma radiaaneina, kun sille antaa parametriksi y/x tai x/y? Ja eikö radiaanit muuteta asteiksi kertomalla pii*180:llä?

setä [03.07.2004 09:22:20]

#

Ratkaisu riippuu hieman siitä, miten nuo rajat on määritelty. Jos esim. ruudun keksipiste on X0, Y0, vasemman viivan alkupiste X1, Y1 ja oikean päätepiste X2, Y2, tarkasteltava piste on X, Y, voidaan kehitellä seuraava ehtorakenne:

If X < X0 Then 'ollaan vasemmalla
   If Y < Y1 - (X - X1) * (Y1 - Y0) / (X1 - X0) Then
     'ollaan yläpuolella
   ElseIf Y > Y1 - (X - X1) * (Y1 - Y0) / (X1 - X0) Then
     'ollaan alapuolella
   Else 'ollaan rajalla
   End If
ElseIf X > X0 Then 'ollaan oikealla
   If Y < Y0 - (X - X0) * (Y0 - Y2) / (X0 - X2) Then
     'ollaan yläpuolella
   ElseIf Y > Y0 - (X - X0) * (Y0 - Y2) / (X0 - X2) Then
     'ollaan alapuolella
   Else 'ollaan rajalla
   End If
Else 'ollaan keskiviivalla
   If Y < Y0 Then 'yläpuolella
   ElseIf Y > Y0 Then 'alapuolella
   Else 'keskipisteessä
   End If
End If

En oo testannu mutta noin pitäisi mennä ilman atannia.
Edit typoja, no tietty koodasin VB:lle, mutta periaate varmaan selviää

peki [03.07.2004 10:50:48]

#

Koodivinkissäni fault noise oli eräs keino.
Sinun on tunnettava sen suoran yhtälö, jota haluat tutkia
x ja y ovat pisteen koordinaatit a, b ja c ovat suoran vakioita.

' tarkistetaan, kummalla puolella viivaa piste on
If (a * x + b * y - c > 0) Then
    ' ollaan toisella puolella
Else
    ' ollaan toisella puolella
End If

nakkikorva [03.07.2004 11:28:33]

#

Hyviä keinojahan nuo ovat, kiitos vain, mutta huomasin juuri tarvitsevani muutenkin tuota vektorin kulman laskemista :( Joten voisiko joku kertoa miksi tuo atan ei toimi näin:
kulma=atan(vektori.x/vektori.y)*pii*180?

hunajavohveli [03.07.2004 11:39:43]

#

No ei se aivan suoraan toimikaan. Tajuat kai sitten, kun tulee trigonometriaa. (ellei ole jo ollut?) Tarvitsee siihen jonkinlaista omaa säätöä. Tällaisen väkersin joskus:

Function Angle(ByVal x As Integer, ByVal y As Integer, ByVal x2 As Integer, ByVal y2 As Integer) As Single

'palauttaa koordinaattien välisen kulman radiaaneina

a = x2 - x: B = y2 - y

If a = 0 Then
    If B < 0 Then k = 0 Else k = pii
ElseIf B = 0 Then
    If a < 0 Then k = pii * 1.5 Else k = pii * 0.5
Else
    k = Atn(B / a)
    k = k + pii * 0.5
    If a < 0 Then k = k + pii
End If

Angle = k

End Function

Tuossa siis x ja y ja x2 ja y2 ovat pisteet, joiden kautta suora kulkee. Ja tuo funktio siis palauttaa, missä suunnassa (kulmana, asteina) piste (x2,y2) on pisteestä (x,y).

nakkikorva [03.07.2004 12:54:36]

#

Nyt toimii! Kiitos avusta.

peki [03.07.2004 14:24:08]

#

Kyseiseen ongelmaan on kyllä toinenkin keino:

' Vektorin pituus(magnitudi) on length; x1, y1, x2, y2 ovat pisteiden koordinaatteja.
Length1 = Sqr(x1*x1 + y1*y1)
Length2 = Sqr(x2*x2 + y2*y2)
' eli pistekerrotaan vektorit ja jaetaan pituuksien tulolla. Saadaan kahden pisteen(vektorin) välisen kulman kosini.
KosiniKulmasta = (x1*x2 + y1*y2) / (length1 * length2)

Tuota kosinia voi soveltaa sellaisenaan, tai sen voi muuntaa asteiksi tai radiaaneiksi.

Edit: voit tietenkin normalisoida vektorit myös etukäteen. jaat vain vektorin sen pituudella. silloin voi ottaa pois pistekertomisen jakamisen pituuksien tulolla.


Sivun alkuun

Vastaus

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

Tietoa sivustosta