Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-02-2012, 18:09   #1 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
Kurvenwindung feststellen, positiv oder negativ

Hi,

das hat zugegeben nichts mit Actionscript im speziellen zu tun, gehört aber eher in die Ecke der Programmierung.

Ich grübel mir grade einen ab, wie ich feststellen kann, ob eine Kurve die Richtung ändert. Sprich, erst ist sie linksherum gewunden und dann windet sie sich rechts herum.

Hat dazu irgendjemand ein Snippet, oder besser: eine Erklärung?

Danke
echo
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 07-02-2012, 18:18   #2 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
ein beispielbild findet ihr im anhang. Gelb sind die Normalen, Pink sind die um 180° gedrehten Normalen, und Hellgrau die Winkelhalbierenden.

Was ich möchte, ist die Winkelhalbierenden alle auf einer "Seite" der Kurve haben. Die Normalen sind ja schließlich auch da. Im Moment versuche ich noch per if-Abfrage das Problem zu lösen, aber das scheint mir wohl nicht der Weißheit letzter Schluss zu sein.
Angehängte Grafiken
Dateityp: jpg beispiel.jpg (70,0 KB, 13x aufgerufen)
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 07-02-2012, 18:26   #3 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
die ecken der strecke plus das ende deiner winkelhalbierenden sind drei punkte, das ergibt ein dreieck.

H.G.Seib
Flächenberechnung in der Ebene
Wenn die Punkte nicht 'rechts herum' durchnummeriert werden, dann wird der Flächeninhalt als Negativ ausgegeben.
Code:
// abc sind drei punkte
function fPoly_flaeche3Eck(a, b, c)
{ return (a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y))/2;
}
sinngemäss das selbe
http://www.seibsprogrammladen.de/fra.../Schnittpunkte
fGross:
Kreuzprodukt für 2D. Gibt -1 bzw. 1 zurück. je nachdem, ob die Fläche nach oben oder nach unten orientiert ist.
d.h. ob die Punkte links- oder rechtsherum durchnummeriert sind.
Code:
function fCross(a, b, c) {
 return ((a.x-b.x)*(a.y-c.y)-(a.y-b.y)*(a.x-c.x)<0) ? -1 : 1;
}
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (07-02-2012 um 18:30 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 07-02-2012, 20:05   #4 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
ok, ich kapiere was die funktionen machen, aber kann es sein, dass ich die punkte automatisch übergeben muss? dh. wenn ich die punkte willkürlich übergebe, dann kommt dabei was willkürliches raus?

ich muss das grade mal durchtesten.

edit: ok, funzt irgendwie kapier ich's immer noch nicht ganz, aber hauptsache es geht erstmal. danke dir!
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+

Geändert von echo5-7 (07-02-2012 um 20:39 Uhr)
echo5-7 ist offline   Mit Zitat antworten
Alt 07-02-2012, 20:37   #5 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
du gehst deinen linienzug kante für kante durch, da hast du punkt a und b
du berechnest wie jetzt auch deine mittelsenkrechte, das ende ist punkt c
jetzt fCross aufrufen.
ist der rückgabewert 1, dann die mittelsenkrechte in die andere richtung zeichnen.
ist der rückgabewert -1, dann zur nächsten kante.
nächste kante. das vorhergehende b ist jetzt punkt a, punkt b kommt neu dazu.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 07-02-2012, 20:49   #6 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
hmmmmm... ich habs jetzt mit dem flächeninhaltsdingens gelöst. und mir ist klar, dass es negativ werden muss, wenn was negatives dabei ist... aber das das funktioniert ist immer noch erstaunlich
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 07-02-2012, 21:01   #7 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
ja,
programmieren ist ein wunder
mathe ist ein wunder
das leben ist ein wunder

wen wunderts ;-)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 07-02-2012, 21:06   #8 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
^^
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 10-02-2012, 13:29   #9 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
ok, es gibt doch noch probleme, die mir aber nicht so ganz klar sind. im anhang ist ein bild des ausgeführten codes. es funktioniert soweit ganz gut, nur dass es ab und an zu einem unerwünschten flip kommt.

