atan2, sin, cos - efekt drogi mlecznej

0

Witam,
mam pytanie, mam sobie dwa punkty w układzie współrzędnych. Potrzebuję obliczyć kąt między tymi punktami po to aby potem drugi punkt przesuwać pod tym kątem. Chodzi mi o efekt drogi mlecznej (wygaszacz w windows xp) - jest pewna ilość obiektów (gwiazd) na ekranie, początkowo w losowej pozycji. Od każdej gwiazdy obliczam jaki jest kąt od środka ekranu do tej gwiazdy (przykładowo gdy gwiazda jest w prawym górnym rogu ekranu to kąt od środka do tej gwiazdy wyniesie 45 stopni (pod warunkiem, że ekran kwadratowy;p)). Następnie chcę taką gwiazdę przesuwać dalej po tym radialu.
Problem mam tylko z zakodowaniem. Mam sobie funkcje [code]function getAngle(x1:Number, y1:Number, x2:Number, y2:Number):Number {
var dx:Number = x2 - x1;
var dy:Number = y2 - y1;
return Math.atan2(dy,dx);
}[/code] która mi liczy kąt między jednym punktem a drugim w radialach. Ale jak teraz ten dany obiekt przemieścić? Jak tą wartość podstawić do tych sinusów i cosinusów?

0

Znaczy chcesz mieć po prostu efekt lotu przed siebie miedzy gwiazdami? Jezeli tak to po prostu skorzystaj z matematyki 3d.
Każdą gwiazdę opisz przez x,y,z następnie stwórz tablice takich punktów i wylosuj je.
x = <+maxX, -maxX >
y = <+maxY, -maxY >
z = <0, maxZ>
Animacja będzie polegać na tym że zmniejszasz "z" o jakąś wartość im wieksza zmiana tym animacja szybsza. kiedy "z" <= 0 losujesz nowe wartości x,y,z lub po prostu zawijasz z(ustawiasz z=maxZ) ale w takim przypadku będzie widać powtarzalność.

Aby narysowac taka gwiazde wyliczasz :

x_ekran = xFOCUS/z + szerokosc_ekranu_w_pixelach/2
y_ekran = wysokosc_ekranu_w_pixelach/2 - y
FOCUS/z

maxX,maxY, maxZ możesz dobrać metodą badawczą. im wieksze maxX tym szersze pasmo gwiazd, im wieksze maxY tym wyższe pasmo gwiaz, im większe maxZ tym dalej gwiazdy zaczna wędrówkę.

Dodatkowo im wieksze maxX, maxY i maxZ tym wiecej trzeba losować gwiazd

FOCUS to odległość płaszczyzny rzutowania(przykładowo = 256).

0

Tobie po prostu chodzi ze jak jest pod katem 45 do srodka to potem przesuwac na 46 itd.? W sensie, że się kręcą wokół środka?
To robisz to tak:

 
int x, y; - wspolrzedne gwiazdy
int xo,yo - wspolrzedne srodka
//obliczamy odleglosc
var d = sqrt ( (xo-x)^2 + (yo - y) ^2 );//pitagoras
var kat = Math.atan2(x0,y0,x,y); // wyjdzie np 45
var kat += Math.PI /180; //zmieniamy na 46
//jedno z tych to wyjdzie ci przesuniecie na x i na y 
var xcos = Math.cos(kat);
var ysin = Math.sin(kat);
//teraz przesuniecie jeszcze mnozysz przez odleglosc
//nowe x i y
x = xo + xcos * d;
y = yo + ysin * d;
0

A poradziłem sobie już z tym akurat.
[code]
function Gwiazdy() {
for(var i:Number=0; i<numCopies; i++) {
var star:MovieClip = attachMovie("star", "star"+i, 10+i);
star._x = Math.random() * Stage.width;
star._y = Math.random() * Stage.height;
star.angle = getAngle(Stage.width/2, Stage.height/2, star._x, star._y); // obliczam kąt między środkiem sceny a punktem

	star.onEnterFrame = function() {
		if(GameLoaded) {
			this.removeMovieClip();
			delete this.onEnterFrame;
		}
		
		this._x += Math.cos(this.angle)*4; // I tu w tych dwóch miejscach przesuwam obiekt po tym kącie  
		this._y += Math.sin(this.angle)*4; //
		
		if(this._x > Stage.width || this._x < 0 || this._y > Stage.height || this._y < 0) {
			this._x = Stage.width/2;
			this._y = Stage.height/2;
		}
	}
}

}

function getAngle(x1:Number, y1:Number, x2:Number, y2:Number):Number {
var dx:Number = x2 - x1;
var dy:Number = y2 - y1;
return Math.atan2(dy,dx);
}
[/code]

Ale mimo wszystko dzięki za chęci :)
PS: Język to Action Script 2

0

wygląda na to że robisz coś bez sensu... najpierw wyliczasz kąt, a później kierunek na jego bazie.
zamiast tego policz wektor pomiędzy tymi wsp, znormalizuj go i następnie pomnóż przez prędkość:

1 użytkowników online, w tym zalogowanych: 0, gości: 1