1&1 Webhosting
Flashhilfe.de - Flash Community

kreis per script zeichnen [Flash MX]

Forum > Flash Entwicklung > kreis per script zeichnen

 


AntwortenRegistrieren Seite1  

 18.05.2003, 18:42 
Beiträge: 38
Registriert: Jan 2003

kreis per script zeichnen
hallo,

es geht um folgende Problematik. Ich möchte einen Kreis dynamisch erzeugen und habe dafür derzeit folgendes Script.
ActionScript:
1
2
3
4
5
      moveTo( lineX, lineY+circle_r );
      curveTo( lineX+circle_r, lineY+circle_r, lineX+circle_r, lineY );
      curveTo( lineX+circle_r, lineY-circle_r, lineX, lineY-circle_r );
      curveTo( lineX-circle_r, lineY-circle_r, lineX-circle_r, lineY );
      curveTo( lineX-circle_r, lineY+circle_r, lineX, lineY+circle_r );


lineX und lineY sind meine Startpunkte. Aus den vier Kurven soll dann ein Kreis entstehen. Das funktioniert auch prinzipiell, nur sieht das Ding eher aus wie ein abgerundetes Viereck denn ein Kreis. Gibt es eine einfache Lösung für die Konstruktion eines wirklichen Kreises?

regards __ deviation _
regards __ deviation _
 18.05.2003, 20:01Re1
Benutzerbild von dietrich
Beiträge: 1372
Wohnort: dortmund
Registriert: Jan 2003

Hi,

na ja ob's einfacher ist weiß ich nicht. Hat halt was mit Mathematik zu tun:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var x = 200;
var y = 200;
var r = 50;
var angle = 0;
var winkel = (45/180)*Math.PI;
var ctrlR = r/Math.cos(winkel/2);

_root.lineStyle(1);
_root.moveTo(x+r, y);

for ( i = 0; i<8; i++ )
{
  angle += winkel;
  angleCen = angle-(winkel/2);
  cx = x+Math.cos(angleCen)*(ctrlR);
  cy = y+Math.sin(angleCen)*(ctrlR);
  px = x+Math.cos(angle)*r;
  py = y+Math.sin(angle)*r;
  _root.curveTo(cx, cy, px, py);
}




;-) 
-----------------------------
http://www.jdsolutions.de
;-) 
-----------------------------
http://www.jdsolutions.de
Geändert von dietrich am 20.05.03 um 22:11 Uhr

 11.07.2003, 12:31Re2
Beiträge: 3
Registriert: Jul 2003

Ich hab's mal ein wenig verändert - so kann man bestimmen, bei welchem Winkel das Zeichnen des Kreises beiginnt.
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var x = 200;
var y = 200;
var r = 50;
var angle = (0/180)*Math.PI;
var winkel = (45/180)*Math.PI;
var ctrlR = r/Math.cos(winkel/2);

_root.lineStyle(1);
_root.moveTo(x+Math.cos(angle)*r, y+Math.sin(angle)*r);

for ( i = 1; i<8; i++ )
{
  angle += winkel;
  angleCen = angle-(winkel/2);
  cx = x+Math.cos(angleCen)*(ctrlR);
  cy = y+Math.sin(angleCen)*(ctrlR);
  px = x+Math.cos(angle)*r;
  py = y+Math.sin(angle)*r;
  _root.curveTo(cx, cy, px, py);
}

Geändert von toaotc am 11.07.03 um 12:39 Uhr

 
nicht sichtbar bei eingeloggten Mitgliedern
 12.03.2007, 22:11Re3
Beiträge: 4
Registriert: Mar 2007

Hallo Leute

Ich würde das obige Skript gerne verstehen. Erstens bin ich mir nicht sicher, ob ich die Funktion "curveTo" richtig verstehe. Diese verbindet doch einen Ausgangspunkt über eine Kurve mit einem neuen Ankerpunkt, der danach automatisch als neuer Ausgangspunkt gesetzt wird. Welche Rolle (geometrisch betrachtet) spielt dabei der Steuerungspunkt?

Auf das obige Skript angewendet: Was bedeutet folgender Code bzw. was geschieht da genau?

ActionScript:
1
2
cx = x+Math.cos(angleCen)*(ctrlR);
cy = y+Math.sin(angleCen)*(ctrlR);


"ctrlR" ist meines Erachtens einfach ein um den Faktor cos (PI/8) verkürzer Radius. Wozu braucht es diese Verkürzung zur Definition des Steuerungspunktes?

