Miten saisi tietää kummalla puolella joku piste on, kun näyttö on jaettu kahteen sektoriin (keskeltä reunoille kaksi janaa)?
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...
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.
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.
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ä?
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ää
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
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?
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).
Nyt toimii! Kiitos avusta.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.