Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-03-2006, 13:49   #1 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
Question Neuer Versuch: Rotation mit Winkel

Hallo! Ich hab das Problem zwar schon mal angesprochen, aber irgendwie scheint es niemand zu geben, der eine Lösung dafür hat. Dabei ist es - eigentlich - ganz einfach:
Ich habe einen Punkt, der auf einem Kreis steht. Nun möchte ich wissen, in welchem Winkel der Punkt zum Kreismittelpunkt M steht. Dazu habe ich den Kreis in 4 Quadranten eingeteilt... Einfach mal anschauen, normalerweise sollte die Funktion circA den korrekten Winkel ausgeben, tut sie aber nicht. Kann doch nicht sein, dass da keiner eine Antwort parat hat... ????

Code:
/*
mx = _x vom Kreismittelpunkt M
my = _y vom Kreismittelpunkt M  
px = _x vom Punkt, der auf U liegt
py = _y vom Punkt, der auf U liegt
*/
Math.circA = function(mx, my, px, py){
    var a = 270;
    if (px>mx && py > my) {
        a = Math.atan(Math.abs(px-mx)/Math.abs(my-py));      
    } else {if (px<mx && py>my) {
        a = 180 - Math.atan(Math.abs(mx-px)/Math.abs(my-py));
    } else {if (px<mx && py<my) {
        a = 180 + Math.atan(Math.abs(mx-px)/Math.abs(py-my));        
    } else {
        a = 360 - Math.atan(Math.abs(px-mx)/Math.abs(py-my));    
    }}}
    trace("circA() " + arguments.toString() + "  =  " + a);
    return a;
}


/* 1. Punkt auf den Winkel setzen, z.B. auf 225 Grad
Der Kreismittelpunkt steht bei 160/160, Radius ist 100
*/
this.dot._x = 160 + 100 * Math.cos(225 * (Math.PI / 180));
this.dot._y = 160 + 100 * Math.sin(225 * (Math.PI / 180));

// 2. Winkel von Punkt "dot" berechnen
trace(Math.circA(160, 160, this.dot._x, this.dot._y));
eddieconnecti ist offline   Mit Zitat antworten
Alt 11-03-2006, 14:31   #2 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
mmmm warum denn so kompliziert?

PHP-Code:
var radiansToRichtpunkt Math.atan2((py2-py1),(px2-px2));
var 
meinWinkel radiansToDegrees(radiansToRichtpunkt )-90;

