public Vector?GetUncrowdedSideVector() { var dbv = GetPrettyDoubleBondVector(); if (dbv != null) { return(dbv.Value); } else { if (PseudoCentroid != null) { return(PseudoCentroid - MidPoint); } else { if (StartAtom.Neighbours.Count() == 1 && EndAtom.Neighbours.Count() == 2) { var tempvector = EndAtom.NeighboursExcept(StartAtom)[0].Position - StartAtom.Position; var perp = Vector.Multiply(BondVector.Perpendicular(), tempvector) * BondVector.Perpendicular(); return(perp); } else if (StartAtom.Neighbours.Count() == 2 && EndAtom.Neighbours.Count() == 1) { var tempvector = StartAtom.NeighboursExcept(EndAtom)[0].Position - EndAtom.Position; var perp = Vector.Multiply(BondVector.Perpendicular(), tempvector) * BondVector.Perpendicular(); return(perp); } else { return(BondVector.Perpendicular()); } } } }
private Vector?VectorOnSideOfNonHAtomFromStartLigands(Atom startAtom, Atom endAtom, IEnumerable <Atom> startLigands) { Vector posDisplacementVector = BondVector.Perpendicular(); Vector negDisplacementVector = -posDisplacementVector; posDisplacementVector.Normalize(); negDisplacementVector.Normalize(); posDisplacementVector = posDisplacementVector * 3; negDisplacementVector = negDisplacementVector * 3; Point posEndPoint = endAtom.Position + posDisplacementVector; Point negEndPoint = endAtom.Position + negDisplacementVector; Atom nonHAtom = startAtom.Neighbours.First(n => n != endAtom && (Element)n.Element != Globals.PeriodicTable.H); Point nonHAtomLoc = nonHAtom.Position; double posDist = (nonHAtomLoc - posEndPoint).Length; double negDist = (nonHAtomLoc - negEndPoint).Length; bool posDisplacement = posDist < negDist; Vector displacementVector = posDisplacement ? posDisplacementVector : negDisplacementVector; return(displacementVector); }
private Vector?VectorOnSideOfNonHAtomFromStartLigands(Atom startAtom, Atom endAtom) { Vector?displacementVector = null; // GitHub: Issue #15 https://github.com/Chem4Word/Version3/issues/15 try { Vector posDisplacementVector = BondVector.Perpendicular(); Vector negDisplacementVector = -posDisplacementVector; posDisplacementVector.Normalize(); negDisplacementVector.Normalize(); posDisplacementVector = posDisplacementVector * 3; negDisplacementVector = negDisplacementVector * 3; Point posEndPoint = endAtom.Position + posDisplacementVector; Point negEndPoint = endAtom.Position + negDisplacementVector; Atom nonHAtom = startAtom.Neighbours.FirstOrDefault(n => n != endAtom && n.Element as Element != Globals.PeriodicTable.H); if (nonHAtom != null) { Point nonHAtomLoc = nonHAtom.Position; double posDist = (nonHAtomLoc - posEndPoint).Length; double negDist = (nonHAtomLoc - negEndPoint).Length; bool posDisplacement = posDist < negDist; displacementVector = posDisplacement ? posDisplacementVector : negDisplacementVector; } } catch { // Do Nothing } return(displacementVector); }