Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB, VB6: Viivan laskeminen

Sivun loppuun

Sharph [14.11.2003 18:57:27]

#

Voiko viivan (kohteesta A kohteeseen B) saada laskettua kaikki pixelit (tai mielellään joka sadas pixeli)

Antti Laaksonen [14.11.2003 21:11:15]

#

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)

sooda [14.11.2003 21:20:03]

#

no huhhuh. vähä on monimutkainen mutta mulleki tosta hyötyy kiitti kovasti multaki! Jee!

Antti Laaksonen [14.11.2003 22:19:30]

#

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. :)

sooda [14.11.2003 22:21:09]

#

hienoo ascii grahfiikkaa :P toi yks alin / viiva on liikaa oikeel

Sharph [15.11.2003 08:27:13]

#

Tarkoitin että se laskee kaikkien pixeleiden (tai joka sadannen) koordinaatit!!!
se pitäisi ola nopea

sqwiik [15.11.2003 08:53:41]

#

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

Sharph [15.11.2003 14:01:11]

#

entä VB:lle

sqwiik [15.11.2003 15:42:28]

#

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 ...

Sharph [15.11.2003 21:51:23]

#

Kiitti!


Sivun alkuun

Vastaus

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

Tietoa sivustosta