function 
radiansToDegrees(radian) {
    return 
degree=radian*180/Math.PI;


Geändert von mojave (11-03-2006 um 14:41 Uhr)
mojave ist offline   Mit Zitat antworten
Alt 11-03-2006, 14:40   #3 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
Hallo mojave, bin ja gespannt ob das funktioniert! Danke erst mal für die Antwort!!!! Irgendwas scheint aber nicht zu stimmern in der Funktion, ich habe mal "degreesToRichtpunkt" in "radiansToRichtpunkt" umbenannt und dann sieht das so aus, gibt aber "undefined " zurück...? Stimmen bei mir die Punkte nicht, Du verwendest bei Dir andere Bezeichner...

Code:
function radiansToDegrees(radian) {
    return degree=radian*180/Math.PI;
} 


Math.circA = function(mx, my, px, py){
	var radiansToRichtpunkt = Math.atan2((py-my),(px-mx));
	var meinWinkel = radiansToDegrees(radiansToRichtpunkt)-90;
	return a;
}

this.dot._x = 160 + 100 * Math.cos(225 * (Math.PI / 180));
this.dot._y = 160 + 100 * Math.sin(225 * (Math.PI / 180));


trace(Math.circA(160, 160, this.dot._x, this.dot._y));
eddieconnecti ist offline   Mit Zitat antworten
Alt 11-03-2006, 14:42   #4 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
Aaaahh!! Sorry ich war zu schnell oder langsam oder wie auch immer, "meinWinkel " muss natürlich a sein, wenn ich a returne. Danke! ES FUNKTINIERT! Unglaublich! Danke! Ich flipp aus-....
eddieconnecti ist offline   Mit Zitat antworten
Alt 11-03-2006, 14:43   #5 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
schau dir einfach mal etwas genauer die Math klasse an. kann einem viel arbeit abnehmen wie du siehst
mojave ist offline   Mit Zitat antworten
Alt 11-03-2006, 14:49   #6 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
Question

Ja, hast Recht, hätte ich das Manual gelesen, hätte ich mir viele Stunden! Ärger gespart...
Darf ich Dich gleich nochmal anhauen? Ich versuche einer Funktion "slideToAngle" zu erklären, dass sie einen Punkt zum Winkel a2 schieben soll. Irgendwie bekomme iuch nur undefined und infinite und so was raus, aber der Punkt bleibt immer stehen...


Code:
function radiansToDegrees(radian) {
    return degree=radian*180/Math.PI;
} 


Math.circA = function(mx, my, px, py){
	var radiansToRichtpunkt = Math.atan2((py-my),(px-mx));
	var a = radiansToDegrees(radiansToRichtpunkt)-90;
	return a;
}

MovieClip.prototype.slideToAngle = function(x1, y1, a2, r, duration){
	var startangle = Math.circA(x1, x2, this._x, this._y);
	function slideto(mc, x1, y1, a1, a2, r, duration, t){
		clearInterval(id);
		var a = Math.easeInOutCirc(t, a1, a2-a1, duration);
		trace("slideToAngle() " + arguments.toString() + "  =  " + a);
		mc._x = x1 + r * Math.cos(a * (Math.PI / 180));
		mc._y = y1 + r * Math.sin(a * (Math.PI / 180));
		updateAfterEvent();
		t++;
		if (t < duration+1) id = setInterval(slideto, 10, mc, x1, y1, a, a2, r, duration, t);
	}
	var id = setInterval(slideto, 10, this, x1, y1, startangle, a2, r, duration, 0);
}

this.dot.slideToAngle(160, 160, 30, 100, 100);
eddieconnecti ist offline   Mit Zitat antworten
Alt 11-03-2006, 14:54   #7 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
Und schon wieder muss ich mcih für den unnötigenThread entschuldigen, irgendwie hat es jetzt doch ganz plötzlich geklappt...

Hier ist die Lösung:

Code:
function radiansToDegrees(radian) {
    return degree=radian*180/Math.PI;
} 


Math.circA = function(mx, my, px, py){
	var radiansToRichtpunkt = Math.atan2((py-my),(px-mx));
	var a = radiansToDegrees(radiansToRichtpunkt)-90;
	return a;
}


MovieClip.prototype.slideToAngle = function(x1, y1, a2, r, duration){
	var startangle = Math.circA(x1, x2, this._x, this._y);
	function slideto(mc, x1, y1, a1, a2, r, duration, t){
		clearInterval(id);
		var a = Math.easeInOutCirc(t, a1, a2-a1, duration);
		trace("slideToAngle() " + arguments.toString() + "  =  " + a);
		mc._x = x1 + r * Math.cos(a * (Math.PI / 180));
		mc._y = y1 + r * Math.sin(a * (Math.PI / 180));
		updateAfterEvent();
		t++;
		if (t < duration+1) id = setInterval(slideto, 10, mc, x1, y1, a, a2, r, duration, t);
	}
	var id = setInterval(slideto, 10, this, x1, y1, 225, a2, r, duration, 0);
}






this.dot._x = 160 + 100 * Math.cos(225 * (Math.PI / 180));
this.dot._y = 160 + 100 * Math.sin(225 * (Math.PI / 180));

this.dot.slideToAngle(160, 160, 30, 100, 50);
eddieconnecti ist offline   Mit Zitat antworten
Alt 11-03-2006, 14:55   #8 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
ohne das jetzt genau gelesen zu haben sehe ich schon mal, dass du der funktion gar kein parameter x2 übergibst. dan kann der aufruf
PHP-Code:
var startangle Math.circA(x1x2this._xthis._y); 
schon mal gar nicht hinhauen
mojave ist offline   Mit Zitat antworten
Alt 11-03-2006, 14:59   #9 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
achso startangle wird ja auch ganz überflüssig initialisiert (bzw gar nicht wieter verwendet)
mojave ist offline   Mit Zitat antworten
Alt 11-03-2006, 15:03   #10 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
Zitat:
achso startangle wird ja auch ganz überflüssig initialisiert (bzw gar nicht wieter verwendet)
Jop, aber in dem eben geposteten Beispiel verwende ich startangle. Für eben diesen Winkel habe ich die Funktion benötigt, weil ich ja dem setInterval sagen muss, wo er anfangen muss und wo er aufhören muss...

Danke für Deine Hilfe! Ehrlich: Mein erster Thread im Flashforum wo mir geholfen wurde! Ich freu mich!
eddieconnecti ist offline   Mit Zitat antworten
Alt 11-03-2006, 15:30   #11 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
Question

Muss jetzt doch ncohmal posten, das ist mir echt zu hoch. Ich habe an den Funktionen selbst nichts verändert und es tut sich dennoch nix, die Funtkion circA spuckt jetzt nur noch NAN aus...?

Code:
function prd(name){
	this.name = name;	
}

this.products = [];
this.products.push(new prd("karte1"));
this.products.push(new prd("karte2"));
this.products.push(new prd("karte3"));

Math.easeInOutBack = function (t, b, c, d, s) {
	if (s == undefined) s = 1.70158; 
	if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
	return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
};

function radiansToDegrees(radian) {
    return degree=radian*180/Math.PI;
} 


Math.circA = function(mx, my, px, py){
	var radiansToRichtpunkt = Math.atan2((py-my),(px-mx));
	var a = radiansToDegrees(radiansToRichtpunkt)-90;
	return a;
}

MovieClip.prototype.slideToAngle = function(x1, y1, a2, r, duration){
	var startangle = Math.circA(x1, x2, this._x, this._y);
	trace("startangle: " + startangle);
	function slideto(mc, x1, y1, a1, a2, r, duration, t){
		clearInterval(id);
		var a = Math.easeInOutBack(t, a1, a2-a1, duration, .6);
		//trace("slideToAngle() " + arguments.toString() + "  =  " + a);
		mc._x = x1 + r * Math.cos(a * (Math.PI / 180));
		mc._y = y1 + r * Math.sin(a * (Math.PI / 180));
		updateAfterEvent();
		t++;
		if (t < duration+1) id = setInterval(slideto, 10, mc, x1, y1, a, a2, r, duration, t);
	}
	var id = setInterval(slideto, 10, this, x1, y1, startangle, a2, r, duration, 0);
}




for (var i=0; i < products.length; i++) {
	this.attachMovie("dot", "dot"+i, this.getNextHighestDepth(), {index:i, n:products.length});
	this["dot"+i]._x = 160 + 100 * Math.cos((360/products.length*i) * (Math.PI / 180));
	this["dot"+i]._y = 160 + 100 * Math.sin((360/products.length*i) * (Math.PI / 180));
	
	this["dot"+i].onRelease = function(){
		for (var i=0; i < this.n; i++) {
			var angle = 360/this.n*i + (360/this.n*index);
			if (i != index) this._parent["dot"+i].slideToAngle(160, 160, angle, 100, 120);
		}
	}
}
eddieconnecti ist offline   Mit Zitat antworten
Alt 11-03-2006, 16:44   #12 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
dein x2 ist ja auch immer noch nicht initialisiert.

PHP-Code:
MovieClip.prototype.slideToAngle = function(x1y1a2rduration// nix x2 
{
    var 
startangle Math.circA(x1x2this._xthis._y);
... 
mojave ist offline   Mit Zitat antworten
Alt 11-03-2006, 16:46   #13 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
Aaaahh, m*** natürlich Du hast Recht. Jetzt tuts, ich hab aus x2 y1 gemacht, so ists korrekt!

Danke!
eddieconnecti ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 01:53 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele