Autor Beitrag
crackymouse
Hält's aus hier
Beiträge: 11

Win XP Prof.
Delphi 7
BeitragVerfasst: Sa 24.03.07 14:27 
Hi ihr,

Sitze jetz schon seit einer Woche an einem Problem und zwar habe ich ein Rechteck das ich über ein Engine(andora2d) drehe.
Nun möchte ich eine Kollisionsdetektion dafür programmieren.
Leider bekomme ich es anscheinend ohne hilfe nicht hin...

Soweit ich weiß müsste sowas ja mit vektorrechnung gehen oder? Über das Skalarprodukt?

vektor a * vektor b = betrag a * betrag b mal cosinus vom winkel

Wie wende ich die Formel an? (Vektorenrechnung is schon sehr lange her)

Wäre Lieb wenn mir jemand helfen könnte :)

LG cracky
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Sa 24.03.07 15:10 
als erste Annäherung würde ich zuerst verwenden, dass die Mittelpunkte voneinander mehr als die Summe der Hälften der jeweils größeren Diagonalen der Rechtecke entfernt sein müssen.

Ansonsten kannste bei ner 2D Engine da auch mit reinen Vergleichen arbeiten

|.......x
|.....x
|...x
|
|............x
|
-------------------

Kannst einfach die Steigungen durcheinander teilen, wenn kleiner 1 oder größer folgt ob der Punkt "rechts oder links" von der Linie ist in Kombination von allen Seiten kannste daraus ne exakte Kollisionserkennung basteln.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 24.03.07 15:15 
Würde zuerst, wie Allesquarks gesagt hat, eine grobe Collision-Detection machen. Danach kannst du Linien miteinander schneiden und Schnittpunkte berechnen, oder kannst auch mal per Polygon-Clipping was versuchen:

Du könntest beispielsweise zwei Kanten des einen Rechtecks als neue Koordinatenachse nehmen, d.h. Matrix mit den zwei Kantenvektoren aufstellen und invertieren, danach alle Koordinaten in das neue System transformieren (durch Multiplikation mit der invertierten Matrix). Anschliessend ist die Situation so, dass das eine Rechteck das Einheitsquadrat ist (bis auf Verschiebung), und das andere Rechteck entsprechend verzerrt im Raum liegt. Du könntest dann z.B. mit Cohen-Sutherland relativ einfach bestimmen, ob es Schnittpunkte gibt (ohne die explizit berechnen zu müssen).

Ist nur eine Möglichkeit. Gibt vermutlich noch bessere.
crackymouse Threadstarter
Hält's aus hier
Beiträge: 11

Win XP Prof.
Delphi 7
BeitragVerfasst: Sa 24.03.07 15:36 
erstmal Danke für die Antworten

Also ich glaub ich hab mich falsch ausgedrückt :(

Mein Problem ist in erster Lienie das ich nicht weiß wie ich die eckpunkt des "neuen" rechteckes also nach dem drehen in einem bestimmten winkel um den mittelpunkt errechnen kann!

@allesquark
Das mit der steigung klingt interessant daran hab ich garnicht gedacht wäre wahrscheinlich wirklich die einfachste lösung!

@delfiphan:
hab darüber schon mal was gelesen aber ich befürchte dafür reichen wohl meine mathe-kenntnisse nicht aus :( hast du vieleicht einen link zu dem thema?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 24.03.07 15:39 
Dann musst du eben ein gedrehtes Koordinatensystem definieren; mit einer Matrix, welches gedrehte Einheitsvektoren enthält. Die lassen sich über cos/sin errechnen. Such mal nach Drehmatrix. Die sieht ungefähr so aus:
[cos a, -sin a]
[sin a, cos a]

Die Invertierung der Matrix ändert nur die Drehrichtung. Würde eh nur das Minuszeichen zum anderen Sinus verschieben, von dem her ist's mehr oder weniger egal. Lassen wir das mal in dem Fall.

Multiplikation mit dem Vektor bringt den neuen, gedrehten Vektor. Ausgeschrieben:
xneu = cos(a)*x - sin(a)*y
yneu = sin(a)*x + cos(a)*y

Gedreht wird um den Koordinatenursprung (0,0). Falls du einen anderen Drehpunkt willst, musst du das Rechteck zuerst verschieben, drehen, dann wieder zurückverschieben.

Also alles in Allem:
xneu = cos(a)*(x-x0) - sin(a)*(y-y0) + x0
yneu = sin(a)*(x-x0) + cos(a)*(y-y0) + y0

wobei a der Winkel in rad ist, d.h. a=w*pi/180, wobei w von 0 bis 360 geht und (x0,y0) der Drehmittelpunkt ist.
crackymouse Threadstarter
Hält's aus hier
Beiträge: 11

Win XP Prof.
Delphi 7
BeitragVerfasst: Sa 24.03.07 19:51 
DANKE delfiphan!

Genau das hab ich gesucht!
Funktioniert und ich habs sogar verstanden :)

schönes rest-WE noch
LG cracky