Über Hilfe bin ich enorm dankbar.

Mit freundlichen Grüssen

David

 12.03.2007, 22:34Re4
Beiträge: 604
Registriert: Jan 2007

Das ist der Sekans, also die Umkehrfunktion von Cosinus sec(alpha)=1/cos(alpha), das Ganze liegt dann ausserhalb des Kreises, den brauchst du für curveTo, weil es sich bei dem Kreisbogen um eine quadratische Bezierkurve handelt und die braucht einen ControlPunkt(x, y) und 2 weitere Punkte am Anfang und am Ende, deshalb ctrlR=radius*1/cos(winkel/2)=radius/cos(winkel/2).
Punkt1=moveTo(ax, ay), Controlpunkt=(cx, cy), Punkt2=curveTo(bx, by), die Bezierkurve fängt bei Punkt1 an berücksichtigt den Controlpunkt und endet bei Punkt2 und das ergibt ein Kreisbogen dann. ;)

1.Ich würde es so machen.
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var x = 200;
var y = 200;
var radius = 50;
var segmente = 10;
// alpha in Bogenmaß
var alpha = 360 / segmente / 180 * Math.PI;
var ctrlR = radius / Math.cos(alpha / 2);
var winkel = 0;
_root.lineStyle(1, 0, 100);
_root.moveTo(x + radius, y);
for (i = 0; i < segmente; i++)
{
   winkel += alpha;
   winkelHalb = winkel - alpha / 2;
   cx = x + Math.cos(winkelHalb) * ctrlR;
   cy = y + Math.sin(winkelHalb) * ctrlR;
   px = x + Math.cos(winkel) * radius;
   py = y + Math.sin(winkel) * radius;
   _root.curveTo(cx, cy, px, py);
}


mfg
jill
Geändert von jill am 12.03.07 um 22:58 Uhr

 12.03.2007, 23:17Re5
Beiträge: 4
Registriert: Mar 2007

Traumhaft, danke! Jetzt ist es mir schon einiges klarer, auch wenn ich noch nicht alles hundert Prozent durchschaut habe, aber fast! Danke!

Gibt es eine einfach Möglichkeit, die Segmente sichtbar zu machen, indem der Mittelpunkt mit den Anfangs- bzw. Endpunkten der Segmente verbunden wird, und zwar dynamisch (d.h. in Abhängigkeit der Anzahl Segmente)?

Danke nochmals für die schnelle Antwort. Macht richtig Spass hier! ;)

David

 
nicht sichtbar bei eingeloggten Mitgliedern
 12.03.2007, 23:25Re6
Beiträge: 3450
Registriert: Jul 2002

ActionScript:
1
2
3
4
5
6
7
8
9
10
MovieClip.prototype._kreis = function(pobj, ptiefe, pX, pY, pDicke, pFarbe, pDeck) {
   this.createEmptyMovieClip(pobj,ptiefe);
   this[pobj]._x = pX;
   this[pobj]._y = pY;
   this[pobj].lineStyle(pDicke, pFarbe, pDeck);
   this[pobj].lineTo(0, 0.15);
};


this._kreis("meinkreis_mc",1,100,100,100,0xff0000,100);



-----------
Ahoi Linus



---------------------------
LinUS - Flashhilfe Team
---------------------------
 12.03.2007, 23:34Re7
Beiträge: 604
Registriert: Jan 2007

Du meinst sowas?

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (i = 0; i < segmente; i++)
{
   winkel += alpha;
   winkelHalb = winkel - alpha / 2;
   cx = x + Math.cos(winkelHalb) * ctrlR;
   cy = y + Math.sin(winkelHalb) * ctrlR;
   px = x + Math.cos(winkel) * radius;
   py = y + Math.sin(winkel) * radius;
   lastX = px;
   lastY = py;
   _root.curveTo(cx, cy, px, py);
   _root.lineTo(x, y);
   _root.moveTo(lastX, lastY);
}


mfg
jill

 12.03.2007, 23:52Re8
Beiträge: 4
Registriert: Mar 2007

Genau, in der Art! Super! Ich habe mein Anliegen jetzt mal so gelöst:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var x = 0;
var y = 0;
var radius = 100;
var segmente = 12; //hier Anzahl Kreissektoren eingeben
// alpha in Bogenmaß
var alpha = 360 / segmente / 180 * Math.PI;
var ctrlR = radius / Math.cos(alpha / 2);
var winkel = 0;
_root.lineStyle(1, 0, 100);
_root.beginFill(0x00FF00, 60);
_root.moveTo(x, y);
_root.lineTo(x + radius, y);
for (i = 0; i < segmente/segmente; i++) //für die Darstellung von mehreren Kreissektoren Bedingung ändern
{
    winkel += alpha;
    winkelHalb = winkel - alpha / 2;
     cx = x + Math.cos(winkelHalb) * ctrlR;
    cy = y + Math.sin(winkelHalb) * ctrlR;
    px = x + Math.cos(winkel) * radius;
    py = y + Math.sin(winkel) * radius;
    _root.curveTo(cx, cy, px, py);
}
_root.lineTo(x, y);
_root.endFill;


Jetzt möchte ich gerne ein solches Kreissegment als sensitive Fläche für einen Button verwenden. Ich habe gedacht, dass ich dazu die Segmente als MovieClips in einen anderen Movie lade. Ginge das? Oder kann man eine Buttonfläche auch mathematisch definieren?

Vielen Dank.

David

 13.03.2007, 00:36Re9
Beiträge: 604
Registriert: Jan 2007

Vielleicht so oder so ähnlich.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var clip = this.createEmptyMovieClip("clip" + i, i + 1000);
with (this["clip" + i])
{
   clipW = winkel - alpha;
   clipWH = clipW - alpha / 2;
   cpx = x + Math.cos(clipW) * radius;
   cpy = y + Math.sin(clipW) * radius;
   lineStyle(1, 0, 60);
   beginFill(0x00FF00, 60);
   moveTo(x, y);
   lineTo(cpx, cpy);
   curveTo(cx, cy, px, py);
   this["clip" + i].onRollOver = function()
   {
      trace("--> " + this);
   };
   endFill();
}


mfg
jill

 13.03.2007, 11:39Re10
Beiträge: 4
Registriert: Mar 2007

Ja, das kommt schon in die Nähe. Nur würde ich das Script gerne besser verstehen, damit ich auch damit arbeiten kann. Könntest Du es mir erklären? Ich habe Fragen zum Teil ins Script geschrieben, das ich momentan so zusammengebastelt habe:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
var x = 0;//x-Ursprung
var y = 0;//y-Ursprung
var radius = 100;//Kreisradius
var segmente = 8; //Anzahl Kreissektoren
var segmente_voll = 5//Anzahl voller Kreisssektoren

var alpha = 360 / segmente / 180 * Math.PI;//alpha im Bogenmass
var ctrlR = radius / Math.cos(alpha / 2);//Radius für Kontrollpunkt
var winkel = (1/180) * Math.PI * 0;//Anfangswinkel im Bogenmass (muss im Moment noch Null sein -> warum?)

_root.lineStyle(1, 0, 100);
_root.beginFill(0x00FF00, 60);
_root.moveTo(x, y);
_root.lineTo(x + radius, y);
for (i = 0; i < segmente_voll; i++)
{
    winkel += alpha;
    winkelHalb = winkel - alpha / 2;
     cx = x + Math.cos(winkelHalb) * ctrlR;
    cy = y + Math.sin(winkelHalb) * ctrlR;
    px = x + Math.cos(winkel) * radius;
    py = y + Math.sin(winkel) * radius;
    _root.curveTo(cx, cy, px, py);
}
_root.lineTo(x, y);
_root.endFill;

var clip = this.createEmptyMovieClip("clip" + i, i + 1000);//verstehe die ganze Funktion nicht -> wozu die "i" und "1000"?
with (this["clip" + i])//was geschieht hier?
{
    clipW = winkel - alpha;//den folgenden Teil verstehe ich einigermassen, nur:
    clipWH = clipW - alpha / 2;//clipWH wird später gar nicht verwendet -> wozu clipWH?
    cpx = x + Math.cos(clipW) * radius;
    cpy = y + Math.sin(clipW) * radius;
    lineStyle(1, 0, 50);
    beginFill(0x000000, 50);
    moveTo(x, y);
    lineTo(cpx, cpy);
    curveTo(cx, cy, px, py);
    this["clip" + i].onRelease = function()//ich verstehe, was hier bewirkt wird, jedoch nicht, wie? was ist die Idee?
    {
        trace("--> " + this);
    };
    endFill();
}


Danke für die Hilfe!

David

 13.03.2007, 14:48Re11
Beiträge: 604
Registriert: Jan 2007

Das müsste aber so aussehen, oder?

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Das ist der Mittelpunkt des Kreises auf der Bühne
var x = 0;//x-Ursprung
var y = 0;//y-Ursprung
var radius = 100;//Kreisradius
// Genau, das sind Kreissektoren und keine Kreissegmente
var segmente = 8; //Anzahl Kreissektoren
// was meinst du damit volle Kreissektoren?
// Du hast 8 davon mit einem Winkel von 45°, damit du einen vollen Kreis hast
// 360° / 8 = 45°;
var segmente_voll = 5;//Anzahl voller Kreisssektoren
// Bogenmaß von alpha = 0.78539..... bzw. Math.PI / 4
// wenn du 10 sektoren hast, dann ist der Winkel von einem davon 360° / 10 = 36°
// Bogenmaß wäre das alpha = 0.62831....
var alpha = 360 / segmente / 180 * Math.PI;//alpha im Bogenmass
// das ist Sekans von halbe alpha * radius
var ctrlR = radius / Math.cos(alpha / 2);//Radius für Kontrollpunkt
// das muss nicht 0 sein, kann auch (-1 * alpha) sein z.B. bzw. (2 * Math.PI - alpha)
// wenn winkel 0 ist, dann fängt der erste im Uhrzeigersinn bei 0° so gesehen an
// also bei der Ziffer 3 auf der Uhr
var winkel = (1/180) * Math.PI * 0;//Anfangswinkel im Bogenmass (muss im Moment noch Null sein -> warum?)
/*
das brauchst du jetzt nicht mehr

_root.lineStyle(1, 0, 100);
_root.beginFill(0x00FF00, 60);
_root.moveTo(x, y);
_root.lineTo(x + radius, y);
*/

for (i = 0; i < segmente; i++)
{
    winkel += alpha;
    winkelHalb = winkel - alpha / 2;
    cx = x + Math.cos(winkelHalb) * ctrlR;
    cy = y + Math.sin(winkelHalb) * ctrlR;
    px = x + Math.cos(winkel) * radius;
    py = y + Math.sin(winkel) * radius;
   // das ist die Tiefe (i +1000), du kannst auch i oder i + 100 machen...
   // einfach ein MovieClip
   // Hilfe--> createEmptyMovieClip nachlesen. ;)
   var clip = this.createEmptyMovieClip("clip" + i, i + 1000);//verstehe die ganze Funktion nicht -> wozu die "i" und "1000"?
   // Hier spart man sich den Namen clip immer wieder einzugeben
   // clip.lineTo(a, b)
   // clip.curveTo(v, u, p, q);
   // etc....
   // Hilfe--> (with) nachschauen
   with (clip)//was geschieht hier?
   {
      // Ich ziehe einfach von dem Winkel nochmal alpha ab
      // damit ich die erste Linie zeichnen kann
      clipW = winkel - alpha;//den folgenden Teil verstehe ich einigermassen, nur:
      // Ja, das braucht man nicht, weg damit
      clipWH = clipW - alpha / 2;//clipWH wird später gar nicht verwendet -> wozu clipWH?
      cpx = x + Math.cos(clipW) * radius;
      cpy = y + Math.sin(clipW) * radius;
      lineStyle(1, 0, 50);
      beginFill(0x000000, 50);
      moveTo(x, y);
      lineTo(cpx, cpy);
      curveTo(cx, cy, px, py);
      // Du wolltest doch Buttons haben...
      // das wäre jetzt einer.
      // da bekommt jeder Button seine Buttonfunktion, sonst müsste man alle einzel
      // ausserhalb der for-schleife machen und das muss nicht sein, das ist die Idee
      // Hilfe--> Button, onRelease, onPress etc.. nachschauen
      clip.onRelease = function()//ich verstehe, was hier bewirkt wird, jedoch nicht, wie? was ist die Idee?
      {
         trace("--> " + this);
         // Kreissektor 2 z.B. mach irgendwas beim Loslassen der maustaste
      };
      /*
      Hoffe, man hat es einigermaßen verstanden. ;)
      */

      endFill();
   }
    // _root.curveTo(cx, cy, px, py);
}
// _root.lineTo(x, y);
// _root.endFill;


mfg
jill

 
Themen
Ähnliche Beiträge zum Thema
Mauszeiger als Bild [Flash 10] 07.07.2010 - zappix
Zugriff auf Sprites [Flash 10] 23.12.2010 - jenny88
 

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.
Partner Webseiten: DesignerInAction.de   Designnation.de   Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   PSD-Tutorials.de   Tutorials.de

Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2012 Sebastian Wichmann - Flashhilfe.de