Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
superboy250
Threadersteller
Dabei seit: 03.12.2006
Ort: Hardheim
Alter: -
Geschlecht:
|
Verfasst Fr 16.03.2007 15:51
Titel Flash: Schnittpunt von 2 oder mehreren Linien |
|
|
Hallo.
Ich möchte in flash (Script) feststellen, ob sich zwei linien schneiden.
Ich habe folgendes Prog. Ich erzeuge 10 zufällige linien im raum, und möchte wissen wieviele Schnittpunkten da sind.
kann mir bitte jemand weiter helfen?
Danke im Vorraus.
Sina
|
|
|
|
|
tacker
Dabei seit: 22.03.2002
Ort: Trondheim, Norwegen
Alter: 43
Geschlecht:
|
Verfasst Fr 16.03.2007 16:26
Titel
|
|
|
Hierbei ist hitTest() hilfreich.
Einfach alle Objekte mit allen Objekten auf Hits testen.
|
|
|
|
|
Anzeige
|
|
|
therapiekind
Dabei seit: 14.03.2006
Ort: In deinem Kopf
Alter: -
Geschlecht: -
|
Verfasst So 18.03.2007 17:31
Titel
|
|
|
hitTest() wird hier kaum hilfreich sein, da es entweder nur Punkt/Fläche oder auf Überlappen der sog. "Bounding Box" zweier Movieclips testen kann.
Nach ein wenig Tüfteln habsch die Funktion hier zusammengeschustert:
Code: | function checkIntersection(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y)
{
var intersect;
var am = (a2y - a1y) / (a2x - a1x);
var bm = (b2y - b1y) / (b2x - b1x);
var ab = a1y - am * a1x;
var bb = b1y - bm * b1x;
// Beide Linien unendliche Steigung (parallel zu y-Achse) und liegen aufeinander (unendlich viele Schnittpunkte)
if((am == Number.POSITIVE_INFINITY || am == Number.NEGATIVE_INFINITY) &&
(bm == Number.POSITIVE_INFINITY || bm == Number.NEGATIVE_INFINITY) &&
a1x == b1x)
{
intersect = "infinite";
}
// Beide Linien unendliche Steigung (parallel zu y-Achse) und liegen NICHT aufeinander (kein Schnittpunkt)
else if((am == Number.POSITIVE_INFINITY || am == Number.NEGATIVE_INFINITY) &&
(bm == Number.POSITIVE_INFINITY || bm == Number.NEGATIVE_INFINITY) &&
a1x != b1x)
{
intersect = "none";
}
// Beide Linien keine Steigung (parallel zu x-Achse) und liegen aufeinander (unendlich viele Schnittpunkte)
else if(am == 0 && bm == 0 && a1y == b1y)
{
intersect = "infinite";
}
// Beide Linien keine Steigung (parallel zu x-Achse) und liegen NICHT aufeinander (kein Schnittpunkt)
else if(am == 0 && bm == 0 && a1y != b1y)
{
intersect = "none";
}
// Linie 1 unendliche Steigung
else if(am == Number.POSITIVE_INFINITY || am == Number.NEGATIVE_INFINITY)
{
var ix = a1x;
var iy = bm * ix + bb;
intersect = "one";
}
// Linie 2 unendliche Steigung
else if(bm == Number.POSITIVE_INFINITY || bm == Number.NEGATIVE_INFINITY)
{
var ix = b1x;
var iy = am * ix + ab;
intersect = "one";
}
// Normalfall, beide Linien mit nicht unendlicher aber vorhander Steigung
else
{
var ix = (ab + bb * -1) / (am * -1 + bm);
var iy = am * ix + ab;
intersect = "one";
}
// Nur für Strecken: Schneiden die beiden Strecken sich überhaupt?
var ta = (ix - a1x) / (a2x - a1x);
var tb = (ix - b1x) / (b2x - b1x);
if (!((ta >= 0 && ta <= 1) && (tb >= 0 && tb <= 1)) || isNaN(ta) || isNaN(tb))
{
intersect = "none";
}
switch(intersect)
{
case "none":
trace("Kein Schnittpunkt");
break;
case "infinite":
trace("Unendlich viele Schnittpunkte");
break;
case "one":
trace("Schnittpunkt bei " + "x:" + ix + " y:" + iy);
break;
default:
trace("Schnittpunkt bei " + "x:" + ix + " y:" + iy);
break;
}
} |
Die Funktion nimmt als Parameter die Start- und Endpunkte zweier Strecken (bzw. Geraden) auf und gibt verschiedene Werte zurück. Die kannst du im switch-Statement anpassen, je nachdem, was du als Ausgabe brauchst.
Im Moment testet Sie auf Strecken; willst du auf Geraden testen, nimm einfach den entsprechenden Code raus.
Proof of Concept basierend auf dieser Funktion findet man hier: http://typeofundefined.com/stuff/lineintersection.swf
Einfach die Strecken an den Endpunkten ziehen und gucken.
Letzte Anmerkung: Ich bin kein Matheguru und ebenso kein Programmierguru, ob die Funktion wirklich astrein funktioniert, kann ich nicht sagen, und ob sie perfomant ist ... keine Ahnung, gibt bestimmt schnellere und kürzere Wege.
|
|
|
|
|
superboy250
Threadersteller
Dabei seit: 03.12.2006
Ort: Hardheim
Alter: -
Geschlecht:
|
Verfasst Mo 19.03.2007 16:51
Titel
|
|
|
erstmal danke, dass du dir so viel mühe gemacht hast
aber kannst du mir bitte sagen, wo hier die linien sind???
oder ambesten alles kommentiern (zu mindest die deklaration deiner Variablen)
nochmal danke
sind das die koordinaten der linien?
a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y
Zuletzt bearbeitet von superboy250 am Mo 19.03.2007 16:54, insgesamt 1-mal bearbeitet
|
|
|
|
|
therapiekind
Dabei seit: 14.03.2006
Ort: In deinem Kopf
Alter: -
Geschlecht: -
|
Verfasst Mo 19.03.2007 20:45
Titel
|
|
|
superboy250 hat geschrieben: | sind das die koordinaten der linien?
a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y |
Genau:
- a1x/a1y = 1. Punkt 1. Linie
- a2x/a2y = 2. Punkt 1. Linie
- b1x/b1y = 1. Punkt 2. Linie
- b2x/b2y = 2. Punkt 2. Linie
Mit der Funktion kannst du zwei Strecken auf einen Schnittpunkt testen. Also damit einfach alle Linien miteinander testen.
|
|
|
|
|
|
|
|
Ähnliche Themen |
[Flash] Navigationsschaltflächen in mehreren Szenen
[Flash CS3 & AS2] Preloader mit mehreren SWF-Dateien
[Flash] dynamisches Textfeld mit mehreren Schriftarten?
[Flash] Haare/Linien animieren
Flash: Glühende Linien im Hintergrund
Not-Selector mit mehreren IDs in CSS
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|