Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Überschneidung von Wegen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]
020
14.07.2003, 21:00 Uhr
0xdeadbeef
Gott
(Operator)


Hm. Ich hätte da so ne wilde Idee...Pass auf, du hast 4 Punkte, A, B, C und D. AB und CD sind jeweils eine Strecke. a1, a2 usw. sind die jeweiligen x bzw. y-Werte. Jetzt läßt du die ganze Konstruktion um A rotieren, so dass a2 = b2. Damit ist das aufstellen der Normalen auf AB durch C sowie der Steigung von CD bezüglich AB trivial, so dass du einfach prüfen kannst, ob der Schnittpunkt der Verlängerung von AB mit der Verlängerung von CD innerhalb von AB und CD liegt.
Ich bin der Meinung, dass es so relativ einfach gehen müsste - ich setz mich in ner freien Minute mal hin, um das zu implementieren.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 14.07.2003 um 21:12 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
14.07.2003, 21:12 Uhr
0xdeadbeef
Gott
(Operator)


Oder noch besser Nach der Rotation nimm die Verlängerung von CD als Funktion g(x). Die Verlängerung f(x) von AB wäre f(x) = a2' = b2'. Dann setz g(x) = a2', und du hast den Schnittpunkt der Verlängerungen. Wenn der innerhalb der rotierten Strecken liegt, hast du gewonnen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
14.07.2003, 21:27 Uhr
Pablo
Supertux
(Operator)


Guter Vorschlag, aber, wenn eine Kante eine andere Kante überschneidet (nach der Aufgabenstellung) darf man den Weg wechseln? Sonst ist unwichtig, ob sich 2 Kanten schneiden.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
14.07.2003, 23:09 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich würds so machen

C++:
#include <iostream>
using namespace std;

typedef struct {double x; double y;}Punkt,Gerade;

bool intersection(Punkt p1, Punkt p2, Punkt p3, Punkt p4){

Gerade f,g;
double intersec_x;

if(p1.x!=p2.x) f.x=(p1.y-p2.y)/(p1.x-p2.x);   //Steigung    
//hier muss man sich irgendwas schlaues für unendlich einfallen lassen sollte so hinreichend funktionieren
else f.x=10000000;                            
f.y=p1.y-f.x*p1.x;                            //y-Achsen-Abschnitt

if(p3.x!=p4.x)g.x=(p3.y-p4.y)/(p3.x-p4.x);   //Steigung    
else g.x=10000000;
g.y=p3.y-g.x*p3.x;


if(f.x==g.x) return false; //die stelle ist ein bisschen strittig ob sich zwei geraden kreuzen die übereinander liegen

intersec_x=-(f.y-g.y)/(f.x-g.x);

if( (p1.x<p2.x)  && (p1.x<=intersec_x) && (p2.x>= intersec_x)) return true;
if( (p1.x>=p2.x) && (p1.x>=intersec_x) && (p2.x<= intersec_x)) return true;

return false;
}


int main(){

Punkt p1,p2,p3,p4,p5,p6;

p1.x=1;
p1.y=1;

p2.x=3;
p2.y=3;

p3.x=2;
p3.y=4;

p4.x=3;
p4.y=1;

p5.x=0;
p5.y=0;

p6.x=5;
p6.y=10;

if(intersection(p1, p2, p3, p4)) cout <<"sie kreuzen sich"<<endl;
else cout <<"sie kreuzen sich nicht"<<endl;

if(intersection(p1, p2, p5, p6)) cout <<"sie kreuzen sich"<<endl;
else cout <<"sie kreuzen sich nicht"<<endl;

return 0;
}



Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 14.07.2003 um 23:14 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
15.07.2003, 13:47 Uhr
typecast
aka loddab
(Operator)


Danke für die Tipps. Ich werde das mal wenn ich Zeit hab ausprobieren.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
15.12.2004, 00:21 Uhr
~redspider
Gast


ist zwar schon n bissl her, dass das hier geschrieben wurd, aber ich hab mich auch mit dem problem beschäftigt und hab selbst eine lösung entwickelt, da die von windalf (bei mir zumindest) nicht funktioniert hat. hier ist sie:


C++:
bool Intersection(CVec2f p1, CVec2f p2, CVec2f p3, CVec2f p4, CVec2f *sp = NULL);
struct CVec2f
{
    float x,y;
};
bool Intersection(CVec2f p1, CVec2f p2, CVec2f p3, CVec2f p4, CVec2f *sp)
{
    CVec2f a,RVa;
    CVec2f b,RVb;
    a = p1; RVa = (p2-p1);
    b = p3; RVb = (p4-p3);
    // a+r*RV = b+s*RV =>    
    float denom = (RVa.y*RVb.x - RVa.x*RVb.y);
    if( denom == 0 ) return false;
    float r = (a.x*RVb.y - a.y*RVb.x - b.x*RVb.y + b.y*RVb.x)/denom;
    float s = (a.x*RVa.y - a.y*RVa.x - b.x*RVa.y + b.y*RVa.x)/denom;

    if( r >= 0 && r <= 1 && s >= 0 && s <= 1)
    {
        if(sp != NULL)
        {
            sp->x = a.x+r*RVa.x;
            sp->y = a.y+r*RVa.y;
        }
        return true;
    }
    return false;
}


diese liefert zusätzlich noch den schnittpunkt.
vielleicht hilfts ja jemandem, der genauso auf der suche ist, wie ich es war.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
15.12.2004, 00:24 Uhr
~redspider
Gast


struct CVec2f[...] muss natürlich noch vor der deklaration von Intersection() stehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
15.12.2004, 00:39 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


lol ob typcast 1 1/2 Jahre später immer noch über diesem Problem brütet
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
15.12.2004, 13:16 Uhr
~redspider
Gast


sollte ja nicht nur für typecast sein. kann ja sein, dass nochjemand auf dieses problem stößt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
15.12.2004, 20:55 Uhr
typecast
aka loddab
(Operator)



Zitat von Windalf:
lol ob typcast 1 1/2 Jahre später immer noch über diesem Problem brütet


Nein, tu ich nicht mehr
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 15.12.2004 um 20:56 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: