schnittpunkt zweier strecken....

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
Skyhawk
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 77
Registriert: 27.04.2004, 19:40
Kontaktdaten:

schnittpunkt zweier strecken....

Beitrag von Skyhawk »

Hi

ich versuche die koordinaten des schnittpunktes zweier strecken herauszufinden.

Mein Rechenweg schaut folgendermaßen aus:

(x1,y1) und (x2,y2) die Anfangs- und Endpunkte deiner ersten Strecke
(x3,y3) und (x4,y4) die Anfangs- und Endpunkte deiner zweiten Strecken

m1 = (x1-x2)/(y1-y2)
m2 = (y3-y4)/(x3-x4)

x = (m1 * (m2*x4 - y4 + y2) - x2) / (m1*m2 - 1)
y = m2 * (x-x4) + y4


irgendwie haut das aber nicht hin... ags macht die dollsten sachen :wink:


vielleicht hat einer ne idee wie es einfacher geht?
Zuletzt geändert von Skyhawk am 07.11.2005, 19:24, insgesamt 1-mal geändert.
je älter ich werde, desto weniger verstehe ich....

http://www.tafkasomm.de
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Code: Alles auswählen

int xs;
int ys;

function schnittpunkt(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) {

  float m1;
  int t1;
  float m2;
  int t2;

  if (x1==x2) {   // 1. Strecke keine Funktion (m=unendlich)
    if (x3==x4) {   // 2. Strecke keine Funktion
      if (x1==x3) {
        // Strecken liegen in einer Geraden
        return false;
      }
      else {
        // Strecken haben keinen Schnittpunkt (sind parallel)
        return false;
      }
    }
    else {
      m2=IntToFloat(y3-y4)/IntToFloat(x3-x4);
      t2=y3-FloatToInt(m2*IntToFloat(x3));
      xs=x1;
      ys=FloatToInt(IntToFloat(xs)*m2)+t2;
    }
  }
  else {
    if (x3==x4) {
      m1=IntToFloat(y1-y2)/IntToFloat(x1-x2);
      t1=y1-FloatToInt(m1*IntToFloat(x1));
      xs=x3;
      ys=FloatToInt(IntToFloat(xs)*m1)+t1;
    }
    else {
      m1=IntToFloat(y1-y2)/IntToFloat(x1-x2);
      t1=y1-FloatToInt(m1*IntToFloat(x1));
      m2=IntToFloat(y3-y4)/IntToFloat(x3-x4);
      t2=y3-FloatToInt(m2*IntToFloat(x3));
      if (m1==m2) {   // gleiche Steigung, heikel, da m1, m2 floats (siehe hilfedatei)
                      // evtl. workaround: if (FloatToInt(m1*1000)==FloatToInt(m2*1000))
        if (t1==t2) {   // gleicher y-Abschnitt
          // Strecken liegen in einer Geraden
          return 0;
        }
        else {
          // Strecken sind parallel
          return 0;
        }
      }
      xs=FloatToInt(IntToFloat(t2-t1)/(m1-m2));
      ys=FloatToInt(IntToFloat(xs)*m2)+t2;
    }
  }
  return true;
}
Verwendung:

Code: Alles auswählen

if (schnittpunkt(...)) {
  code, der xs und ys verwendet;
}
Use gopher repellent on funny little man
Benutzeravatar
Skyhawk
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 77
Registriert: 27.04.2004, 19:40
Kontaktdaten:

Beitrag von Skyhawk »

@khrismuc

bis auf die vorunterscheidungen ist das der gleiche rechenweg...


der produziert die lustigsten sachen ;)


vielleicht gehts ja komplett anders?

ich habe zwei scheinwerfer, die einen spot werfen...
nur haben mit raw gezeichnete sachen keine tranzparenz und so wollte ich wenn sich die Lichtkegel schneiden ein dreieck darüberlegen, das die mischfarbe hat....
je älter ich werde, desto weniger verstehe ich....

http://www.tafkasomm.de
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Hab den code nicht getestet, werd ich mal schnell machen.

