mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 26.04.2024 01:34 Benutzername: Passwort: Auto-Login

Thema: Flash: Schnittpunt von 2 oder mehreren Linien vom 16.03.2007


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Multimedia -> Flash: Schnittpunt von 2 oder mehreren Linien
Autor Nachricht
superboy250
Threadersteller

Dabei seit: 03.12.2006
Ort: Hardheim
Alter: -
Geschlecht: Männlich
Verfasst Fr 16.03.2007 15:51
Titel

Flash: Schnittpunt von 2 oder mehreren Linien

Antworten mit Zitat Zum Seitenanfang

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? Hä?


Danke im Vorraus.

Sina
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
tacker

Dabei seit: 22.03.2002
Ort: Trondheim, Norwegen
Alter: 43
Geschlecht: Männlich
Verfasst Fr 16.03.2007 16:26
Titel

Antworten mit Zitat Zum Seitenanfang

Hierbei ist hitTest() hilfreich.
Einfach alle Objekte mit allen Objekten auf Hits testen.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
therapiekind

Dabei seit: 14.03.2006
Ort: In deinem Kopf
Alter: -
Geschlecht: -
Verfasst So 18.03.2007 17:31
Titel

Antworten mit Zitat Zum Seitenanfang

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.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
superboy250
Threadersteller

Dabei seit: 03.12.2006
Ort: Hardheim
Alter: -
Geschlecht: Männlich
Verfasst Mo 19.03.2007 16:51
Titel

Antworten mit Zitat Zum Seitenanfang

erstmal danke, dass du dir so viel mühe gemacht hast *Thumbs up!* Lächel

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
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
therapiekind

Dabei seit: 14.03.2006
Ort: In deinem Kopf
Alter: -
Geschlecht: -
Verfasst Mo 19.03.2007 20:45
Titel

Antworten mit Zitat Zum Seitenanfang

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.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ä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
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Multimedia


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.