public boolean intersects(RectangularObstacle obs) {
		if (obstacles != null && !obstacles.isEmpty()) {
			RectangularObstacle r;
			synchronized (obstacles.getSynchronizationLock()) {
				for (Iterator it = obstacles.iterator(); it.hasNext();) {
					r = (RectangularObstacle) it.next();
					if (!r.equals(obs) && r.intersects(obs))
						return true;
				}
			}
		}
		for (int i = 0; i < nAtom; i++) {
			if (!obs.isPermeable((byte) atom[i].getID()) && atom[i].intersects(obs))
				return true;
		}
		if (!molecules.isEmpty()) {
			Object obj = null;
			synchronized (molecules.getSynchronizationLock()) {
				for (Iterator it = molecules.iterator(); it.hasNext();) {
					obj = it.next();
					if (obj instanceof CurvedSurface) {
						if (((CurvedSurface) obj).intersects(obs.getX(), obs.getY(), obs.getWidth(), obs.getHeight()))
							return true;
					}
				}
			}
		}
		return false;
	}