Przecięcie dwóch płaszczyzn

0

Cześć,
jak w najprostszy sposób czy dwie płaszczyzny 2D nachodzą na siebie?
Czyli mamy dwa prostokąty, można to sprawdzić poprzez sprawdzenie czy któryś z czterech wierzchołków drugiego prostokąta zawiera się w pierwszym prostokącie, ale wydaje mi się że jest prostszy sposób?

0

Jeżeli prostokąty zadane dwoma parami współrzędnych (czyli boki równoległe do osi) to NIE MA prostszego.

0

to w końcu płaszczyzny czy prostokąty?
bo płaszczyzny się zawsze przetną, chyba że są równoległe

0

No chodziło mi o dwa prostokąty

0

http://stackoverflow.com/a/7147331

// a czekaj
miało być w 3d, czy w 2d?
bo że prostokąty są 2d to wiadomo

0

No wszystko w 2D.
Na razie opisałem sobie prostokąt jako dwa punkty: (x1,y1), (x2,y2).
Przeanalizuję to co podałeś

1
Paweł222 napisał(a):

No wszystko w 2D.
Na razie opisałem sobie prostokąt jako dwa punkty: (x1,y1), (x2,y2).
Przeanalizuję to co podałeś

skoro tak opisałeś prostokąt to znaczy że nie jest on w żaden sposób odwrócony
więc wystarczy proste

RectA.X1 < RectB.X2 && RectA.X2 > RectB.X1 && RectA.Y1 < RectB.Y2 && RectA.Y2 > RectB.Y1

0
unikalna_nazwa napisał(a):

RectA.X1 < RectB.X2 && RectA.X2 > RectB.X1 && RectA.Y1 < RectB.Y2 && RectA.Y2 > RectB.Y1
Ten warunek to pełne zawieranie się RectA w RectB co nie jest tożsame z zachodzeniem na siebie.

nie? jeśli nie rozumiesz popatrz na to:
http://silentmatt.com/rectangle-intersection/

0

dobra symulacja :D

1

czyli to co podałeś nie jest ani zawieraniem ani też przecinaniem się. Tylko 1/6 przecinania się - jeżeli można tak się wyrazić oczywiście.

aha, to wskaż mi proszę w takim razie ustawienie prostokątów na stronie powyżej dla którego wynik sprawdzenia przecinania się jest błędny :>

0

@_13th_Dragon ma racje, to nie jest pełne sprawdzenie czy na siebie nachodzą, btw. łatwiej jest sprawdzić czy na siebie nie nie nachodzą.
zakładając że dla każdego prostokąta (x1, y1) x (x2, y2) zawsze x1<x2 i y1<y2 czyli (x1,y1) - lewy górny róg, (x2, y2) - prawy dolny róg to :

NIE nachodzą na siebie gdy:
(a.x2 < b.x1 || a.y2 < b.y1 || a.x1>b.x2 || a.y1 > b.y2)
dowód:
a.x2 < b.x1 uwzględniając założenia oznacza że a.x1 < a.x2 < b.x1 < b.x2 czyli a jest z lewej strony b
a.y2 < b.y1 czyli a.y1<a.y2 < b.y1 < b.y2 a jest nad b
analogicznie dwa pozostałe.

0
unikalna_nazwa napisał(a):

czyli to co podałeś nie jest ani zawieraniem ani też przecinaniem się. Tylko 1/6 przecinania się - jeżeli można tak się wyrazić oczywiście.

aha, to wskaż mi proszę w takim razie ustawienie prostokątów na stronie powyżej dla którego wynik sprawdzenia przecinania się jest błędny :>

Chyba wystarczy przypadek gdy b znajduje sie wewnątrz a

0

<quote="856361">@_13th_Dragon ma racje, to nie jest pełne sprawdzenie czy na siebie nachodzą, btw. łatwiej jest sprawdzić czy na siebie nie nie nachodzą.
zakładając że dla każdego prostokąta (x1, y1) x (x2, y2) zawsze x1<x2 i y1<y2 czyli (x1,y1) - lewy górny róg, (x2, y2) - prawy dolny róg to :

NIE nachodzą na siebie gdy:
(a.x2 < b.x1 || a.y2 < b.y1 || a.x1>b.x2 || a.y1 > b.y2)
dowód:
a.x2 < b.x1 uwzględniając założenia oznacza że a.x1 < a.x2 < b.x1 < b.x2 czyli a jest z lewej strony b
a.y2 < b.y1 czyli a.y1<a.y2 < b.y1 < b.y2 a jest nad b
analogicznie dwa pozostałe.</quote>

a ten warunek jest dokładnym zaprzeczeniem warunku sprawdzenia czy na siebie NIE nachodzą
logiczne więc że zaprzeczenie sprawdzenia czy prostokąty NIE nachodzą na siebie jest warunkiem sprawdzenia czy na siebie nachodzą

jeśli twierdzisz że jest inaczej to zadanie powyżej kieruję też do Ciebie

xxx_xx_x napisał(a):

Chyba wystarczy przypadek gdy b znajduje sie wewnątrz a

chyba to się pchła na jajach
możesz przesuwać te prostokąty jeśli nie zauważyłeś

przesuń, zrób screenshota, pokaż

0

<quote="856363">

xxx_xx_x napisał(a):

@_13th_Dragon ma racje, to nie jest pełne sprawdzenie czy na siebie nachodzą, btw. łatwiej jest sprawdzić czy na siebie nie nie nachodzą.
zakładając że dla każdego prostokąta (x1, y1) x (x2, y2) zawsze x1<x2 i y1<y2 czyli (x1,y1) - lewy górny róg, (x2, y2) - prawy dolny róg to :

NIE nachodzą na siebie gdy:
(a.x2 < b.x1 || a.y2 < b.y1 || a.x1>b.x2 || a.y1 > b.y2)
dowód:
a.x2 < b.x1 uwzględniając założenia oznacza że a.x1 < a.x2 < b.x1 < b.x2 czyli a jest z lewej strony b
a.y2 < b.y1 czyli a.y1<a.y2 < b.y1 < b.y2 a jest nad b
analogicznie dwa pozostałe.</quote>

a ten warunek jest dokładnym zaprzeczeniem warunku sprawdzenia czy na siebie NIE nachodzą
logiczne więc że zaprzeczenie sprawdzenia czy prostokąty NIE nachodzą na siebie jest warunkiem sprawdzenia czy na siebie nachodzą

jeśli twierdzisz że jest inaczej to zadanie powyżej kieruję też do Ciebie

Nie przyglądałem sie dokładnie czy to jest zaprzeczenie, może masz racje.
Ah masz racje, sprawdziłem, twój warunek jest dokładnym zaprzeczeniem mojego...

0

LOL. Kłótnia o metodę sprawdzania kolizji prostokątów...
Po co sprawdzać każdy punkt czy znajduje się w prostokącie jeśli można prawie takiej samej metody użyć do sprawdzenia od razu całego prostokąta?

firstRectX2>=secondRectX1 && firstRectY2>=secondRectY1 && firstRectX1<=secondRectX2 && firstRectY1<=secondRectY2

2

Chyba dzisiaj mózg mi się przegrzał, idę spać.

0

To ja dodam swoje 3 grosze.

unikalna_nazwa napisał(a):

RectA.X1 < RectB.X2 && RectA.X2 > RectB.X1 && RectA.Y1 < RectB.Y2 && RectA.Y2 > RectB.Y1
To jest jak najbardziej poprawne. Ale tylko w pewnych warunkach (których to autor nie określił).

  1. Czy prostokąty mają nachodzić na siebie czy wystarczy, że się stykają? Jeśli to drugie to trzeba użyć nierówności słabej (<= zamiast <, >= zamiast >)
  2. Czy założeniem jest, że X1<=X2, Y1<=Y2 itd.? Jeśli nie to przed sprawdzeniem trzeba ułożyć współrzędne w kolejności rosnącej lub rozszerzyć warunek o więcej przypadków.
  3. Czy prostokąty są "prostopadłe" do osi współrzędnych? Jeśli nie, to trzeba użyć całkiem innych wzorów.

0 użytkowników online, w tym zalogowanych: 0, gości: 0