Może by jednak nie wymyślać na nowo koła?
Pomysł z definiowaniem prostokątów przez ich wierzchołki jest średni. Przede wszystkim dlatego, że potem trzeba bawić się w odejmowanie 1 lub dekrementowanie wartości tymczasowych. A Java ma przecież wygodną definicję prostokąta i większość potrzebnych operacji.
//wersja dla leniwych lemurów
Point a1, a2, b1, b2;
//...
Rectangle a = new Rectangle(a1, new Dimension(Math.abs(a2.x - a1.x), Math.abs(a2.y - a1.y)));
Rectangle b = new Rectangle(b1, new Dimension(Math.abs(b2.x - b1.x), Math.abs(b2.y - b1.y)));
Rectangle c = a.intersection(b);
final int area = c.isEmpty()? 0 : c.width * c.height;
Wersja dla pracowitych zawiera własną metodę części wspólnej opierającą się na minimalizowaniu odcinków składających się na boki prostokąta wspólnego (współrzędne lewego-górnego rogu się maksymalizuje, a prawego-dolnego minimalizuje). Wywołanie intersectionArea(a,b) daje wynik liczbowy.
//wersja dla pracowitych mrówek
private class Rect
{
public Rect(final Point a, final Point b)
throws IllegalArgumentException
{
if(!(a.x <= b.x && a.y <= b.y))
throw new IllegalArgumentException(
"left-upper corner coordinates is not preceding"
+ " right right-bottom corner coordinates ");
this.a = a;
this.b = b;
}
public long area()
{
final int width = Math.abs(b.x - a.x);
final int height = Math.abs(b.y - a.y);
return width * height;
}
private final Point a, b;
}
private Rect intersection(final Rect r1, final Rect r2)
throws IllegalArgumentException
{
Point ia = new Point();
ia.x = Math.max(r1.a.x, r2.a.x);
ia.y = Math.max(r1.a.y, r2.a.y);
Point ib = new Point();
ib.x = Math.min(r1.b.x, r2.b.x);
ib.y = Math.min(r1.b.y, r2.b.y);
return new Rect(ia, ib);
}
private long intersectionArea(Rect a, Rect b)
{
Rect result = null;
try { result = intersection(a, b); }
catch(IllegalArgumentException ignore) { return 0; }
return result.area();
}