Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-03-2006, 09:52   #1 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
Geometrie...

Ich habe ein simples geometrisches Problem: gegeben ist ein Kreis (mittig auf der Bühne), von dem _x und _y sowie der Radius r bekannt sind. Nun möchte ich einen Punkt "dot" auf der Kreislinie platzieren, abhängig von einem Winkel a.
Meine Rechnung sieht so aus:
Zitat:
xOnRadius = function(r,a,x) {
return x+Math.cos(r/180*Math.PI)*r;
}

yOnRadius = function(r,a,y) {
return y+Math.sin(r)*(r/Math.cos(a/2));
}

/*
angenommen
r=100,
a=15,
_x = Stage.width/2
_y = Stage.height/2
*/
this.dot._x = xOnRadius(100,15,Stage.width/2);
this.dot._y = yOnRadius(100,15,Stage.height/2);
Irgendwie tut das nicht. Bin leider kein Mathefreak, vielleicht sieht jemand den Fehler gleich, jedenfalls steht der Punkt nicht auf der Bühnenmitte?
eddieconnecti ist offline   Mit Zitat antworten
Alt 08-03-2006, 10:13   #2 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Dürfte so klappen...
PHP-Code:
xOnRadius = function(r,a,x) {
    return 
Math.cosMath.PI/180  );
}

yOnRadius = function(r,a,y) {
    return 
Math.sinMath.PI/180  );
}

this.dot._x xOnRadius2090100 );
this.dot._y yOnRadius2090100 ); 
tracethis.dot._x );
tracethis.dot._y ); 
__________________
ERROR: Signature is too large

Geändert von rendner[i] (08-03-2006 um 10:21 Uhr)
rendner[i] ist offline   Mit Zitat antworten
Alt 08-03-2006, 10:43   #3 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
super, danke! das war korrekt!
eddieconnecti ist offline   Mit Zitat antworten
Alt 09-03-2006, 09:35   #4 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Ort: Schwabenländle
Beiträge: 98
zweite runde...

Es geht weiter, das Problem hat sich vergrößert. Ich verwende die Funktion drawWedge() um Kuchendiagramme zu erstellen. Was auch ganz gut funktioniert, aber... Ich möchte auf der Schnittstelle Winkelhalbierende/Kreisradius ein Label positionieren wofür ich die Funktion xOnRadius und yOnRadius (oben) verwende. Wenn man sich jetzt das Script anschaut, sitzt der Punkt manchmal in der Mitte, manchmal nicht. Z.B. sitzt der Punkt wunderbar in der Mitte, wenn man 270 als Winkel einstellt, ist aber weit vom Kuchen weg, wenn man 100 einstellt. Irgendwie muss das damit zusammenhängen, dass die Methode drawWedge() erst bei Winkel 90 anfängt zu zeichnen und auch noch entgegen dem Uhrzeigersinn, wohingegen xOnRadius und yOnRadius bei 0 anfangen und im Uhrzeigersinn verlaufen. Kann jemand dieses Kuddelmuddel auflösen und wie müsste ich welche Funktionen umschreiben, um in allen Funktionen ein und dieselben Variablen verwenden zu können?



Code:
MovieClip.prototype.drawWedge = function(x, y, startAngle, arc, radius, yRadius) {
	if (arguments.length<5) {
		return;
	}
	this.moveTo(x, y);
	if (yRadius == undefined) yRadius = radius;
	var segAngle, theta, angle, angleMid, segs, ax, ay, bx, by, cx, cy;
	if (Math.abs(arc)>360) arc = 360;
	segs = Math.ceil(Math.abs(arc)/45);
	segAngle = arc/segs;
	theta = -(segAngle/180)*Math.PI;
	angle = -(startAngle/180)*Math.PI;
	if (segs > 0) {
		ax = x+Math.cos(startAngle/180*Math.PI)*radius;
		ay = y+Math.sin(-startAngle/180*Math.PI)*yRadius;
		this.lineTo(ax, ay);
  	for (var i = 0; i<segs; i++) {
			angle += theta;
			angleMid = angle-(theta/2);
			bx = x+Math.cos(angle)*radius;
			by = y+Math.sin(angle)*yRadius;
			cx = x+Math.cos(angleMid)*(radius/Math.cos(theta/2));
			cy = y+Math.sin(angleMid)*(yRadius/Math.cos(theta/2));
			this.curveTo(cx, cy, bx, by);
		}
		this.lineTo(x, y);
	}
};

xOnRadius = function(x,r,a){
	return x + r * Math.cos( Math.PI/180 * a );
}

yOnRadius = function(y,r,a){
	return y + r * Math.sin( Math.PI/180 * a );
}

this.createEmptyMovieClip("kreis", 1);
this.kreis.lineStyle(1, 0xffcc00);
this.kreis.beginFill(0xffcc00, 100);
this.kreis.drawWedge(200, 200, 90, 360, 100);
this.kreis.endFill();


angle1 = 270; // hier bitte mal testweise 100 oder so eintragen...

this.createEmptyMovieClip("kreisausschnitt1", 2);
this.kreisausschnitt1.lineStyle(1, 0xff0000);
this.kreisausschnitt1.beginFill(0xff0000, 50);
this.kreisausschnitt1.drawWedge(200, 200, 0, angle1, 110);
this.kreisausschnitt1.endFill();

this.attachMovie("dot","dot1", 3);   // ein kleiner Punkt mittig zentriert
this.dot1._x = XPosOnCircle(200, 110, angle1);
this.dot1._y = YPosOnCircle(200, 110, angle1);
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 14:21 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele