Brauche dringend Hilfe von C++ - Codern!
Übersicht

WandererBetreff: Brauche dringend Hilfe von C++ - Codern! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich bin auf der Suche nach einer Möglichkeit zum Testen, ob zwei Rechtecke sich überschneiden (auch, ob ein Rechteck komplett in einem anderen liegt!). Da jedes Rechteck durch Eckpunkte (xy) definiert wird, können diese auch 'rotiert' sein (womit RectsOverlap schon mal ausscheidet).
Ich habe jetzt nach langem Suchen einen kleinen Code gefunden, der daß genau das lösen soll -allerdings ist es in C++ geschrieben, womit ich leider kaum etwas anfangen kann. Kennt sich hier jemand mit C++ aus und könnte das vielleicht irgendwie konvertieren? Sind wirklich nur wenige Zeilen -und im Code-Archiv fehlt eine solche Funktion noch dringend! Hier der C++ code: http://www.ragestorm.net/samples/CDRR.C |
||
Mai Siehgnätschah gohs hiah. |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
wozu brauchst du da c++ cide? das sind einfache codes...
einfach rotation-formel anwenden (ich will es nicht schon wider hier posten - ich werde dazu ein tut schreiben, damit es nie nie nie wider vorkommt!!!) rechteck in 2 dreiecke zerlegen und punkt-in-dreieck-algo ausführen... (code gibts hierzu auf blitzbase) dann noch auf linienkreuzung checken und fertig (gibts auch auf blitzbase) |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
Wanderer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du meinst den Dot-in-Area Code dort?
EDIT: Moment, da werden Banks angelegt -das kann ich in meinem Programm nicht machen - zig Objekte, Prüfung in jedem Frame usw... Alle Punkte checken, dann noch Linienkreuzung -ich hatte aber gehofft, das es vielleicht eine schnellere Methode gibt -denn jedesmal, wenn KEINE Überlappung stattfindet, rechnet die Funktion ALLE Punkte samt Linien durch. |
||
Mai Siehgnätschah gohs hiah. |
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn es ein einfaches rechteck ist, dann schau einfach ob min. ein punkt im berech des anderen rechtecks liegt.
und das geht ganz einfach: wobei: punkt 1= links oben und punkt4= rechts unten imbereich= false for i = 1 to 4 if rect1x[i]> rects2x[1] and rectt1x[i] < rect2x[4] and rect1y[i]> rects2y[1] and rectt1y[i] < rect2y[4] then imbereich= true endif next if imbereich= true print "rechteck1 ist im bereich von rechteck 2" endif |
||
Denken hilft! |
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@stfighter01:
Das ist nicht zuverlässig ! Stell dir mal 2 gleiche quadrate übereinander vor und drehe dann eines um 45grad. Dann sind alle Punkte ausserhalb des anderen quadrates. Mann muß also zusätzlich die linienkreutzung berechnen. optimierungsidee: berechne die maximal ausdehnung zum drehzentrum (stell dir einen kreis um das quadrat vor. Der entfernteste punkt des quadrates zum drehzentrum ist der radius). Wenn 2 quadrate sich nicht mit ihren umfangskreis berühren dann braucht man auch nicht auf überlappung zu testen! also: mag# = sqr(deltaX#^2 + deltaY#^2) if mag < (radius1 + radius2) then ;abstand der quads ist geringer als ihr kombinierter radius ;hier muß genauer geschaut werden check_intersetion() else ;berechnung nicht notwendig end if |
||
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
sorry, hätt ich dazuschreiben sollen ![]() |
||
Denken hilft! |
Wanderer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Klaas: gute Idee, zuerst einmal den Radius zu testen. Ich werde das mal einfügen -aber generell scheint wohl kein Weg daran vorbeizugehen, dass man in jedem Fall hierfür
a) Testen aller Punkte (ob inerhalb des anderen Quadrats) = 8 Tests b) Testen aller Linien mit allen Linien des anderen Quadrats = 16 Tests braucht, oder? Einen anderen Weg gibt es nicht? |
||
Mai Siehgnätschah gohs hiah. |
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
also, ich glaub man kann einige Fälle ausschließen.
Wenn alle Punkte ausserhalb des jeweils anderen Quadrates liegen dann müssen alle Seiten sich kreutzen ... oder ? Wenn das der Fall ist, dann muß man nachdem die 8 Punkte getestet wurden nur eine einzige Linie (gegen 4 des anderen Quadrates) checken. Sollte die sich dann nicht kreutzen kann man sagen das sie sich nicht überlappen. Korriegiert mich bitte wenn das falsch ist, komme aber beim überlegen zu keinem Fall wo dies anderst ist. |
||
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
jetzt mach ich mich auch noch mal nützlich ![]() mag= deltax^2+deltay^2 if mag < (radius1+radius2)^2 then checkgenauer() endif damit fällt sqr weg sqr ist bei mir 3 mal so langsam wie ^2 und bei manch anderen warscheinlich sogar noch viel viel langsamer |
||
Denken hilft! |
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
... ja, aber das hat dann doch nichts mehr mit dem Abstand zu tun !!!! | ||
Wanderer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hier mal ein paar Beispiele, welche Situationen auftreten können:
![]() Zitat: Wenn alle Punkte ausserhalb des jeweils anderen Quadrates liegen dann müssen alle Seiten sich kreutzen ... oder ?
Kommt auch darauf an, von welchem Rechteck aus man das sieht (siehe Bild) - aber woher soll man wissen, welches man zuerst checkt? |
||
Mai Siehgnätschah gohs hiah. |
![]() |
Plasma(alt)Betreff: ein arger hack ist z.b |
![]() Antworten mit Zitat ![]() |
---|---|---|
immer das kleinere viereck testen. ... einfach rauszukriegen
von diesem dann jeweils die eckpunkte bestimmen und gugen ob der pixel über den eckpunkten ne andere farbe hat ........... also die des anderen rects ... das problem ist du musst erst zeichnen .... |
||
DIV is dead ! |
hot-bitGast |
![]() Antworten mit Zitat |
|
---|---|---|
Hoi.
Warum zuerst zeichnen ? Jeder Punkt hat doch seine Koordinaten ... Toni |
||
![]() |
Plasma(alt)Betreff: ja hotte |
![]() Antworten mit Zitat ![]() |
---|---|---|
dann is es ja wieder mathe ![]() |
||
DIV is dead ! |
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@klaas
mag ist bei mir zwar das quadrat des abstandes, aber es ist immer noch eine funktion des abstandes. und die vergleiche ich einfach mir dem quadrat des minimalabstandes. ist auch nicht falsch oder? |
||
Denken hilft! |
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@wanderer
ich will ja nicht den spass verderben, aber mach ma dagegen nichts? ![]() in der bewegung sollte das aber eher nicht so leicht zustande kommen. mfg stfighter |
||
Denken hilft! |
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@stfighter01: sorry, hatte das "^2" einfach übersehen ! Da hast du natürlich Recht.
man muß 8 Punkte abchecken, aber wenn die nicht zutreffen dann muß man glaub ich nur eine Linie gegen die 4 des anderen Quadrates testen. Dann kommt man von 8 und 16 auf immerhin 8 und 4 runter. Das ist ja nicht unerheblich. Zusammen mit der Radius-Optimierung sollte das einen sehr starken Performance-Sprung ausmachen. |
||
Wanderer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay, aber wie errechne ich den Abstand zwischen zwei Rechtecken möglichst schnell und effizient? Es sind ja keine Quadrate, wo man einen einfachen Radius nehmen kann. Hier wäre es eine Ellipse -oder doch ein Radius, aber dann mit Umfang des am weitesten von der Mitte des Rechtecks entfernten Punkts -aber allein den herauszufinden, kostet ja auch wieder extra 8 Sqr's (und die will ich immer vermeiden, wie Hölle, weil grottenlahm)... ![]() |
||
Mai Siehgnätschah gohs hiah. |
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
du wirst ja irgendeinen mittelpunkt für dein reckteck definiert haben, sonst kannst dus ja nicht rotieren und bewegen.
der weg vom äussersten punkt von einer mitte aus (berechnest du mit pytagoras) gibt den radius an den du überpfrüfen musst die radien kannst du vorberechnen, also wird das ganze sehr fix vonstatten gehen. |
||
Denken hilft! |
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich muß mich nochmal korriegieren:
Zitat: man muß 8 Punkte abchecken, aber wenn die nicht zutreffen dann muß man glaub ich nur eine Linie gegen die 4 des anderen Quadrates testen. Dann kommt man von 8 und 16 auf immerhin 8 und 4 runter. Das ist ja nicht unerheblich. Zusammen mit der Radius-Optimierung sollte das einen sehr starken Performance-Sprung ausmachen. wie man auf stfighter01's zeichnung sieht muß man natürlich minimal 2 linien auf jeweils 4 testen und zwar 2 zusamenhängende Linien. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group