Zurück   Flashforum > Flash > Stuff

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 28-02-2006, 23:30   #1 (permalink)
Neuer User
 
Benutzerbild von v0id
 
Registriert seit: Oct 2002
Ort: München
Beiträge: 1.582
[Stuff] Bézierkurve

Falls es jemand gebrauchen kann, hier eine kleine Funktion um Bézierkurven mit beliebig vielen Kontrollpunkten zu zeichnen:
ActionScript:
  1. Object.prototype.fac = function(n)
  2.     {
  3.         return n <= 1 ? 1 : n * fac(n-1);
  4.     }
  5.  
  6. Object.prototype.pascal = function(n,k)
  7.     {
  8.         return fac(n)/(fac(k)*fac(n-k));
  9.     }
  10.  
  11. MovieClip.prototype.bezier = function(k, k0, k1)
  12.     {
  13.         var i, l, t, x, y, p;
  14.        
  15.             k1 > k ? k1 = k : nil;
  16.        
  17.             p = Math.floor((arguments.length - 3)/2);         
  18.             t = k0 * 1/k;                  
  19.            
  20.             x = y = 0;   
  21.            
  22.             for (i = k0; i <= k1; i++)
  23.                 {
  24.                     t = i * 1/k;
  25.                     x = y = 0;
  26.                     for (l = 0; l < p; l++)
  27.                         {
  28.                             x += pascal(p-1,l) * arguments[l*2 + 3] * Math.pow(1-t, p-1-l) * Math.pow(t,l);
  29.                             y += pascal(p-1,l) * arguments[l*2 + 4] * Math.pow(1-t, p-1-l) * Math.pow(t,l);           
  30.                         }
  31.                     if (i == k0) this.moveTo(x, y);
  32.                             else this.lineTo(x, y);
  33.                 }
  34.     }

Anwendung:

MovieClip.bezier(Schritte, Anfang, Ende, X1, Y1, X2,Y2, ... Xn, Yn);
Schritte = Anzahl der zu berechnenden Punkte
Anfang = Bei diesem n-ten Punkt anfangen zu zeichnen
Ende = Bei diesem n-ten Punkt aufhören zu zeichnen

Beispiel:
ActionScript:
  1. _root.lineStyle(1, 0x000000, 100);
  2.  
  3. _root.bezier(50, 0, 50,
  4.                 0,   0,
  5.               100, 100,
  6.               200,   0,
  7.               300, 200);

Hoffe es kann jemand damit was anfangen

Gruß,
Viktor
v0id ist offline   Mit Zitat antworten
Alt 01-03-2006, 10:24   #2 (permalink)
Pharao a.D.
 
Benutzerbild von Tut-ench-aton
 
Registriert seit: Jul 2004
Ort: 29°58'33.34'' N, 31°07'49.29'' O
Beiträge: 430
Leider Uralt, hab mir schon mal sowas ähnliches in Flash MX Geschrieben:
PHP-Code:
function fak(fakx){
    
fakx2=fakx
    
if(fakx>1){
        for(
faki=fakx;faki>1;faki--){
            
fakx--
            
fakx2*=fakx
        
}
    } else {
fakx2=1}
    return(
fakx2)
}
function 
binomk (binomn,binomi){
    return((
fak(binomn))/((fak(binomi))*(fak(binomn-binomi))))
}
grad=10
//onEnterFrame= function(){
    
clear()
    
lineStyle(0,0x000000,100)
    for(
z=1;z<=2;z++){
    for(
i=0;i<=grad;i++){
        
set("x"+i,550*Math.random())
        
set("y"+i,400*Math.random())
        
attachMovie("Punkt","Punkt"+i,i)
        
setProperty("Punkt"+i,_x,eval("x"+i))
        
setProperty("Punkt"+i,_y,eval("y"+i))
        
//trace(eval("x"+i)+","+eval("y"+i))
    
}
    for(
i=0;i<=1;i+=0.01){
        
x=0
        y
=0
        
for(a=0;a<=grad;a++){
            
x+=eval("x"+a)*(binomk(grad,a))*Math.pow(i,a)*Math.pow(1-i,grad-a)
            
y+=eval("y"+a)*(binomk(grad,a))*Math.pow(i,a)*Math.pow(1-i,grad-a)
        }
        if(
i==0){moveTo(x,y)}else{lineTo(x,y)}
    }
    }
//} 
Angehängte Dateien
Dateityp: zip Bezierexp.zip (3,2 KB, 36x aufgerufen)
Tut-ench-aton ist offline   Mit Zitat antworten
Alt 01-03-2006, 11:10   #3 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
habt ihr beide ganz doll gemacht!

wenn ich dann nur noch kurz darauf aufmerksam machen dürfte. ist nicht das allerwichtigste, aber manchmal ;-)
Code:
Object.prototype.fac = function(n) {
	return n<=1 ? 1 : n*fac(n-1);
};
Object.prototype.pascal1 = function(n, k) {
	return fac(n)/(fac(k)*fac(n-k));
};
Object.prototype.pascal2 = function(n, k) {
	// 7,3 == (1*2*3*4*5*6*7)/(1*2*3)/(1*2*3*4)
	// == (5*6*7)/(2*3)
	// 11/4 == (1*2*3*4*5*6*7*8*9*10*11)/(1*2*3*4)/(1*2*3*4*5*6*7)
	// == (8*9*10*11)/(2*3*4)
	//
	var p=n;
	var i=n-k; while(++i<n) p*=i;
	var i=1; while (++i<=k) p/=i;
	return p;
};
//
// test
var opj={};
var i=1000;
var zeit=getTimer();
while(--i) opj.pascal1(20,9);
trace(getTimer()-zeit);
var i=1000;
var zeit=getTimer();
while(--i) opj.pascal2(20,9);
trace(getTimer()-zeit);
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib 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 19:19 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele