private boolean intersects(Atom a, boolean noOverlapTolerance) {
		if (obstacles != null && !obstacles.isEmpty()) {
			RectangularObstacle obs;
			synchronized (obstacles.getSynchronizationLock()) {
				for (Iterator it = obstacles.iterator(); it.hasNext();) {
					obs = (RectangularObstacle) it.next();
					if (!obs.isPermeable((byte) a.getID()) && obs.intersects(a.getBounds2D()))
						return true;
				}
			}
		}
		Element e1 = model.getElement(a.getID());
		Element e2;
		for (int i = 0; i < nAtom; i++) {
			if (atom[i] != a) {
				e2 = model.getElement(atom[i].getID());
				if (model.getAffinity().getEpsilon(e1, e2) > 0 && atom[i].intersects(a, noOverlapTolerance))
					return true;
			}
		}
		Object obj = null;
		if (!molecules.isEmpty()) {
			synchronized (molecules.getSynchronizationLock()) {
				for (Iterator it = molecules.iterator(); it.hasNext();) {
					obj = it.next();
					if (obj instanceof CurvedSurface) {
						if (((CurvedSurface) obj).contains(a.getRx(), a.getRy()))
							return true;
					}
				}
			}
		}
		return false;
	}