piątek, 1 marca 2013

Testowanie wizualne z Processing

Wspomniałem kiedyś o Processing, który ogromnie cenię za szybkość prototypowania algorytmów i wielopoziomowość. Z jednej strony daje łatwość współpracy obiektami wysokiego poziomu (np. abstrakcyjne struktury danych w Java, systemy okienkowe) oraz niskim poziomem, np. Arduino czy port szeregowy + operacje bitowe.

Pare dni temu siedziałem nad detektorem kolizji dla prostej gry 2D. "Coś" nie działało, więc pierwsze podejrzenie na funkcję analizującą, czy 2 prostokąty nachodzą na siebie. Wyglądało to mniej więcej tak:

boolean doesColide(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2)
{
    return (
                max(ax1, ax2) >= min(bx1, bx2) &&
                min(ax1, ax2) <= max(bx1, bx2) &&
                min(by1, by2) <= max(ay1, ay2) &&
                max(by1, by2) >= min(ay1, ay2)  );
}


Pisanie testów? Zdecydowanie nie. Testowanie interaktywne jest szybsze i łatwiej wypatrzeć gdzie algorytm się nie sprawdza. Przeniosłem kod tej metody do Processing ( czyli Javy :P ), obudowałem wizualizacją (jeden kwadrat nieruchomy, drugi porusza się wraz z kursorem). Jeżeli ruchomy jest zielony - brak kolizji. W przeciwnym wypadku - czerwony.

Czas pisania kodu: 2 minuty. Czas testowania: 2 minuty.
boolean doesColide(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2)
{
    return (
                max(ax1, ax2) >= min(bx1, bx2) &&
                min(ax1, ax2) <= max(bx1, bx2) &&
                min(by1, by2) <= max(ay1, ay2) &&
                max(by1, by2) >= min(ay1, ay2)  );
}

void setup()
{
 size(400, 400);
 background(255); 
}

void draw()
{
  background(255);
  rect(150, 150, 100, 100);
  if (doesColide(mouseX-50, mouseY-50, mouseX+50, mouseY+50, 150, 150, 250, 250) ) 
    fill(255, 0, 0);
  else fill(0, 255, 0);
  rect(mouseX-50, mouseY-50, 100, 100);
  fill(0);
}

Brak komentarzy:

Prześlij komentarz