Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porównywanie współrzędnych dwóch elementów
Forum PHP.pl > Forum > PHP
kondix03
Witam, szukałem w Google ale nie znalazłem żadnych skryptów/funkcji które pomogłyby mi porównać czy jeden element "leży" na drugim. Elementy są przenoszone za pomocą jQuery UI jednak mi chodzi o funkcję sprawdzającą czy dane współrzędne nachodzą na siebie. Napisałem dwie funkcje ale nie wiem czy działa poprawnie.
Kod:
  1. function checkPosition($posx1, $posy1, $posx2, $posy2){
  2. if($posx1 != $posx2 && $posy1 != $posy2){
  3. return true;
  4. }
  5. else{
  6. return false;
  7. }
  8. }
  9. function checkFieldUnder($id, $to_top, $to_left, $width, $length){
  10. $topos = array(
  11. 'y' => $to_top,
  12. 'x' => $to_left
  13. );
  14. $items_query = mysql_query("SELECT * FROM items");
  15. $false = true;
  16. while($itemspos = mysql_fetch_row($items_query)){
  17. $checkpos = array(
  18. 'y' => $itemspos[13],
  19. 'x' => $itemspos[14]
  20. );
  21. if($itemspos[0] != $id){
  22. $toposx = $topos['x'];
  23. $toposy = $topos['y'];
  24. $checkposx = $checkpos['x'];
  25. $checkposy = $checkpos['y'];
  26. $tpxw = $toposx + $width;
  27. $tpyl = $toposy + $length;
  28. while($toposx != $tpxw && $toposy != $tpyl){
  29. if(!checkPosition($toposx, $toposy, $checkposx, $checkposy)){
  30. break;
  31. $false = false;
  32. }
  33. else{
  34. if($toposx != $tpxw){
  35. $toposx++;
  36. }
  37. if($toposy != $tpyl){
  38. $toposy++;
  39. }
  40. }
  41. }
  42. if($false == false){
  43. return false;
  44. }
  45. else{
  46. return true;
  47. }
  48. }
  49. }
  50. }


Prosiłbym o pomoc i/lub podpowiedzi smile.gif
Crozin
Generalnie muszę Ci pogratulować. Chyba jeszcze nigdy przestudiowanie kodu który robi taką pierdołę jaką jest wykrycie nachodzenia na siebie dwóch prostokątów nie zajęło tyle czasu.
Zacznij formatować jakoś ten kod, nadawać sensowne nazwy zmiennym i grupować powiązane ze sobą dane w jakieś logiczne struktury.

Muszę też pogratulować Ci pomysłu, bo z tego co widzę to zamiast sprawdzić to na postawie współrzędnych i wymiarów porównujesz każdy punkt należący do prostokąta.

  1. class Rectangle {
  2. private $x;
  3. private $y;
  4. private $width;
  5. private $height;
  6.  
  7. public function __construct($x, $y, $width, $height) {
  8. // sprawdzasz czy wszystkie parametry to liczby całkowite większe od zera
  9. // i wyrzucasz wyjątek jeżeli nie są
  10.  
  11. $this->x = $x;
  12. $this->y = $y;
  13. $this->width = $width;
  14. $this->height = $height;
  15. }
  16.  
  17. public function intersects(Rectangle $r) {
  18. $tw = $this->width;
  19. $th = $this->height;
  20. $tx = $this->x;
  21. $ty = $this->y;
  22.  
  23. $rw = $r->width;
  24. $rh = $r->height;
  25. $rx = $r->x;
  26. $ry = $r->y;
  27.  
  28. $rw += $rx;
  29. $rh += $ry;
  30. $tw += $tx;
  31. $th += $ty;
  32.  
  33. return (($rw < $rx || $rw > $tx) &&
  34. ($rh < $ry || $rh > $ty) &&
  35. ($tw < $tx || $tw > $rx) &&
  36. ($th < $ty || $th > $ry));
  37. }
  38. }
  39.  
  40. $r1 = new Rectangle(5, 7, 23, 4);
  41. $r2 = new Rectangle(1, 12, 4, 1);
  42.  
  43. var_dump($r1->intersects($r2));
W sumie punkt i wymiary również mogłyby być obiektami:
  1. class Point {
  2. private $x;
  3. private $y;
  4.  
  5. // ...
  6. }
  7.  
  8. class Dimension {
  9. private $width;
  10. private $height;
  11.  
  12. // ...
  13. }
kondix03
Za dużo to ja nie zrozumiałem bo nie uczyłem się jeszcze operować na klasach itd. ale dzięki za naprowadzenie.

Dobra, już łapię o co chodzi. Wielkie dzięki, ja nad tym siedziałem ze 4 dni, napisałem ze 4 funkcje i nic sad.gif Jeszcze raz wielkie dzięki.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.