die funktion sieht so aus:

Code:
		private function schnittchen ():void {
			
			// Richtungsvektor von P2 aus
			var rv1 : Point = new Point();
			rv1.x = (p2.x - p1.x)*-1;
			rv1.y = (p2.y - p1.y)*-1;
			
			var rv2 : Point = new Point();
			rv2.x = (p2.x - p3.x)*-1;
			rv2.y = (p2.y - p3.y)*-1;
			
			// einheitsvektoren 
			var ev1:Point = new Point();
			ev1.x = (rv1.x / Math.sqrt(rv1.x * rv1.x + rv1.y * rv1.y)) ;
			ev1.y = (rv1.y / Math.sqrt(rv1.x * rv1.x + rv1.y * rv1.y)) ;
			
			var ev2:Point = new Point();
			ev2.x = (rv2.x / Math.sqrt(rv2.x * rv2.x + rv2.y * rv2.y)) ;
			ev2.y = (rv2.y / Math.sqrt(rv2.x * rv2.x + rv2.y * rv2.y)) ;
			
			// winkelhalbierende
			w = new Point();
			w.x = ev1.x + ev2.x;
			w.y = ev1.y + ev2.y;
			
			// normale und gegennormale auf w  
			var wn : Point = new Point();
			var cwn : Point = new Point();
			
			if (w.x != 0 && w.y != 0) {
				
				wn.x  = (radius / Math.sqrt(w.x * w.x   + w.y*w.y)) *  w.x ;
				wn.y  = (radius / Math.sqrt(w.x * w.x   + w.y*w.y)) *  w.y ;
				cwn.x  =  wn.x*-1;
				cwn.y  =  wn.y * -1;
				
			} else {
				
				w.x = (p1.y-p3.y) *-1 ;
				w.y = p1.x - p3.x ;				
				
				wn.x  = (radius / Math.sqrt(w.x * w.x   + w.y * w.y)) *  w.x ;
				wn.y  = (radius / Math.sqrt(w.x * w.x   + w.y * w.y)) *  w.y ;
				
				cwn.x  =  wn.x*-1;
				cwn.y  =  wn.y*-1;
				
			}
			
			// orientierung feststellen
			
			if (fPoly_flaeche3Eck(p3, p2, p1) <= 0 ) {
				
				trace("x poly: " + (fPoly_flaeche3Eck(p1, p2, p3) < 0?"" + fPoly_flaeche3Eck(p1, p2, p3):" " + fPoly_flaeche3Eck(p1, p2, p3)) +" w " + w.x + "/" + w.y + " wn: " + wn.x + "/" + wn.y + " cwn: " + cwn.x + "/" + cwn.y );
				
				canvas.graphics.lineStyle(1, 0xCC0000, 1);
				canvas.graphics.moveTo( p2.x + wn.x,  p2.y + wn.y);
				canvas.graphics.lineTo( p2.x , p2.y );
				canvas.graphics.lineStyle(1, 0x00CC00, 1);
				canvas.graphics.lineTo( p2.x + cwn.x, p2.y + cwn.y);
				
			} else {
				
				trace("x poly: " + (fPoly_flaeche3Eck(p1, p2, p3) < 0?"" + fPoly_flaeche3Eck(p1, p2, p3):" " + fPoly_flaeche3Eck(p1, p2, p3)) +" w " + w.x + "/" + w.y + " wn: " + wn.x + "/" + wn.y + " cwn: " + cwn.x + "/" + cwn.y );
				
				canvas.graphics.lineStyle(1, 0xCC0000, 1);
				canvas.graphics.moveTo(p2.x + cwn.x,  p2.y + cwn.y);
				canvas.graphics.lineTo(p2.x , p2.y );
				canvas.graphics.lineStyle(1, 0x00CC00, 1);
				canvas.graphics.lineTo(p2.x + wn.x, p2.y + wn.y);	
				
			}
		}
in den anhang habe ich alle klassen gepackt, so dass man das auch ausprobieren kann.

was mir aufgefallen ist:

jedesmal wenn die orientierung/fläche des dreiecks = 0 ist, kommt es zum flip. woran kann das jetzt liegen?

danke
echo
Angehängte Grafiken
Dateityp: jpg beispiel2.jpg (101,8 KB, 9x aufgerufen)
Angehängte Dateien
Dateityp: zip dingens.zip (4,3 KB, 4x aufgerufen)
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 ist offline   Mit Zitat antworten
Alt 10-02-2012, 14:57   #10 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
ich gucke mal nach. kann allerdings etwas dauern, ist ja ne menge script.

und wieso hast du flächen mit 0 ??? das kann es garnicht geben. dann sind 2 punkte identisch somit gibt es garkeine linie auf deren hälfte du das lot setzt.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 10-02-2012, 15:28   #11 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
danke dir

das ist die frage, eigentlich sollte es diese flächen mit 0 nicht geben. ich kann mir nur vorstellen, dass die 3 punkte in einer reihe liegen und dadurch dann eine 0 zustande kommt.... was irgendwie auch das problem erklären würde... sekunde, ich guck nochmal nach.


edit: das problem liegt eigentlich nur in der Main.as... alles andere ist Beiwerk und funktioniert so wie es soll.

ich hab grade noch mal geguckt, wenn ich ne abfrage für die fläche 0 in diesen schnipsel mit einbaue, drehts mir zwar alles um, aber das zumindestens konstant ^^

if (w.x != 0 && w.y != 0
nach
if (w.x != 0 && w.y != 0 && fPoly_flaeche3Eck(p3, p2, p1) != 0

edit2: wer lesen kann ich klar im vorteil, hast du ja schon geschrieben
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+

Geändert von echo5-7 (10-02-2012 um 15:50 Uhr)
echo5-7 ist offline   Mit Zitat antworten
Alt 10-02-2012, 17:38   #12 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.866
dürfte ich wohl deinen Code etwas zusammenfassen?

PHP-Code:
//1:
var rv1 Point p1.subtract(p2);
var 
rv2 Point p2.subtract(p3);
var 
ev1:Point rv1.clone();
    
ev1.normalize();
    
var 
ev2:Point rv2.clone();
    
ev2.normalize();

= new Point(ev1.ev2.xev1.ev2.y);

// normale und gegennormale auf w  
var wn Point w.clone();
    
wn.normalize(radius);
var 
cwn Point = new Point(-wn.x, -wn.y);
//... 
PHP-Code:
//2:
ev1+ev2         //ev1.length = ev2.length = 1 => w.length = 2
p1-p2 p2-p3    //todo normalize to length=2
p1-p3            //...
*= 2/w.length;

//wn = w rotated by 90° and normalized to a length of "radius"
wn.w.y;
wn.= -w.x;
wn *= radius/wn.length;
cwn = -wn
PHP-Code:
//3 (final):
private function schnittchen ():void {
    var 
wn:Point = new Point(p1.y-p3.yp3.x-p1.x);
        
wn.normalize(radius);
    
canvas.graphics.lineStyle(10xCC00001);
    
canvas.graphics.moveTop2.wn.x,  p2.wn.y);
    
canvas.graphics.lineTop2.xp2.);
    
canvas.graphics.lineStyle(10x00CC001);
    
canvas.graphics.lineTop2.wn.xp2.wn.y);

__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Alt 10-02-2012, 19:09   #13 (permalink)
°
 
Benutzerbild von echo5-7
 
Registriert seit: Aug 2002
Ort: Baden-Baden
Beiträge: 3.962
oha, danke schön was für ein service
__________________

LRRM | BLOG | FACEBOOK | TWITTER | G+
echo5-7 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zahl Positiv oder Negativ moreloga Flash MX 1 09-07-2004 10:43
Negativ&Positiv machen in einem MacEvil ActionScript 1 10 29-01-2004 12:12
negativ zu positiv! T.A. ActionScript 1 14 18-10-2003 14:14
positiv negativ knuddel_muddel ActionScript 1 5 02-09-2003 10:58
loop mit negativ und positiv-wert b-fender ActionScript 1 6 21-01-2002 19:11


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele