Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 18-01-2008, 08:48   #1 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
füll funktion, aussparungen verhindern?

hi,
wenn ich mit der drawing api einen pfad zeichne, mit dieser funktion hier, spart mir flash die stellen aus, an denen sich der pfad überschneidet. kann man das irgendwie unterdrücken, oder muss ich da eine extra verrechnungsmethode entwickeln?
PHP-Code:
stop();
this.createEmptyMovieClip("fuel",1);
function 
fillPath(wherewcolorwalphawxwypathway) {
    
trace("pathway "+where+" color "+wcolor+" alpha "+walpha+" x "+wx+" y "+wy+" path length "+pathway.length);
    
where.moveTo(wx,wy);
    
where.beginFill(wcolor,walpha);
    for (var 
0f<pathway.lengthf++) {
        
trace("F "+pathway[f][0]+" "+pathway[f][1]);
        
where.lineTo(pathway[f][0],pathway[f][1]);
    }
    
where.endFill();
}
meinarray = new Array();
meinarray[0] =new Array();
meinarray[0][0] = 10;
meinarray[0][1] = 10;
meinarray[1] =new Array();
meinarray[1][0] = 10;
meinarray[1][1] = 100;
meinarray[2] =new Array();
meinarray[2][0] = 100;
meinarray[2][1] = 100;
meinarray[3] =new Array();
meinarray[3][0] = 100;
meinarray[3][1] = 30;
meinarray[4] =new Array();
meinarray[4][0] = 0;
meinarray[4][1] = 30;
meinarray[5] =new Array();
meinarray[5][0] = 0;
meinarray[5][1] = 40;
meinarray[6] =new Array();
meinarray[6][0] = 90;
meinarray[6][1] = 40;
meinarray[7] =new Array();
meinarray[7][0] = 90;
meinarray[7][1] = 90;
meinarray[8] =new Array();
meinarray[8][0] = 20;
meinarray[8][1] = 90;
meinarray[9] =new Array();
meinarray[9][0] = 20;
meinarray[9][1] = 10;
meinarray[10] =new Array();
meinarray[10][0] = 10;
meinarray[10][1] = 10;
fillPath(_root.fuel,0xFFFFFF,100,0,0,meinarray); 
danke
echo
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 18-01-2008, 09:59   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.322
Code:
this.createEmptyMovieClip("fuel", 1);
function fillPath(where, wcolor, walpha, path) {
	where.lineStyle(0, 0);
	where.beginFill(wcolor, walpha);
	for (var f in path) {
		where[path[f][0] ? "lineTo" : "moveTo"](path[f][1], path[f][2]);
	}
	where.endFill();
}
_ary = new Array();
_ary.push([1, 10, 30]);
_ary.push([1, 0, 30]);
_ary.push([1, 0, 40]);
_ary.push([1, 10, 40]);
_ary.push([1, 10, 100]);
_ary.push([1, 100, 100]);
_ary.push([1, 100, 30]);
_ary.push([1, 20, 30]);
_ary.push([1, 20, 10]);
_ary.push([0, 10, 10]);
//
_ary.push([1, 90, 40]);
_ary.push([1, 90, 90]);
_ary.push([1, 20, 90]);
_ary.push([0, 20, 40]);
fillPath(_root.fuel, 0xFF0000, 100, _ary);
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (18-01-2008 um 10:00 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 18-01-2008, 10:39   #3 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
where[path[f][0] ? "lineTo" : "moveTo"](path[f][1], path[f][2]);

ok, das funktioniert, aber ich muss gestehen ich versteh den syntax nicht.

du zeichnest quasi eine zweite fläche als aussparung innerhalb der ersten?

where ist mein pfad, klar.
aber was kommt dann? was macht die 1 an der ersten stelle in den arrays?
was macht das fragezeichen? verknüpft das zwei sachen?
lineTo ist klar, und danach wird der zeiger gleich weiter bewegt nach den koordinaten?

problem an der sache ist, das ich das ding am stück zeichnen muss, da die endform durch die mausbewegung erzeugt wird. da kanns passieren das sich die wege kreuzen. ich wollte eigentlich vermeiden die formen dann herrauszurechnen...

danke nochmal...
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 18-01-2008, 11:08   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.322
das ?
naja, du bist doch nicht neu hier im forum. das mit dem ? ist schon 100.000 mal besprochen worden:
if (bedingen) ? dann mache dies : andernfalls das;

die flächen werden xor gefüllt. 1x == kein loch, 2x überschneiden == loch, 3x überschneiden == kein loch, 4x überschneiden == loch usw.
wenn du kein loch willst, dann darfst du halt keine überschneidung erzeugen.
wüsste nicht, wie man das in flash verhindern könnte.

andernfalls musst du die hüllkurve berechnen. mal im internet suchen nach:
2D-Polygon-Clipping-Algorithmen
http://es.informatik.uni-kl.de/publi...rsg/Bran03.pdf
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (18-01-2008 um 11:27 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 18-01-2008, 11:29   #5 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
hmm,ok danke dir. das mit dem fragezeichen ist mir noch nicht übern weg gelaufen. bzw, ich habs ab und an gesehn, aber solange man es nicht selbst braucht...

wird wohl dann auf eine hüllkurvenberechnung rauslaufen...

danke dir
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 18-01-2008, 21:15   #6 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
ok, das tuts auch, ist zwar dann keine füllform, aber irgendwie doch schon

http://www.actionscript.org/resource...API/Page1.html

was ich bei diesem beispiel allerdings nicht verstehe ist:
warum entsteht hier keine aussparung? einfach mal den code auf einen movieclip legen..

Code:
onClipEvent(load)
{
        _root.createEmptyMovieClip('square',0);
        function drawSquare()
        {
                bx = _root._xmouse;
                by = _root._ymouse;
                with(_root.square)
                {
                        //clear();
                        moveTo(bx-50,by-50);
                        beginFill(0x000088)
                        lineTo(bx+50,by-50);
                        lineTo(bx+50,by+50);
                        lineTo(bx-50,by+50);
                        endFill();
                }
        }
        //this.setMask (_root.square);
}
onClipEvent(mouseMove)
{
        drawSquare();
        updateAfterEvent();
}
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+

Geändert von echo5-7 (18-01-2008 um 21:18 Uhr)
echo5-7 ist offline   Mit Zitat antworten
Alt 19-01-2008, 08:27   #7 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.322
weil keine zusammenhängende fläche gemalt wird, sondern lauter einzelne rechtecke.

wenn du deine figur in lauter rechtecke zerlegst, dann geht das auch so. nur, wer zerlegt diese koordinaten in die gewünschte weisse?

du hast halt dein problem geschildert; aber nicht, was du machen möchtest. wie so oft kann man etwas auf viele unterschiedliche weissen lösen.

z.b. kommt mir deine figur sehr rasterförmig vor. also könnte man jedes rasterquadrat das angeklickt wurde färben.
genauso gut wäre eine lösung: das so lassen wie es ist (löcher werden ja auch benötigt?) und danach mit einem "füllwerkzeug" in die löscher klicken um sie zu füllen.


http://www.seibsprogrammladen.de/fra...ispiele/flash8
-> paint_delete
Eine Maske malen und wieder löschen (wie in flash6 möglich + flash8).
__________________
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 13:21 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele