Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: Pisteen liikuttelua

Gwaur [08.07.2003 04:43:05]

#

Miten QBasicilla sais silleen että piste lähtee vaikkapa pisteestä 100,100 vaikkapa pisteeseen 26,83? ettei se menis ihan vaaka-/pystysuoraan taikka 45 asteen kulmassa? Semmonen aliohjelma/funktio olis kiva että:

liikutapiste (alkuX, alkuY, loppuX, loppuY)

edit: älkää sitten valittako jos tossa esimerkissä on väärin kirjotettu noi muuttujan nimet, esim jos siinä pitää olla jotkut alkuX! -tyyppiset huutomerkkijutut, kun en tajua noista pätkääkään noista tommosista! :)

PS: miks pitää noi kooditagit pistää omille riveilleen? :P
PPS: jotain aliohjelmaoppaita netissä?

jouku [08.07.2003 09:25:07]

#

//Laitat tässä sen liikkumaan 26 pisteeseen vaaka tasossa ja sitten kun se on siinä teet näin.
If piste = 26,83 then
pRINT "SE OSUI SIIHEN JEE!"
end if

arcatan [08.07.2003 09:29:18]

#

No tarvitsee interpoloida (luulisin), eli käyttää samaa metodia millä piirretään muunmuassa viivoja. Täytyypä tutkiskella legendaarista lamertuttia.

Seuraava on muunnettu suoraan lamertutin esimerkkikoodista kappaleesta 7.5.

SUB liikutapiste (ax, ay, bx, by)

  deltax = bx - ax
  deltay = by - ay

  IF ABS(deltax) >= ABS(deltay) THEN

	IF deltax < 0 THEN
	  SWAP ax, bx
	  SWAP ay, by
	END IF

	Y = ay

	IF deltay = 0 THEN
	  ykorotus = 0
	ELSE
	  ykorotus = deltay / deltax
	END IF

	FOR x = ax TO bx
	' eka PSET on ylimääräinen. Lisätty
	' jotta piste liikkuisi eikä piiräisi
        ' viivaa
	  PSET (x - 1, Y - ykorotus), 0
	  PSET (x, Y), 15
	  Y = Y + ykorotus
	NEXT x

  ELSE

	IF deltay < 0 THEN
	  SWAP ax, bx
	  SWAP ay, by
	END IF

	x = ax

	IF deltax = 0 THEN
	  xkorotus = 0
	ELSE
	  xkorotus = deltax / deltay
	END IF

	FOR Y = ay TO by
	  PSET (x - xkorotus, Y - 1), 0
	  PSET (x, Y), 15
	  x = x + xkorotus

	NEXT Y

  END IF
END SUB

(Tuota käytetään siis silleen, että SCREEN 13 ja sitten CALL liikutapiste (alkuX, alkuY, loppuX, loppY) jne. Siihen voisi laittaa vielä jotain hidastetta. Uskoisin myös, että sitä pystyy optimoimaan aikas lailla reippaasti. Nyt en jaksa... saasta on hyvä ja pohtii itse *virn*)

Antti Laaksonen [08.07.2003 12:07:40]

#

Itse olen tehnyt aina näin (voi olla samoja ideoita kuin tuossa ylläolevassa koodissa):

DIM x1 AS INTEGER, x2 AS INTEGER, y1 AS INTEGER, y2 AS INTEGER
DIM askeleet AS INTEGER, xaskel AS SINGLE, yaskel AS SINGLE
DIM xkohta AS SINGLE, ykohta AS SINGLE, i AS INTEGER, a AS SINGLE

SCREEN 13

'aloituskohta
x1 = 78
y1 = 32
'lopetuskohta
x2 = 267
y2 = 166

'merkitään aloitus- ja lopetuskohta ympyrällä
CIRCLE (x1, y1), 10, 1
CIRCLE (x2, y2), 10, 2

'animaation askelten määrä
askeleet = 50
'x:n ja y:n siirtymä askelta kohden
xaskel = (x2 - x1) / askeleet
yaskel = (y2 - y1) / askeleet

'aloituskohta
xkohta = x1
ykohta = y1

'käydään läpi jokainen animaation askel
FOR i = 1 TO askeleet
   'poistetaan vanha piste
   CIRCLE (xkohta, ykohta), 1, 0
   'lasketaan uusi x ja y
   xkohta = xkohta + xaskel
   ykohta = ykohta + yaskel
   'piirretään piste
   CIRCLE (xkohta, ykohta), 1, 15
   'hidastus
   a = TIMER
   DO WHILE a + .01 > TIMER
   LOOP
NEXT

Vastaus

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

Tietoa sivustosta