Volledige versie bekijken : Emveedee - Hoek Berekenen
SaphuA
%Europe/Berlin %916 %2006, 22:00
Roenesje had topic al gesloten, dus ik maak even nieuwe post, heeft de rest er ook wat aan :)
Als eerst is het belangrijk om te weten dat Flash dit soort dingen altijd in radialen berekend, en niet in graden. Dus je moet er altijd radialen instoppen en er komen altijd radialen uit.
De verhouding tussen graden en radialen kun je hier zien:
360 deg = 2PI rad
180 deg = 1PI rad
90 deg = .5PI rad
Met deze kennis kun je de volgende formules vinden:
deg = rad / PI * 180
rad = deg * PI / 180
Nu over je vraag, bekijk de volgende code eens:
// Graden naar tangens
var graden = 26;
var radialen = graden*Math.PI/180;
var tangens = Math.tan(radialen);
trace(tangens);
// Tangens naar graden
var radialen = Math.atan(tangens);
var graden = radialen*180/Math.PI;
trace(graden);
We hebben 26 graden, deze zetten we om naar radialen met onze formule. Vervolgens kunnen we hiervan de tangens vinden. (0.487732588565861)
We hebben de tangens (0.487732588565861), en zetten deze om naar radialen. Vervolgens kunnen we deze met onze fomule omzetten naar graden. (26)
~Sph
Heedless
%Europe/Berlin %928 %2006, 22:17
Miss even toevoegen aan TheFlashWizard's tutorials lijst? :) Altijd handig om even op te slaan.
Dauntless
%Europe/Berlin %937 %2006, 22:29
En wanneer je met graden / radialen werkt in flash, onthoudt dat de y as omgekeerd is tegenover wiskunde. sin(PI/2) is dus -1, niet 1.
SaphuA
%Europe/Berlin %638 %2006, 15:20
Yup dat is ook een handige tip DL :)
Emveedee
%Europe/Berlin %722 %2006, 17:19
deg = rad / PI * 180
rad = deg * PI / 180
Zie dit script:
var tanCorner:Number = 0.5 // de tan van de hoek
var corner:Number = Math.atan(tanCorner) / (Math.PI / 180); // deze klopt nu..
var corner2:Number = Math.atan(tanCorner) / (Math.PI * 180); //deze klopt niet..
var tanCorner2:Number = corner * (Math.PI / 180); // en het terugrekenen wil ook niet lukken.
trace("tanCorner: "+tanCorner);
trace("corner: "+corner);
trace("corner2: "+corner2);
trace("tanCorner2: "+tanCorner2);
deg = rad / (Math.PI / 180);
en rad weet ik niet maar dat klopt dus niet hea..
Mzl, MvD
Dauntless
%Europe/Berlin %731 %2006, 17:33
var tanCorner:Number = 0.5 // de tan van de hoek
var corner:Number = Math.atan(tanCorner) / (Math.PI / 180); // deze klopt nu..
trace("corner = "+corner);
var corner2:Number = Math.atan(tanCorner) / Math.PI * 180; //deze klopt niet..
trace("corner2 = "+corner2);
En als je terug naar tangens wilt, moet je tan gebruiken...
Emveedee
%Europe/Berlin %734 %2006, 17:37
Hmsh, sorry mijn fout..
Niet erbij nagedacht over dat die haakjes een fout zouden veroorzaken..
Dauntless
%Europe/Berlin %735 %2006, 17:39
10 / 5 / 2 = 2 / 2 = 1
10 / (5 / 2) = 10 / 2.5 = 4
Bij vermenigvuldigen mag het wel ;)
10 * 5 * 2 = 50 * 2 = 100
10 *(5 * 2)= 10* 10= 100
Emveedee
%Europe/Berlin %740 %2006, 17:46
http://img240.imageshack.us/img240/5139/hoek3ep.gif
Hoe bereken ik nou dus die _x en _y in as?
Ik heb al vanalles geprobeerd maar kom er dus niet uit .. :S
var moveX:Number = (Math.cos(corner)/(Math.PI / 180))*speed;
var moveY:Number = (Math.sin(corner)/(Math.PI / 180))*speed;
matzo
%Europe/Berlin %745 %2006, 17:52
10 / 5 / 2 = 2 / 2 = 1
10 / (5 / 2) = 10 / 2.5 = 4
Bij vermenigvuldigen mag het wel ;)
10 * 5 * 2 = 50 * 2 = 100
10 *(5 * 2)= 10* 10= 100
of te wel de vermenigvuldigin is associatief, en de deling niet.;)
Dauntless
%Europe/Berlin %748 %2006, 17:57
var moveY:Number = (Math.sin(corner) / Math.PI * 180) * speed;
var moveX:Number = (Math.cos(corner)/ Math.PI * 180)*speed;
Zou toch moeten werken hoor :)
matzo
%Europe/Berlin %749 %2006, 17:59
@Emveedee even zien. ik zet het niet in AS hoor, gewoon in wiskunde
sin 20 graden = _y/ speed -> _y = sin 20 graden * speed.
rad = deg * PI / 180 --> _y=sin((20*PI)/180)*speed.
voor _x is het
cos 20 graden = _x/speed -> _x = cos 20 graden * speed.
rad = deg * PI / 180 --> _x = cos ((20*PI)/180)*speed.
in as
var rad:Number = (20*Math.PI)/180;
var xmove:Number = Math.Cos(rad)*speed;
var ymove:Number = Math.Sin(rad)*speed;
Emveedee
%Europe/Berlin %750 %2006, 18:00
Sorry, dat werkt niet..
Hij staat op (20,10) en moet bewegen naar 0,0 met een snelheid van 10 px per tijdseenheid.
Als ik dan de uitkomsten trace,
geeft ie dit:
moveX: 7.90934678503033
moveY: 56.7472341479818
56 px omhoog.. kan nooit kloppen..
Dauntless
%Europe/Berlin %750 %2006, 18:01
Zet eens een voorbeeld .fla online ;)
matzo
%Europe/Berlin %751 %2006, 18:02
var moveY:Number = (Math.sin(corner) / Math.PI * 180) * speed;
var moveX:Number = (Math.cos(corner)/ Math.PI * 180)*speed;
Zou toch moeten werken hoor :)
Hoezo hier probeer je de omzetting van je graden naar degrees toe te passen op het goniometrisch getal, niet op de hoek zelf. Toch? :S
EDIT====
omzetting van graden naar RADIALEN bedoel ik natuurlijk.
matzo
%Europe/Berlin %752 %2006, 18:03
Sorry, dat werkt niet..
Hij staat op (20,10) en moet bewegen naar 0,0 met een snelheid van 10 px per tijdseenheid.
Als ik dan de uitkomsten trace,
geeft ie dit:
moveX: 7.90934678503033
moveY: 56.7472341479818
56 px omhoog.. kan nooit kloppen..
en met wiens code is dit geprobeerd. Toch niet met de mijne, ik kom iets heel anders uit??
EDIT====
ik kom _y = 3.4202..... en _x = 9.396926.... uit
Emveedee
%Europe/Berlin %753 %2006, 18:05
Dat is DL's code, ik zag jouw post pas nadat ik postte.
Fla is bijgevoegd.
Dauntless
%Europe/Berlin %763 %2006, 18:19
'k Dacht al dat het er vreemd uitzag :D.
var moveY:Number = (Math.sin(corner/ Math.PI * 180) ) * speed;
var moveX:Number = (Math.cos(corner/ Math.PI * 180))*speed;
Dat als 'corner' in graden staat, en dit als corner in radialen staat:
var moveY:Number = (Math.sin(corner) ) * speed;
var moveX:Number = (Math.cos(corner))*speed;
Emveedee
%Europe/Berlin %768 %2006, 18:26
Niet lullig bedoelt hoor.
Maar vul dat eens in in die .fla en kijk.. geen verschil met wat het eerst was :S
Dauntless
%Europe/Berlin %769 %2006, 18:27
'k Wil ook niet lullig doen, maar het zou wel VERSCHRIKKELIJK handig zijn als je zou uitleggen wat er in die fla zou moeten gebeuren ;).
Emveedee
%Europe/Berlin %774 %2006, 18:34
Nou..
die mc moet dus vanuit zn huidige locatie in een rechte lijn bewegen naar xPos en yPos met een bepaalde snelheid (in dit geval 10).
Ik weet dat dit ook kan op een andere manier (zonder de hoek te berekenen),
maar ik wil t doen met hoek. Waarom? Daarom :P
En als je nu kijkt zie je dattie zo beweegt
______________
\
\
\
Snappie?
Dauntless
%Europe/Berlin %775 %2006, 18:36
Ligt ook aan de if...
var speed:Number = 5;
var xPos:Number = 0;// de x van t punt waar we heen willen
var yPos:Number = 0;// de y van t punt waar we heen willen
var diffX:Number = xPos - blok_mc._x;
var diffY:Number = yPos - blok_mc._y ;
var angle:Number = Math.atan2(diffY, diffX)//hoek in radialen
var moveY:Number = (Math.sin(angle)) * speed;
var moveX:Number = (Math.cos(angle)) * speed;
// move functie is nog niet af, gewoon ff om te testen snel in elkaar geflanst let er maar niet op
function move(){
blok_mc._x += moveX;
blok_mc._y += moveY;
}
var myInterval:Number = setInterval(move,10);
this.createEmptyMovieClip("lijn",_root.getNextHighestDepth() - 100);
lijn.lineStyle(2);
lijn.moveTo(xPos,yPos);
lijn.lineTo(blok_mc._x,blok_mc._y);
Emveedee
%Europe/Berlin %776 %2006, 18:37
Hmsh,
maar hoe laat k m dan stoppen als ie op zn locatie is aangekomen?
Dauntless
%Europe/Berlin %777 %2006, 18:39
Hij gaat er nooit nauwkeurig op uitkomen... Dan moet je een andere formulle gebruiken (zonder hoeken).
Tenzij je de afstand berekent (dmv stelling van pythagoras) en daarna die afstand deelt door het aantal frames dat je wilt dat het duurt (bv 12) en dat getal als 'speed' gebruiken.
Emveedee
%Europe/Berlin %779 %2006, 18:42
Maar dan krijg je weer dat je voor een verschillende afstanden dezelfde tijd gebruikt.
Dus dat wat ik wil kan niet?
of moet ik t ergens anders zoeken?
Dauntless
%Europe/Berlin %780 %2006, 18:43
Voor elke afstand opnieuw de speed berekenen...
Zeker dat je niet gewoon een easing wilt ?
Emveedee
%Europe/Berlin %781 %2006, 18:45
Jep. Zeker :D
Hmsh, kan t niet zo:
de afstand berekenen die ik ga afleggen dmv pythagoras,
dan die afstand delen door de snelheid, <- var nrOfMoves
dan _x en _y nrOfMoves keer verhogen met speed?
Dauntless
%Europe/Berlin %782 %2006, 18:46
Dat is in principe hetzelfde als wa tik zei...
Hangt er vanaf wat je 'vast' wilt hebben: de snelheid of de tijd die hij mag nemen om naar daar te gaan.
matzo
%Europe/Berlin %782 %2006, 18:47
Nope dat kan niet, omdat de speed voor _x en de speed voor _y niet hetzelfde is.
Emveedee
%Europe/Berlin %785 %2006, 18:50
Mijn idee houdt dus in:
Apart voor de _x en _y delen :)
Dan werkt t wel.
Dauntless
%Europe/Berlin %785 %2006, 18:50
-bereken de afstand: stelling van pythagoras
-bereken de hoek
-bereken moveX en moveY
-deel de afstand door het aantal stappen hij moet nemen = Z
-verhoog de _x en _y met moveX en moveY gedurende Z stappen.
Je gaat er nooit exact op uitkomen, aangezien je gaat moeten afronden...
Emveedee
%Europe/Berlin %786 %2006, 18:52
Er zal vast wel een oplossing voor zijn te maken dattie met precies 10 speed beweegt
behalve in de laatste stap dattie daar psies beweegt wat ie moet bewegen (met nog steeds 10 speed) maar dat is me teveel werk. :)
Dauntless
%Europe/Berlin %787 %2006, 18:54
Dat zijn dus 5 regeltjes meer AS of zo ...
matzo
%Europe/Berlin %792 %2006, 19:01
if(0-this._x<moveX){//moveX is normaal dan een negatief getal, als je van 20 naar 0 gaat over de x-as
/**
*bereken de overige afstand
*laat henm die afstand bewegen,
*als het goed is moet _y niet mee in de if omdat _y mooi volgt*/
}
Emveedee
%Europe/Berlin %804 %2006, 19:18
Dat zijn dus 5 regeltjes meer AS of zo ...
Nu je t zegt ja xD
Ik zal t wel s uitvogele xD
Ik zat al heel ingewikkeld te denken maar t gaat idd vrij simpel xD
SaphuA
%Europe/Berlin %833 %2006, 20:00
var verplaats = snelheid>afstand?snelheid:afstand;
boluc91
%Europe/Berlin %848 %2006, 20:22
EDIT: moet nog een interval in en de bal moet nog naar beneden
var inter1 = setInterval(lopendeband,100);
function lopendeband(){
var yn = (obj1._y - 40) + (bal._x - obj1._x)* Math.tan((obj1._rotation * Math.PI) / 180);
var hit1 = bal.hitTest(bal._x, yn + 40, true);
if((hit1) || (lopendeband == true)){
if(obj1._visible == true){
lopendeband = true;
var yspeed = Math.sin((obj1._rotation * Math.PI) / 180) * 2;
var xspeed = Math.cos((obj1._rotation * Math.PI) / 180) * 2;
var maxhor = (obj1._width * (Math.cos(((obj1._rotation * Math.PI) / 180))));
bal._x = bal._x + xspeed;
bal._y = bal._y + yspeed;
if(bal._x > obj1._x + maxhor + 50){
lopendeband = false;
}
}
if(lopendeband == false){
bal._y = bal._y + 6;
}
}
maxhor klopt voor geen meter.... voor de verder rest is de snelheid hoek en alles goed
dus een vraag en mischien een gedeelte van het antwoord
matzo
%Europe/Berlin %857 %2006, 20:34
En voor wat staat 'maxhor'?
Emveedee
%Europe/Berlin %941 %2006, 22:35
Hmsh, heb eens wat zitten proberen met t aantal stappen berekenen.. maar t schijnt niet te werken..
var speed:Number = 1;
var xPos:Number = _xmouse;// de x van t punt waar we heen willen
var yPos:Number = _ymouse;// de y van t punt waar we heen willen
var diffX:Number = xPos - blok_mc._x;
var diffY:Number = yPos - blok_mc._y ;
var angle:Number = Math.atan2(diffY, diffX)//hoek in radialen
var moveY:Number = (Math.sin(angle)) * speed;
var moveX:Number = (Math.cos(angle)) * speed;
var steps:Number = Math.ceil(Math.sqrt(diffX*diffX + diffY*diffY) / speed);
trace("steps: "+steps);
var count:Number = 0;
var i:Number = 0;
function move(){
if(blok_mc._x >= xPos && blok_mc._y >= yPos){
if(i == 0){
trace("count: "+count);
i++;
}
}
else{
blok_mc._x += moveX;
blok_mc._y += moveY;
count++
}
}
var myInterval:Number = setInterval(move,1);
this.createEmptyMovieClip("lijn",_root.getNextHighestDepth() - 100);
lijn.lineStyle(2);
lijn.moveTo(xPos,yPos);
lijn.lineTo(blok_mc._x,blok_mc._y);
dit stukje zou t aantal stappen moeten berekenen
var steps:Number = Math.ceil(Math.sqrt(diffX*diffX + diffY*diffY) / speed);
trace("steps: "+steps);
(en ik controleer t met count in de move functie..)
maar t geeft altijd wat anders?
Wat doe k dan fout?
Edit:
Hier wat traces mocht je ze willen zien:
steps: 359
count: 377
--------------------
steps: 288
count: 300
--------------------
steps: 339
count: 404
--------------------
steps: 277
count: 288
--------------------
steps: 279
count: 307
--------------------
steps: 110
count: 112
--------------------
steps: 113
count: 117
--------------------
steps: 99
count: 105
--------------------
steps: 153
count: 166
SaphuA
%Europe/Berlin %977 %2006, 23:28
Zijn jullie niet gewoon opzoek naar iets als dit?
MovieClip.prototype.drawCircle = function(r, f) {
this.beginFill(f, 100);
this.moveTo(r, 0);
for (var i = 45; i<=360; i += 45) {
var ax = r*Math.cos(i*Math.PI/180);
var ay = r*Math.sin(i*Math.PI/180);
var cx = ax+r*Math.tan(.125*Math.PI)*Math.cos((i-90)*Math.PI/180);
var cy = ay+r*Math.tan(.125*Math.PI)*Math.sin((i-90)*Math.PI/180);
this.curveTo(cx, cy, ax, ay);
}
this.endFill();
};
this.createEmptyMovieClip("c", 2);
c._x = Stage.width/2;
c._y = Stage.height/2;
c.drawCircle(10, 0x00FFFF);
c.lineStyle(1, 0x000000);
c.lineTo(15, 0);
this.createEmptyMovieClip("d", 1);
d._x = _xmouse;
d._y = _ymouse;
d.drawCircle(10, 0xFF00FF);
d.startDrag(true);
Mouse.hide();
var snelheid = 20;
this.onEnterFrame = function() {
var xdif = d._x-c._x;
var ydif = d._y-c._y;
var radialen = Math.atan2(ydif, xdif);
var graden = radialen/Math.PI*180;
var afstand = Math.sqrt(xdif*xdif+ydif*ydif);
var verplaats = snelheid>afstand ? afstand : snelheid;
c._x += Math.cos(radialen)*verplaats;
c._y += Math.sin(radialen)*verplaats;
c._rotation = graden;
};
boluc91
%Europe/Berlin %324 %2006, 07:46
maxor = ----- << de width van die
\
\<< is obj1 gedraaid
\
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.