Voiko viivan (kohteesta A kohteeseen B) saada laskettua kaikki pixelit (tai mielellään joka sadas pixeli)
No jos viivan aloitus- ja lopetuspisteen koordinaatit on tiedossa ja yksikkö on pikseli, niin välissä olevien pikselien määrä lienee suurinpiirtein sama kuin viivan pituus. Siksi laskemiseen voidaan käyttää Pythagoraan lausetta:
pituus = sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
no huhhuh. vähä on monimutkainen mutta mulleki tosta hyötyy kiitti kovasti multaki! Jee!
Allaolevan "kuvan" on tarkoitus selvittää hieman Pythagoraan lausetta, a, b ja c kuvaavat siis suorakulmaisen kolmion sivujen pituutta.
/| / | / | b a² + b² = c² c/ | ------ a
edit: Joo, laitoin kirjaimen sen kohdalle, niin jo toimii. :)
hienoo ascii grahfiikkaa :P toi yks alin / viiva on liikaa oikeel
Tarkoitin että se laskee kaikkien pixeleiden (tai joka sadannen) koordinaatit!!!
se pitäisi ola nopea
Lähdetään tästä... Kysymus 1: montako pistettä oikeastaan tarvitaan? Oikea vastaus on: Pitemmän sivun pikselimäärän verran. Johtuen tästä: kun siirryt pikselistä toiseen (viivalla, huom!), havaitset että toinen siirtymä on aina 1 pikseli (joko pysty- tai vaakasuunnassa) ja toinen alle 1. Se kumpi on 1 ja kumpi ei, riippuu kulmakertoimesta = y:n muutos/x:n muutos. Seuraava koodi on QBASICille, se laskee kulmakertoimen ja piirtää viivan FOR-silmukan avulla, koordinaatit lasketaan siinä. Kun kertoimet on laskettu, esim. viivan sadannen pisteen koordinaatit ovat (x1+100*xm, y1+100*ym). Ei ole vaikeaa.
'Koordinaatit: piirretään (x1,y1)-(x2,y2) DIM x1 AS SINGLE, y1 AS SINGLE, x2 AS SINGLE, y2 AS SINGLE 'Yhden pixelin suunnanmuutokset DIM xm AS SINGLE, ym AS SINGLE, etais AS INTEGER SCREEN 13 x1 = 10 : y1 = 10 x2 = 30 : y2 = 50 'Lasketaan xm, ym IF ABS(x1-x2) > 0 AND ABS(y1-y2) > 0 THEN IF ABS(x1-x2) > ABS(y1-y2) THEN 'vaakasuora sivu pitempi ym = (y2 - y1) / ABS(x1 - x2) IF x1 < x2 THEN xm = 1 ELSE xm = -1 etais = ABS(x1 - x2) ELSE 'pystysuora sivu pitempi xm = (x2 - x1) / ABS(y1 - y2) IF y1 < y2 THEN ym = 1 ELSE ym = -1 etais = ABS(y1 - y2) END IF ELSE 'toinen sivu 0 IF x1 = x2 THEN 'pystysuora viiva xm = 0 IF y1 < y2 THEN ym = 1 ELSE ym = -1 etais = ABS(y1 - y2) ELSE 'vaakasuora viiva ym = 0 IF x1 < x2 THEN xm = 1 ELSE xm = -1 etais = ABS(x1 - x2) END IF END IF 'Nyt meillä on kaikki tarvittava, piirretään valkea viiva. DIM x AS SINGLE, y AS SINGLE x = x1 : y = y1 FOR a = 0 TO etais PSET (INT(x), INT(y)), 15 x = x + xm : y = y + ym NEXT a
entä VB:lle
Sama koodi toimii myös VB:ssä (laskennan suhteen). Tuossa sitten koodia (laitoin subbina), copypasteta suoraan...
Public Sub Kulma_Kertoimet(Byval x1 As Integer, Byval y1 As Integer, Byval x2 As Integer, Byval y2 As Integer, Byref xm As Single, Byref ym As Single) IF ABS(x1-x2) > 0 AND ABS(y1-y2) > 0 THEN IF ABS(x1-x2) > ABS(y1-y2) THEN 'vaakasuora sivu pitempi ym = (y2 - y1) / ABS(x1 - x2) IF x1 < x2 THEN xm = 1 ELSE xm = -1 etais = ABS(x1 - x2) ELSE 'pystysuora sivu pitempi xm = (x2 - x1) / ABS(y1 - y2) IF y1 < y2 THEN ym = 1 ELSE ym = -1 etais = ABS(y1 - y2) END IF ELSE 'toinen sivu 0 IF x1 = x2 THEN 'pystysuora viiva xm = 0 IF y1 < y2 THEN ym = 1 ELSE ym = -1 etais = ABS(y1 - y2) ELSE 'vaakasuora viiva ym = 0 IF x1 < x2 THEN xm = 1 ELSE xm = -1 etais = ABS(x1 - x2) END IF END IF End Sub
Ja sitten sitä kutsutaan muualta koodista:
... koodia ... Dim xm As Single, ym As Single x1 = 1 : y1 = 2 : x2 = 100 : y2 = 120 Call Kulma_Kertoimet(x1, y1, x2, y2, xm, ym) 'Esim. sadas koordinaatti saadaan taas kertomalla: 'x = x1 + 100 * xm; y = y1 + 100 * ym ... lisää koodia ...
Kiitti!
Aihe on jo aika vanha, joten et voi enää vastata siihen.