Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 09-08-2002, 07:24   #1 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
Lightbulb Sutherland hodgman polygon clipping

hallihallo

Ich hab die letzte woche damit verbracht den sh algorytmus in flash mx zu implementieren. Ein beispiel in flash hätte mir dabei sehr geholfen, sowas gibts aber glaube ich noch nicht. Deswegen stell ich jetzt hier her

Das ganze ist zwar für flash zu viel, überhaupt wegen der drawing api und so, naja vielleicht kanns trozdem mal wer brauchen.

greez
Angehängte Dateien
Dateityp: zip sutherland.zip (3,2 KB, 176x aufgerufen)
secp ist offline   Mit Zitat antworten
Alt 09-08-2002, 12:39   #2 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Sehr schön secp,

ich habe dein Script gleich mal um ein Draggen des
Dreiecks erweitert, damit man noch besser sieht,
um was es geht.

ActionScript:
  1. //Polygon zeichen funktion, übernimmt ein geschlossenes Polygon
  2. function draw(pol, color, alpha) {
  3.     lineStyle(0,color,alpha);
  4.     beginFill(0xAAFFAA,100);
  5.     moveTo(pol[0][0], pol[0][1]);
  6.     for(i=1; i<pol.length;i++) {
  7.         lineTo(pol[i][0], pol[i][1]);   
  8.     }
  9.     endFill();
  10. }
  11.  
  12. //Das original polygon
  13. orig_pol = new Array([0,-100], [200,100],[-100,100]);
  14.  
  15. //der bildschirmbereich
  16. clipPlane = { x:0, y: 0, w:200, h:320 };
  17.  
  18. //ungeclipptes poly zeichnen :
  19. draw(orig_pol, 0x00FF44, 100);
  20.  
  21. //bildschirm outlines zeichnen
  22. moveTo(clipPlane.x,clipPlane.y);
  23. lineTo(clipPlane.w,clipPlane.y);
  24. lineTo(clipPlane.w,clipPlane.h);
  25. lineTo(clipPlane.x,clipPlane.h);
  26. lineTo(clipPlane.x,clipPlane.y);
  27.  
  28. //--------------------------Sutherland hodgman algorythmus------------------------------
  29.  
  30. //gibt true zurück falls der punkt xy im bildschirmbereich ist
  31. function isVisible(x, y, kante, wert) {
  32.     if(kante == "links") {
  33.         return x >= wert;
  34.     }else if(kante == "rechts"){
  35.         return x <= wert;
  36.     }else if(kante == "oben") {
  37.         return y >= wert;
  38.     }else if(kante == "unten") {
  39.         return y <= wert;
  40.     }   
  41. }
  42.  
  43. //berechnet den schnittpunkt wenn ein punkt der linie außerhalb des bildschirmbereichs liegt
  44. function intersection(x1,y1, x2, y2, kante, wert) {
  45.     var a = isVisible(x1, y1, kante, wert);
  46.     var b = isVisible(x2, y2, kante, wert);
  47.     if((a && b ) or (!a && !b) ) {
  48.         return 0;   
  49.     }else{
  50.         var slope =(y2 - y1) / (x2 - x1);
  51.         if(kante == "links" or kante == "rechts") {
  52.             arr = new Array(wert, ((wert-x1) * slope)+y1);
  53.             return arr;
  54.         }else{
  55.             arr = new Array( ((wert-y1) / slope)+x1, wert);
  56.             return arr;
  57.         }
  58.     }
  59. }
  60.  
  61. //gibt ein neues, geclipptes poly zurück.
  62. //muß für jede bildschirmkante aufgerufen werden
  63. function clipPoly( poly, kante, wert) {
  64.     sh_pol = new Array();
  65.     var sx, sy, inter, np;
  66.     np=-1;
  67.     poly[poly.length]= new Array(poly[0][0], poly[0][1]);
  68.     for( var i=1; i<poly.length; i++) {
  69.         sx = poly[i-1][0];
  70.         sy = poly[i-1][1];
  71.         if(isVisible(sx, sy, kante, wert)) {
  72.                 np++;
  73.                 sh_pol[np] = new Array(sx, sy);
  74.          }
  75.          inter = _root.intersection(sx,sy, poly[i][0], poly[i][1], kante, wert);
  76.          if(inter != 0) {
  77.                 np++;
  78.                 sh_pol[np] = new Array(inter[0], inter[1]);
  79.          }
  80.     }
  81.     return sh_pol;
  82. }
  83. //-----------------------------------------------------------------------------------
  84.  
  85. //Anwendung auf das original polygon:
  86. newPol = clipPoly(orig_pol, "links", clipPlane.x);
  87. newPol = clipPoly(newPol, "oben", clipPlane.y);
  88.  
  89. //geclipptes poly zeichnen
  90. draw(newPol,0x0044FF, 80);
  91.  
  92. function doDrag(){
  93.     var xDif = _xmouse - xStart;
  94.     var yDif = _ymouse - yStart;
  95.     var newPol = [];
  96.     for(var i in orig_pol){
  97.           newPol[i] = [];
  98.           newPol[i][0] = orig_pol[i][0] + xDif;
  99.           newPol[i][1] = orig_pol[i][1] + yDif;
  100.     }
  101.     clear();
  102.  
  103.     //ungeclipptes poly zeichnen :
  104.     draw(newPol, 0x00FF44, 100);
  105.    
  106.     //bildschirm outlines zeichnen
  107.     moveTo(clipPlane.x,clipPlane.y);
  108.     lineTo(clipPlane.w,clipPlane.y);
  109.     lineTo(clipPlane.w,clipPlane.h);
  110.     lineTo(clipPlane.x,clipPlane.h);
  111.     lineTo(clipPlane.x,clipPlane.y);
  112.    
  113.     newPol = clipPoly(newPol, "links", clipPlane.x);
  114.     newPol = clipPoly(newPol, "oben", clipPlane.y);
  115.     newPol = clipPoly(newPol, "rechts", clipPlane.x + clipPlane.w);
  116.     newPol = clipPoly(newPol, "unten", clipPlane.y + clipPlane.h);
  117.  
  118.     draw(newPol,0x0044FF, 80);
  119. }
  120.  
  121. onMouseDown  = function(){
  122.     xStart = _xmouse;
  123.     yStart = _ymouse;
  124.     onEnterFrame = doDrag;
  125. }
  126.  
  127. onMouseUp = function(){
  128.     delete onEnterFrame;
  129. }


btw. im neuen Powerflasherbuch gibt es auch einen
Abschnitt darüber.

mfg r.

Geändert von bokel (09-08-2002 um 13:59 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 09-08-2002, 16:57   #3 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
wow

und gegen alle kanten. dann würde ich dir meine aufgespeedete variante vorschlagen:

Code:
array.prototype.clipPolyH = function(wert) {
	var sh_pol = new Array();
	var np=-1;
	this[this.length] = [this[0][0], this[0][1]];
	for( var i=1; i<this.length; i++) {
		if(this[i-1][1] <= wert) {
				sh_pol[++np] = [this[i-1][0], this[i-1][1]];
		 }
		 if((this[i-1][1] <= wert) != (this[i][1] <= wert)) {
			  sh_pol[++np] = [ ((wert-this[i-1][1]) / ((this[i][1] - this[i-1][1]) / (this[i][0] - this[i-1][0]))) + this[i-1][0], wert ];
		 }
	}
	return sh_pol;
}

array.prototype.clipPolyX = function(wert) {
	var sh_pol = new Array();
	var np=-1;
	this[this.length] = [this[0][0], this[0][1]];
	for( var i=1; i<this.length; i++) {
		if(this[i-1][0] >= wert) {
				sh_pol[++np] = [this[i-1][0], this[i-1][1]];
		 }
		if(( this[i-1][0] >= wert) != (this[i][0] >= wert)) {
			sh_pol[++np] =[wert, ((wert-this[i-1][0]) * ((this[i][1] - this[i-1][1]) / (this[i][0] - this[i-1][0]))) + this[i-1][1]];
		}
	}
	return sh_pol;
}
array.prototype.clipPolyW = function(wert) {
	var sh_pol = new Array();
	np=-1;
	this[this.length] = [this[0][0], this[0][1]];
	for( var i=1; i<this.length; i++) {
		if(this[i-1][0] <= wert) {
				sh_pol[++np] = [this[i-1][0], this[i-1][1]];
		 }
		if((this[i-1][0] <= wert) != (this[i][0] <= wert)) {
			sh_pol[++np] = [wert, ((wert-this[i-1][0]) * ((this[i][1] - this[i-1][1]) / (this[i][0] - this[i-1][0]))) + this[i-1][1]];
		}
	}
	return sh_pol;
}
array.prototype.clipPolyY = function(wert) {
	var sh_pol = new Array();
	np=-1;
	this[this.length] = [this[0][0], this[0][1]];
	for( var i=1; i<this.length; i++) {
		if(this[i-1][1] >= wert) {
				sh_pol[++np] = [this[i-1][0], this[i-1][1]];
		 }
		if((this[i-1][1] >= wert) != (this[i][1] >= wert)) {
			sh_pol[++np] = [ ((wert-this[i-1][1]) / ((this[i][1] - this[i-1][1]) / (this[i][0] - this[i-1][0]))) + this[i-1][0], wert ];
		}
	}
	return sh_pol;
}
secp ist offline   Mit Zitat antworten
Alt 09-08-2002, 17:33   #4 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
Hmm mit den array protos geht dann der for in loop nicht mehr.

Außerdem würde ich gerne das array direkt bearbeiten. Hättest du dafür eine lösung? Immer wenn ich das probiere k***t meine kiste ab
secp ist offline   Mit Zitat antworten
Alt 09-08-2002, 20:05   #5 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Wenn du was probierst ? Hast du ein Beispiel ?

Btw. ich würde auf das zweidimensionale Array
verzichten und die x und y werte einfach
hintereinander in ein normales Array schreiben.

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 09-08-2002, 20:32   #6 (permalink)
Neuer User
 
Registriert seit: Apr 2002
Ort: Vorm PC
Beiträge: 1.583
hauptgrund: mehrdimensional = mehr performance-verlust (AS)
das hab ich vorallem bei der 3d-geschichte eindeutig bemerkt...
Gnut ist offline   Mit Zitat antworten
Alt 10-08-2002, 08:46   #7 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
ich habs jetzt auc h´auf 1dim umgestellt, jetzt würde ich gerne keine arrays hin und herschieben müssen, das schaff ich aber nicht - vielleciht geht das gar nicht? hier mal ein versuch :

ActionScript:
  1. array.prototype.clipPolyX = function(wert) {
  2.     var sh_pol = new Array();
  3.     var sx, sy, np, slope;
  4.     np=-1;
  5.     this[this.length] = this[0]
  6.     this[this.length] = this[1];
  7.     for( var i=2; i<this.length; i+=2) {
  8.         sx = this[i-2];
  9.         sy = this[i-1];
  10.         if(sx >= wert) {
  11.                 sh_pol[++np]=sx;
  12.                 sh_pol[++np]=sy;
  13.          }
  14.         if(( sx >= wert) != (this[i] >= wert) ) {
  15.             slope = (this[i+1] - sy) / (this[i] - sx);
  16.             sh_pol[++np] = wert;
  17.             sh_pol[++np] = ((wert-sx) * slope) + sy;
  18.         }
  19.     }
  20.     return sh_pol;
  21. }
  22.  
  23. array.prototype.clipPolyY = function(wert) {
  24.     //var sh_pol = new Array();
  25.     var sx, sy, np, slope;
  26.     np=-1;
  27.     this[this.length] = this[0];
  28.     this[this.length] = this[1];
  29.     for( var i=2; i<this.length; i+=2) {
  30.         sx = this[i-2];
  31.         sy = this[i-1];
  32.         if(sy >= wert) {
  33.                 //sh_pol[++np] = sx;
  34.                 //sh_pol[++np] = sy;
  35.          }else{
  36.                 this.splice(i,2);
  37.                 i-=2;
  38.          }
  39.         if(( sy >= wert) != (this[i+1] >= wert) ) {
  40.             slope = (this[i+1] - sy) / (this[i] - sx);
  41.             this.splice(i,1,((wert-sy) / slope) + sx);
  42.             this.splice(i+1,1, wert);
  43.             i+=2;
  44.         }
  45.     }
  46.     //return sh_pol;
  47. }
  48.  
  49.  
  50. //Polygon zeichen funktion, übernimmt ein geschlossenes Polygon
  51. function draw(pol, color, alpha) {
  52.     lineStyle(0,color,alpha);
  53.     beginFill(color,alpha);
  54.     moveTo(pol[0], pol[1]);
  55.     for(i=2; i<pol.length;i+=2) {
  56.         lineTo(pol[i], pol[i+1]);   
  57.     }
  58.     endFill();
  59. }
  60.  
  61.  
  62.  
  63.  
  64.  
  65. //Das original polygon
  66. orig_pol = new Array(0,-100,
  67.                      100,100,
  68.                      -100,100);
  69.  
  70. //der bildschirmbereich
  71. clipPlane = { x:0, y: 0, w:200, h:320 };
  72.  
  73. //ungeclipptes poly zeichnen :
  74. draw(orig_pol, 0x00FF44, 100);
  75.  
  76. //bildschirm outlines zeichnen
  77. moveTo(clipPlane.x,clipPlane.y); lineTo(clipPlane.w,clipPlane.y); lineTo(clipPlane.w,clipPlane.h); lineTo(clipPlane.x,clipPlane.h); lineTo(clipPlane.x,clipPlane.y);
  78.  
  79.  
  80.  
  81.  
  82. //Anwendung auf das original polygon:
  83. newPol = orig_pol.clipPolyX(clipPlane.x);
  84. newPol.clipPolyY(clipPlane.y);
  85.  
  86. //geclipptes poly zeichnen
  87. draw(newPol,0x000033, 50);

der clipPolyX prototyp funzt wie vorher, nur 1dim.

Beim yClip hab ich das probiert, das das array direkt bearb. wird. Ich check da aber irgendwas nicht . Wahrscheinlich muß ich da irgendwas tmp´n. Das ist mir irgendwie zu hoch
secp ist offline   Mit Zitat antworten
Alt 10-08-2002, 10:08   #8 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Schau dir mal die Doku von array.splice an,
dann klappt es auch

Ich glaube aber nicht, dass das was bringt,
es wird eher langsamer.

push ist übrigens auch schneller als a[a.length]=b,
zumindest seit dem neuen 6er Plugin.

ActionScript:
  1. t = getTimer();
  2.  
  3. a = [];
  4. for(i=0;i<1000;i++){
  5.     a.push(i);
  6. }
  7. trace(getTimer() - t);
  8.  
  9. t = getTimer();
  10.  
  11. a = [];
  12. for(i=0;i<1000;i++){
  13.     a[a.length] = i;
  14. }
  15. trace(getTimer() - t);
  16.  
  17. t = getTimer();
  18.  
  19. a = [];
  20. for(i=0;i<1000;i++){
  21.     a[i] = i;
  22. }
  23. trace(getTimer() - t);

Hier ist eine optimierte Version von clipPolyX

ActionScript:
  1. //gibt ein neues, geclipptes poly zurück.
  2. function clipPolyX(poly, wert) {
  3.     var sh_pol = new Array();
  4.     var x1, y1, x2, y2;
  5.     var a, j;
  6.  
  7.     poly.push(x1=poly[0]);
  8.     poly.push(y1=poly[1]);
  9.    
  10.     j = poly.length-2;
  11.     a = (x1 >= wert);
  12.    
  13.     while(j > 0){
  14.         // koordinaten kommen umgekehrt
  15.         y2 = poly[--j];
  16.         x2 = poly[--j];
  17.         //   
  18.         if (a) {
  19.             sh_pol.push(x1);
  20.             sh_pol.push(y1);
  21.         }
  22.         //
  23.         //schnittpunkt berechnen
  24.         if(a != (x2 >= wert)){
  25.             sh_pol.push(wert);
  26.             sh_pol.push((wert - x1) * (y2 - y1) / (x2 - x1) + y1);
  27.             a = !a;
  28.         }
  29.         //
  30.         x1 = x2;
  31.         y1 = y2;
  32.     }
  33.     return sh_pol;
  34. }

mfg r.

Geändert von bokel (10-08-2002 um 12:25 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 10-08-2002, 12:15   #9 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
hmm ,da sind meine array protos mit 2 dimensionen ja genauso schnell. Ich glaub schon das das sh_pol array viel zeit benötigt, das wird ja dann by value zurückgegeben, oder? by ref? naja pointer wären cool .

Das splice ist nicht das prob, sondern der algo.
secp ist offline   Mit Zitat antworten
Alt 10-08-2002, 12:23   #10 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Wie hast du denn gemessen ?
Ich bekomme die folgenden Ergebnisse:

3286 clipPolyX eindimensional bokel
3977 Array.clipPolyX eindimensional secp
4445 Array.clipPolyX zweidimensional secp

ActionScript:
  1. x = 10;
  2. xHalbe = 5;
  3. loops = 200;
  4.  
  5. //array mit abwechselnd grossen und
  6. //kleinen wertepärchen erzeugen
  7. a = [];
  8. for(i=0; i<x; i++){
  9.     a.push(i);
  10.     a.push(i);
  11.     a.push(x-i);
  12.     a.push(x-i);
  13. }
  14.  
  15. //wie oben nur zweidimensional
  16. a2 = [];
  17. for(i=0; i<x; i++){
  18.     a2.push([i, i]);
  19.     a2.push([x-i, x-i]);
  20. }
  21.  
  22. //bokel eindimensional
  23. t = getTimer();
  24. b = a.slice(0);
  25. for(i=0;i<loops; i++){
  26.     clipPolyX(b, xHalbe);   
  27. }
  28. trace(getTimer() - t);
  29.  
  30. //secp eindimensional
  31. t = getTimer();
  32. b = a.slice(0);
  33. for(i=0;i<loops; i++){
  34.     b.clipPolyX(xHalbe);   
  35. }
  36. trace(getTimer() - t);
  37.  
  38. //secp zweidimensional
  39. t = getTimer();
  40. b = a2.slice(0);
  41. for(i=0;i<loops; i++){
  42.     b.clipPolyX2(xHalbe);   
  43. }
  44. trace(getTimer() - t);

Arrays werden by reference übergeben.

mfg r.

Geändert von bokel (10-08-2002 um 13:06 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 10-08-2002, 14:55   #11 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
ja lol, welche funktoinen hast du da verwendet? mein 2. post sind die 2dimensionalen
secp ist offline   Mit Zitat antworten
Alt 10-08-2002, 15:34   #12 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
ja,
genau die habe ich benutzt

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 10-08-2002, 16:16   #13 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
acbso, dann muß ich mir dein funktionchen ma l genauer anschauen. Warum wird denn das schneller?
secp ist offline   Mit Zitat antworten
Alt 11-08-2002, 05:46   #14 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
hmm. ich hab das jetzt mal getestet. dabei ist mir wiedermal aufgefallen das das testen nichts bringt! hier mein test ergebnis:

Code:
//Polygon zeichen funktion, übernimmt ein geschlossenes Polygon
function draw(pol, color, alpha) {
        lineStyle(0,color,alpha);
        beginFill(color,alpha);
        moveTo(pol[0], pol[1]);
        for(i=2; i<pol.length;i+=2) {
                lineTo(pol[i], pol[i+1]);
        }
        endFill();
}
array.prototype.clipPolyX1Dim = function(wert) {
	var sh_pol = new Array();
	var np=-1;
	this.push(this[0]);
	this.push(this[1]);
	for( var i=2; i<this.length; i+=2) {
		if(this[i-2] >= wert) {
				sh_pol[++np]=this[i-2];
				sh_pol[++np]=this[i-1];
		 }
		if(( this[i-2] >= wert) != (this[i] >= wert) ) {
			sh_pol[++np] = wert;
			sh_pol[++np] = ((wert-this[i-2]) * ((this[i+1] - this[i-1]) / (this[i] - this[i-2]))) + this[i-1];
		}
	}
	return sh_pol;
}

//bokels
//gibt ein neues, geclipptes poly zurück.
function clipPolyX_bokel(poly, wert) {
        var sh_pol = new Array();
        var x1, y1, x2, y2;
        var a, j;
        
        poly.push(x1=poly[0]);
        poly.push(y1=poly[1]);
        
        j = poly.length-2;
        a = (x1 >= wert);
        
        while(j > 0){
                // koordinaten kommen umgekehrt
                y2 = poly[--j];
                x2 = poly[--j];
                //
                if (a) {
                        sh_pol.push(x1);
                        sh_pol.push(y1);
                }
                //
                //schnittpunkt berechnen
                if(a != (x2 >= wert)){
                        sh_pol.push(wert);
                        sh_pol.push((wert - x1) * (y2 - y1) / (x2 - x1) + y1);
                        a = !a;
                }
                //
                x1 = x2;
                y1 = y2;
        }
        return sh_pol;
}


//Das original polygon
orig_pol = new Array(0,-100,
                    100,100,
                   -100,100);
max = 50;
/// erster Aufruf immer schneller !!
t = getTimer();
for(i=0; i< max; i++) newPolmy = orig_pol.clipPolyX1Dim(0);
trace("1Dim : " + (getTimer() - t));

//zweiter immer langsamer!!
t = getTimer();
for(i=0; i< max; i++) newPol_bokel= clipPolyX_bokel(orig_pol, 0);
trace("bokels: " + (getTimer() - t));
hier kommt dann das raus:

1Dim : 271
bokels: 599


Allerdings wenn ich als erstes deine func ausführe ist deine schneller, und meine 3mal so langsan. Was soll das?
secp ist offline   Mit Zitat antworten
Alt 11-08-2002, 10:00   #15 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Möglicherweise liegt es daran, dass das originale Array
immer laenger wird, und meine Methode dann sozusagen
unter erschwerten Bedingungen ablaeuft.



Versuch es mal so:
(das Array wird jedesmal neu kopiert.)

ActionScript:
  1. //Das original polygon
  2. ar = new Array(0,-100,
  3.                     100,100,
  4.                    -100,100);
  5. max = 150;
  6. /// erster Aufruf immer schneller !!
  7. t = getTimer();
  8. orig_pol = ar.slice(0);
  9. for(i=0; i< max; i++) newPolmy = orig_pol.clipPolyX1Dim(0);
  10. trace("1Dim : " + (getTimer() - t));
  11.  
  12. //zweiter immer langsamer!!
  13. t = getTimer();
  14. orig_pol = ar.slice(0);
  15. for(i=0; i< max; i++) newPol_bokel= clipPolyX_bokel(orig_pol, 0);
  16. trace("bokels: " + (getTimer() - t));

mfg r.

Geändert von bokel (11-08-2002 um 10:35 Uhr)
bokel 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 15:46 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele