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?
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.
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.
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.