EDIT:
Ok, ich hab den code 1:1 getestet, funktioniert einwandfrei. (Yeah :mrgreen:)

Bitte sehr:
http://khrismuc.gmxhome.de/strecken.exe

Skyhawk:
Denk daran, int a/int b ist 0, wenn a<b.
Zuletzt geändert von KhrisMUC am 08.11.2005, 01:11, insgesamt 1-mal geändert.
Use gopher repellent on funny little man
podthepunk
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 122
Registriert: 15.02.2005, 14:59

Re: schnittpunkt zweier strecken....

Beitrag von podthepunk »

Skyhawk hat geschrieben: (x1,y1) und (x2,y2) die Anfangs- und Endpunkte deiner ersten Strecke
(x3,y3) und (x4,y4) die Anfangs- und Endpunkte deiner zweiten Strecken
Hoffe das sind nur Beispielkoordinaten, denn:

Diese strecken haben nirgends einen Schnittpunkt.
Selbst wenn man diese Strecken verlängert sind sie parallel und haben nicht einen sondern "unendlich" Schnittpunkte.

Das nur als Anmerkung am Rande, vielleicht liegts ja daran.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Pod:
x1, y1 usw. sind nur Varibalen, die Punkte liegen nicht alle auf einer Funktionsgeraden.

EDIT:
Mir war langweilig :mrgreen:
http://khrismuc.gmxhome.de/spots.exe
(kleiner glitch, wenn die Überschneidung zu weit rechts ist;
Strg-Q halten, da Wait(3); in der rep-exe)
Zuletzt geändert von KhrisMUC am 08.11.2005, 14:14, insgesamt 2-mal geändert.
Use gopher repellent on funny little man
podthepunk
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 122
Registriert: 15.02.2005, 14:59

Beitrag von podthepunk »

Aso, sag das doch einer dazu :oops:

Ich LES' dann auch mal die Helpfile :lol:
Benutzeravatar
Skyhawk
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 77
Registriert: 27.04.2004, 19:40
Kontaktdaten:

Beitrag von Skyhawk »

das spots proggie ist genial....
:D :D

ich mach mich später ersteinmal daran meinen code zu entrümpeln....
vielleicht find ich ja n fehler.....


Bild
je älter ich werde, desto weniger verstehe ich....

http://www.tafkasomm.de
Benutzeravatar
Skyhawk
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 77
Registriert: 27.04.2004, 19:40
Kontaktdaten:

Beitrag von Skyhawk »

so, code entrümpelt und vereinfacht...
(vor allem die variablen umbenannt ;) )

nu hab ich die schon angekündigten division/null fehlermeldungen bei
xs=FloatToInt(IntToFloat(t2-t1)/(m1-m2));
je älter ich werde, desto weniger verstehe ich....

http://www.tafkasomm.de
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Die code-Zeile ist ja von mir?
Ich steige vorher mit return 0; aus, falls m1==m2.
Use gopher repellent on funny little man
Gast

Beitrag von Gast »

omg..... #-o #-o
nu hab ich den fehler gefunden..............


da ich so verdutzt war das m1-m2 immer null ergab
und m1 und m2 eigentlich nicht identisch sein konnten....


hab ich einfach mal nen display("%d",m1) eingefügt
und m1 und m2 waren immer null....
was nätürlich auch nicht sein konnte...

des rätsels lösung: ich hab vergessen, das die Spots nicht sofort einsetzen..... deshalb waren m1 und m2 null, waren ja keine strecken da.

manchmal könnt ich mich... ](*,)

auf jeden fall danke für die hilfe :mrgreen:
Benutzeravatar
Skyhawk
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 77
Registriert: 27.04.2004, 19:40
Kontaktdaten:

Beitrag von Skyhawk »

warum denn gast?
ich bin doch eingeloggt......



buhhaaaaaa, der internet-geist....
je älter ich werde, desto weniger verstehe ich....

http://www.tafkasomm.de
Antworten