Beispiel #1
0
        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());
                    }
                }
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }