private boolean intersects(Molecule mol) {
		RectangularObstacle r2d;
		Rectangle2D.Double molBox = new Rectangle2D.Double();
		molBox.setRect(mol.getBounds2D());
		if (obstacles != null && obstacles.size() > 0) {
			synchronized (obstacles.getSynchronizationLock()) {
				for (Iterator it = obstacles.iterator(); it.hasNext();) {
					r2d = (RectangularObstacle) it.next();
					if (r2d.intersects(molBox))
						return true;
				}
			}
		}
		if (!(mol instanceof MolecularObject)) {
			Atom a = null;
			synchronized (mol.getSynchronizedLock()) {
				for (Iterator it = mol.iterator(); it.hasNext();) {
					a = (Atom) it.next();
					for (int i = 0; i < nAtom; i++) {
						if (a != atom[i]) {
							if (!mol.contains(atom[i])) {
								if (atom[i].intersects(a, false))
									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(mol.getBounds()))
								return true;
						}
					}
				}
			}
		} else {
			for (int i = 0; i < nAtom; i++) {
				if (!mol.contains(atom[i])) {
					if (((MolecularObject) mol).intersects(atom[i]))
						return true;
				} else {
					Molecule mol2 = null;
					synchronized (molecules.getSynchronizationLock()) {
						for (Iterator it = molecules.iterator(); it.hasNext();) {
							mol2 = (Molecule) it.next();
							if (mol2 != mol && (mol2 instanceof MolecularObject)) {
								if (((MolecularObject) mol2).intersects(atom[i]))
									return true;
							}
						}
					}
				}
			}
		}
		return false;
	}