Changes in / [124e14:76102e]


Ignore:
Location:
src
Files:
2 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • src/boundary.cpp

    r124e14 r76102e  
    789789 * \param configuration contains box dimensions
    790790 * \param distance[NDIM] distance between filling molecules in each direction
    791  * \param boundary length of boundary zone between molecule and filling mollecules
    792791 * \param epsilon distance to surface which is not filled
    793792 * \param RandAtomDisplacement maximum distance for random displacement per atom
     
    796795 * \return *mol pointer to new molecule with filled atoms
    797796 */
    798 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double boundary, const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation)
     797molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation)
    799798{
    800799        Info FunctionInfo(__func__);
     
    857856            FillIt = false;
    858857          } else {
    859             const double distance = (TesselStruct[i]->GetDistanceSquaredToSurface(CurrentPosition, LCList[i]));
    860             FillIt = FillIt && (distance > boundary*boundary);
    861             if (FillIt) {
     858            const bool FillResult = (!TesselStruct[i]->IsInnerPoint(CurrentPosition, LCList[i]));
     859            FillIt = FillIt && FillResult;
     860            if (FillResult) {
    862861              Log() << Verbose(1) << "INFO: Position at " << CurrentPosition << " is outer point." << endl;
    863862            } else {
    864               Log() << Verbose(1) << "INFO: Position at " << CurrentPosition << " is inner point or within boundary." << endl;
    865               break;
     863              Log() << Verbose(1) << "INFO: Position at " << CurrentPosition << " is inner point." << endl;
    866864            }
    867865            i++;
  • src/boundary.hpp

    r124e14 r76102e  
    4949
    5050double ConvexizeNonconvexEnvelope(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename);
    51 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double boundary, const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation);
     51molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation);
    5252void FindConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *LCList, const char *filename);
    5353Vector* FindEmbeddingHole(MoleculeListClass *mols, molecule *srcmol);
  • src/builder.cpp

    r124e14 r76102e  
    17381738              if (argptr+6 >=argc) {
    17391739                ExitFlag = 255;
    1740                 eLog() << Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <dist_x> <dist_y> <dist_z> <boundary> <randatom> <randmol> <DoRotate>" << endl;
     1740                eLog() << Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <dist_x> <dist_y> <dist_z> <randatom> <randmol> <DoRotate>" << endl;
    17411741                performCriticalExit();
    17421742              } else {
     
    17691769                for (int i=0;i<NDIM;i++)
    17701770                  distance[i] = atof(argv[argptr+i]);
    1771                 Filling = FillBoxWithMolecule(molecules, filler, configuration, distance, atof(argv[argptr+3]), atof(argv[argptr+4]), atof(argv[argptr+5]), atoi(argv[argptr+6]));
     1771                Filling = FillBoxWithMolecule(molecules, filler, configuration, distance, atof(argv[argptr+3]), atof(argv[argptr+4]), atoi(argv[argptr+5]));
    17721772                if (Filling != NULL) {
    17731773                  Filling->ActiveFlag = false;
  • src/tesselation.cpp

    r124e14 r76102e  
    3535 * \param *Walker TesselPoint this boundary point represents
    3636 */
    37 BoundaryPointSet::BoundaryPointSet(TesselPoint * const Walker) :
     37BoundaryPointSet::BoundaryPointSet(TesselPoint * Walker) :
    3838  LinesCount(0),
    3939  node(Walker),
     
    6161 * \param *line line to add
    6262 */
    63 void BoundaryPointSet::AddLine(BoundaryLineSet * const line)
     63void BoundaryPointSet::AddLine(class BoundaryLineSet *line)
    6464{
    6565        Info FunctionInfo(__func__);
     
    105105 * \param number number of the list
    106106 */
    107 BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point[2], const int number)
     107BoundaryLineSet::BoundaryLineSet(class BoundaryPointSet *Point[2], const int number)
    108108{
    109109        Info FunctionInfo(__func__);
     
    115115  Point[0]->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding.
    116116  Point[1]->AddLine(this); //
    117   // set skipped to false
    118   skipped = false;
    119   // clear triangles list
    120   Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl;
    121 };
    122 
    123 /** Constructor of BoundaryLineSet with two endpoints.
    124  * Adds line automatically to each endpoints' LineMap
    125  * \param *Point1 first boundary point
    126  * \param *Point2 second boundary point
    127  * \param number number of the list
    128  */
    129 BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number)
    130 {
    131   Info FunctionInfo(__func__);
    132   // set number
    133   Nr = number;
    134   // set endpoints in ascending order
    135   SetEndpointsOrdered(endpoints, Point1, Point2);
    136   // add this line to the hash maps of both endpoints
    137   Point1->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding.
    138   Point2->AddLine(this); //
    139117  // set skipped to false
    140118  skipped = false;
     
    193171 * \param *triangle to add
    194172 */
    195 void BoundaryLineSet::AddTriangle(BoundaryTriangleSet * const triangle)
     173void BoundaryLineSet::AddTriangle(class BoundaryTriangleSet *triangle)
    196174{
    197175        Info FunctionInfo(__func__);
     
    204182 * \return true - common endpoint present, false - not connected
    205183 */
    206 bool BoundaryLineSet::IsConnectedTo(const BoundaryLineSet * const line) const
     184bool BoundaryLineSet::IsConnectedTo(class BoundaryLineSet *line)
    207185{
    208186        Info FunctionInfo(__func__);
     
    219197 * \return true - triangles are convex, false - concave or less than two triangles connected
    220198 */
    221 bool BoundaryLineSet::CheckConvexityCriterion() const
     199bool BoundaryLineSet::CheckConvexityCriterion()
    222200{
    223201        Info FunctionInfo(__func__);
     
    243221  int i=0;
    244222  class BoundaryPointSet *node = NULL;
    245   for(TriangleMap::const_iterator runner = triangles.begin(); runner != triangles.end(); runner++) {
     223  for(TriangleMap::iterator runner = triangles.begin(); runner != triangles.end(); runner++) {
    246224    //Log() << Verbose(0) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl;
    247225    NormalCheck.AddVector(&runner->second->NormalVector);
     
    286264 * \return true - point is of the line, false - is not
    287265 */
    288 bool BoundaryLineSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const
     266bool BoundaryLineSet::ContainsBoundaryPoint(class BoundaryPointSet *point)
    289267{
    290268        Info FunctionInfo(__func__);
     
    299277 * \return NULL - if endpoint not contained in BoundaryLineSet, or pointer to BoundaryPointSet otherwise
    300278 */
    301 class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(const BoundaryPointSet * const point) const
     279class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(class BoundaryPointSet *point)
    302280{
    303281        Info FunctionInfo(__func__);
     
    339317 * \param number number of triangle
    340318 */
    341 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number) :
     319BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet *line[3], int number) :
    342320  Nr(number)
    343321{
     
    398376 * \param &OtherVector direction vector to make normal vector unique.
    399377 */
    400 void BoundaryTriangleSet::GetNormalVector(const Vector &OtherVector)
     378void BoundaryTriangleSet::GetNormalVector(Vector &OtherVector)
    401379{
    402380        Info FunctionInfo(__func__);
     
    412390/** Finds the point on the triangle \a *BTS through which the line defined by \a *MolCenter and \a *x crosses.
    413391 * We call Vector::GetIntersectionWithPlane() to receive the intersection point with the plane
    414  * Thus we test if it's really on the plane and whether it's inside the triangle on the plane or not.
     392 * This we test if it's really on the plane and whether it's inside the triangle on the plane or not.
    415393 * The latter is done as follows: We calculate the cross point of one of the triangle's baseline with the line
    416394 * given by the intersection and the third basepoint. Then, we check whether it's on the baseline (i.e. between
     
    422400 * \return true - \a *Intersection contains intersection on plane defined by triangle, false - zero vector if outside of triangle.
    423401 */
    424 bool BoundaryTriangleSet::GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const
     402bool BoundaryTriangleSet::GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection)
    425403{
    426404  Info FunctionInfo(__func__);
     
    474452};
    475453
    476 /** Finds the point on the triangle \a *BTS through which the line defined by \a *MolCenter and \a *x crosses.
    477  * We call Vector::GetIntersectionWithPlane() to receive the intersection point with the plane
    478  * Thus we test if it's really on the plane and whether it's inside the triangle on the plane or not.
    479  * The latter is done as follows: We calculate the cross point of one of the triangle's baseline with the line
    480  * given by the intersection and the third basepoint. Then, we check whether it's on the baseline (i.e. between
    481  * the first two basepoints) or not.
    482  * \param *x point
    483  * \param *ClosestPoint desired closest point inside triangle to \a *x, is absolute vector
    484  * \return Distance squared between \a *x and closest point inside triangle
    485  */
    486 double BoundaryTriangleSet::GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const
    487 {
    488   Info FunctionInfo(__func__);
    489   Vector Direction;
    490 
    491   // 1. get intersection with plane
    492   Log() << Verbose(1) << "INFO: Looking for closest point of triangle " << *this << " to " << *x << "." << endl;
    493   GetCenter(&Direction);
    494   if (!ClosestPoint->GetIntersectionWithPlane(&NormalVector, endpoints[0]->node->node, x, &Direction)) {
    495     ClosestPoint->CopyVector(x);
    496   }
    497 
    498   // 2. Calculate in plane part of line (x, intersection)
    499   Vector InPlane;
    500   InPlane.CopyVector(x);
    501   InPlane.SubtractVector(ClosestPoint);  // points from plane intersection to straight-down point
    502   InPlane.ProjectOntoPlane(&NormalVector);
    503   InPlane.AddVector(ClosestPoint);
    504 
    505   Log() << Verbose(2) << "INFO: Triangle is " << *this << "." << endl;
    506   Log() << Verbose(2) << "INFO: Line is from " << Direction << " to " << *x << "." << endl;
    507   Log() << Verbose(2) << "INFO: In-plane part is " << InPlane << "." << endl;
    508 
    509   // Calculate cross point between one baseline and the desired point such that distance is shortest
    510   double ShortestDistance = -1.;
    511   bool InsideFlag = false;
    512   Vector CrossDirection[3];
    513   Vector CrossPoint[3];
    514   Vector helper;
    515   for (int i=0;i<3;i++) {
    516     // treat direction of line as normal of a (cut)plane and the desired point x as the plane offset, the intersect line with point
    517     Direction.CopyVector(endpoints[(i+1)%3]->node->node);
    518     Direction.SubtractVector(endpoints[i%3]->node->node);
    519     // calculate intersection, line can never be parallel to Direction (is the same vector as PlaneNormal);
    520     CrossPoint[i].GetIntersectionWithPlane(&Direction, &InPlane, endpoints[i%3]->node->node, endpoints[(i+1)%3]->node->node);
    521     CrossDirection[i].CopyVector(&CrossPoint[i]);
    522     CrossDirection[i].SubtractVector(&InPlane);
    523     CrossPoint[i].SubtractVector(endpoints[i%3]->node->node);  // cross point was returned as absolute vector
    524     const double s = CrossPoint[i].ScalarProduct(&Direction)/Direction.NormSquared();
    525     Log() << Verbose(2) << "INFO: Factor s is " << s << "." << endl;
    526     if ((s >= -MYEPSILON) && ((s-1.) <= MYEPSILON)) {
    527       CrossPoint[i].AddVector(endpoints[i%3]->node->node);  // make cross point absolute again
    528       Log() << Verbose(2) << "INFO: Crosspoint is " << CrossPoint[i] << ", intersecting BoundaryLine between " << *endpoints[i%3]->node->node << " and " << *endpoints[(i+1)%3]->node->node << "." << endl;
    529       const double distance = CrossPoint[i].DistanceSquared(x);
    530       if ((ShortestDistance < 0.) || (ShortestDistance > distance)) {
    531         ShortestDistance = distance;
    532         ClosestPoint->CopyVector(&CrossPoint[i]);
    533       }
    534     } else
    535       CrossPoint[i].Zero();
    536   }
    537   InsideFlag = true;
    538   for (int i=0;i<3;i++) {
    539     const double sign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+1)%3]);
    540     const double othersign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+2)%3]);;
    541     if ((sign > -MYEPSILON) && (othersign > -MYEPSILON))  // have different sign
    542       InsideFlag = false;
    543   }
    544   if (InsideFlag) {
    545     ClosestPoint->CopyVector(&InPlane);
    546     ShortestDistance = InPlane.DistanceSquared(x);
    547   } else {  // also check endnodes
    548     for (int i=0;i<3;i++) {
    549       const double distance = x->DistanceSquared(endpoints[i]->node->node);
    550       if ((ShortestDistance < 0.) || (ShortestDistance > distance)) {
    551         ShortestDistance = distance;
    552         ClosestPoint->CopyVector(endpoints[i]->node->node);
    553       }
    554     }
    555   }
    556   Log() << Verbose(1) << "INFO: Closest Point is " << *ClosestPoint << " with shortest squared distance is " << ShortestDistance << "." << endl;
    557   return ShortestDistance;
    558 };
    559 
    560454/** Checks whether lines is any of the three boundary lines this triangle contains.
    561455 * \param *line line to test
    562456 * \return true - line is of the triangle, false - is not
    563457 */
    564 bool BoundaryTriangleSet::ContainsBoundaryLine(const BoundaryLineSet * const line) const
     458bool BoundaryTriangleSet::ContainsBoundaryLine(class BoundaryLineSet *line)
    565459{
    566460        Info FunctionInfo(__func__);
     
    575469 * \return true - point is of the triangle, false - is not
    576470 */
    577 bool BoundaryTriangleSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const
     471bool BoundaryTriangleSet::ContainsBoundaryPoint(class BoundaryPointSet *point)
    578472{
    579473        Info FunctionInfo(__func__);
     
    588482 * \return true - point is of the triangle, false - is not
    589483 */
    590 bool BoundaryTriangleSet::ContainsBoundaryPoint(const TesselPoint * const point) const
     484bool BoundaryTriangleSet::ContainsBoundaryPoint(class TesselPoint *point)
    591485{
    592486        Info FunctionInfo(__func__);
     
    601495 * \return true - is the very triangle, false - is not
    602496 */
    603 bool BoundaryTriangleSet::IsPresentTupel(const BoundaryPointSet * const Points[3]) const
     497bool BoundaryTriangleSet::IsPresentTupel(class BoundaryPointSet *Points[3])
    604498{
    605499        Info FunctionInfo(__func__);
     
    624518 * \return true - is the very triangle, false - is not
    625519 */
    626 bool BoundaryTriangleSet::IsPresentTupel(const BoundaryTriangleSet * const T) const
     520bool BoundaryTriangleSet::IsPresentTupel(class BoundaryTriangleSet *T)
    627521{
    628522        Info FunctionInfo(__func__);
     
    646540 * \return pointer third endpoint or NULL if line does not belong to triangle.
    647541 */
    648 class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(const BoundaryLineSet * const line) const
     542class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(class BoundaryLineSet *line)
    649543{
    650544        Info FunctionInfo(__func__);
     
    663557 * \param *center central point on return.
    664558 */
    665 void BoundaryTriangleSet::GetCenter(Vector * const center) const
     559void BoundaryTriangleSet::GetCenter(Vector *center)
    666560{
    667561        Info FunctionInfo(__func__);
     
    670564    center->AddVector(endpoints[i]->node->node);
    671565  center->Scale(1./3.);
    672   Log() << Verbose(1) << "INFO: Center is at " << *center << "." << endl;
    673566}
    674567
     
    32423135  // for each point, check its lines, remember closest
    32433136  Log() << Verbose(1) << "Finding closest BoundaryTriangle to " << *x << " ... " << endl;
    3244   LineSet ClosestLines;
     3137  BoundaryLineSet *ClosestLine = NULL;
    32453138  double MinDistance = 1e+16;
    32463139  Vector BaseLineIntersection;
     
    32643157
    32653158      if ((lengthEndA > lengthBase) || (lengthEndB > lengthBase) || ((lengthEndA < MYEPSILON) || (lengthEndB < MYEPSILON))) {  // intersection would be outside, take closer endpoint
    3266         const double lengthEnd = Min(lengthEndA, lengthEndB);
    3267         if (lengthEnd - MinDistance < -MYEPSILON) { // new best line
    3268           ClosestLines.clear();
    3269           ClosestLines.insert(LineRunner->second);
    3270           MinDistance = lengthEnd;
    3271           Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[0]->node << " is closer with " << lengthEnd << "." << endl;
    3272         } else if  (fabs(lengthEnd - MinDistance) < MYEPSILON) { // additional best candidate
    3273           ClosestLines.insert(LineRunner->second);
    3274           Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[1]->node << " is equally good with " << lengthEnd << "." << endl;
    3275         } else { // line is worse
     3159        if ((lengthEndA < MinDistance) && (lengthEndA < lengthEndB)) {
     3160          ClosestLine = LineRunner->second;
     3161          MinDistance = lengthEndA;
     3162          Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[0]->node << " is closer with " << lengthEndA << "." << endl;
     3163        } else if (lengthEndB < MinDistance) {
     3164          ClosestLine = LineRunner->second;
     3165          MinDistance = lengthEndB;
     3166          Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[1]->node << " is closer with " << lengthEndB << "." << endl;
     3167        } else {
    32763168          Log() << Verbose(1) << "REJECT: Line " << *LineRunner->second << " to either endpoints is further away than present closest line candidate: " << lengthEndA << ", " << lengthEndB << ", and distance is longer than baseline:" << lengthBase << "." << endl;
    32773169        }
     
    32873179          eLog() << Verbose(0) << "Algorithmic error: In second case we have intersection outside of baseline!" << endl;
    32883180        }
    3289         if ((ClosestLines.empty()) || (distance < MinDistance)) {
    3290           ClosestLines.insert(LineRunner->second);
     3181        if ((ClosestLine == NULL) || (distance < MinDistance)) {
     3182          ClosestLine = LineRunner->second;
    32913183          MinDistance = distance;
    3292           Log() << Verbose(1) << "ACCEPT: Intersection in between endpoints, new closest line " << *LineRunner->second << " is " << *ClosestLines.begin() << " with projected distance " << MinDistance << "." << endl;
     3184          Log() << Verbose(1) << "ACCEPT: Intersection in between endpoints, new closest line " << *LineRunner->second << " is " << *ClosestLine << " with projected distance " << MinDistance << "." << endl;
    32933185        } else {
    32943186          Log() << Verbose(2) << "REJECT: Point is further away from line " << *LineRunner->second << " than present closest line: " << distance << " >> " << MinDistance << "." << endl;
     
    33003192
    33013193  // check whether closest line is "too close" :), then it's inside
    3302   if (ClosestLines.empty()) {
     3194  if (ClosestLine == NULL) {
    33033195    Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl;
    33043196    return NULL;
    33053197  }
    33063198  TriangleList * candidates = new TriangleList;
    3307   for (LineSet::iterator LineRunner = ClosestLines.begin(); LineRunner != ClosestLines.end(); LineRunner++)
    3308     for (TriangleMap::iterator Runner = (*LineRunner)->triangles.begin(); Runner != (*LineRunner)->triangles.end(); Runner++) {
     3199  for (TriangleMap::iterator Runner = ClosestLine->triangles.begin(); Runner != ClosestLine->triangles.end(); Runner++) {
    33093200    candidates->push_back(Runner->second);
    33103201  }
     
    33503241};
    33513242
    3352 /** Checks whether the provided Vector is within the Tesselation structure.
    3353  * Basically calls Tesselation::GetDistanceToSurface() and checks the sign of the return value.
    3354  * @param point of which to check the position
    3355  * @param *LC LinkedCell structure
    3356  *
    3357  * @return true if the point is inside the Tesselation structure, false otherwise
    3358  */
    3359 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const
    3360 {
    3361   return (GetDistanceSquaredToSurface(Point, LC) > MYEPSILON);
    3362 }
    3363 
    3364 /** Returns the distance to the surface given by the tesselation.
     3243/** Checks whether the provided Vector is within the tesselation structure.
    33653244 * Calls FindClosestTriangleToVector() and checks whether the resulting triangle's BoundaryTriangleSet#NormalVector points
    3366  * towards or away from the given \a &Point. Additionally, we check whether it's normal to the normal vector, i.e. on the
    3367  * closest triangle's plane. Then, we have to check whether \a Point is inside the triangle or not to determine whether it's
    3368  * an inside or outside point. This is done by calling BoundaryTriangleSet::GetIntersectionInsideTriangle().
    3369  * In the end we additionally find the point on the triangle who was smallest distance to \a Point:
    3370  *  -# Separate distance from point to center in vector in NormalDirection and on the triangle plane.
    3371  *  -# Check whether vector on triangle plane points inside the triangle or crosses triangle bounds.
    3372  *  -# If inside, take it to calculate closest distance
    3373  *  -# If not, take intersection with BoundaryLine as distance
    3374  *
    3375  * @note distance is squared despite it still contains a sign to determine in-/outside!
     3245 * towards or away from the given \a &Point.
    33763246 *
    33773247 * @param point of which to check the position
    33783248 * @param *LC LinkedCell structure
    33793249 *
    3380  * @return >0 if outside, ==0 if on surface, <0 if inside (Note that distance can be at most LinkedCell::RADIUS.)
    3381  */
    3382 double Tesselation::GetDistanceSquaredToSurface(const Vector &Point, const LinkedCell* const LC) const
     3250 * @return true if the point is inside the tesselation structure, false otherwise
     3251 */
     3252bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const
    33833253{
    33843254  Info FunctionInfo(__func__);
     
    33883258  Vector DistanceToCenter;
    33893259  Vector Intersection;
    3390   double distance = 0.;
    33913260
    33923261  if (result == NULL) {// is boundary point or only point in point cloud?
    33933262    Log() << Verbose(1) << Point << " is the only point in vicinity." << endl;
    3394     return LC->RADIUS;
     3263    return false;
    33953264  } else {
    33963265    Log() << Verbose(1) << "INFO: Closest triangle found is " << *result << " with normal vector " << result->NormalVector << "." << endl;
     
    34133282    if (result->GetIntersectionInsideTriangle(&Center, &DistanceToCenter, &Intersection)) {
    34143283      Log() << Verbose(1) << Point << " is inner point: sufficiently close to boundary, " << Intersection << "." << endl;
    3415       return 0.;
     3284      return true;
    34163285    } else {
    34173286      Log() << Verbose(1) << Point << " is NOT an inner point: on triangle plane but outside of triangle bounds." << endl;
    34183287      return false;
    34193288    }
     3289  }
     3290
     3291  // then check direction to boundary
     3292  if (DistanceToCenter.ScalarProduct(&result->NormalVector) > MYEPSILON) {
     3293    Log() << Verbose(1) << Point << " is an inner point." << endl;
     3294    return true;
    34203295  } else {
    3421     // calculate smallest distance
    3422     distance = result->GetClosestPointInsideTriangle(&Point, &Intersection);
    3423     Log() << Verbose(1) << "Closest point on triangle is " << Intersection << "." << endl;
    3424     distance = Min(distance, (LC->RADIUS*LC->RADIUS));
    3425 
    3426     // then check direction to boundary
    3427     if (DistanceToCenter.ScalarProduct(&result->NormalVector) > MYEPSILON) {
    3428       Log() << Verbose(1) << Point << " is an inner point, " << distance << " below surface." << endl;
    3429       return -distance;
    3430     } else {
    3431       Log() << Verbose(1) << Point << " is NOT an inner point, " << distance << " above surface." << endl;
    3432       return +distance;
    3433     }
    3434   }
    3435 };
     3296    Log() << Verbose(1) << Point << " is NOT an inner point." << endl;
     3297    return false;
     3298  }
     3299}
    34363300
    34373301/** Gets all points connected to the provided point by triangulation lines.
  • src/tesselation.hpp

    r124e14 r76102e  
    106106  public:
    107107    BoundaryPointSet();
    108     BoundaryPointSet(TesselPoint * const Walker);
     108    BoundaryPointSet(TesselPoint * Walker);
    109109    ~BoundaryPointSet();
    110110
    111     void AddLine(BoundaryLineSet * const line);
     111    void AddLine(class BoundaryLineSet *line);
    112112
    113113    LineMap lines;
     
    125125  public:
    126126    BoundaryLineSet();
    127     BoundaryLineSet(BoundaryPointSet * const Point[2], const int number);
    128     BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number);
     127    BoundaryLineSet(class BoundaryPointSet *Point[2], const int number);
    129128    ~BoundaryLineSet();
    130129
    131     void AddTriangle(BoundaryTriangleSet * const triangle);
    132     bool IsConnectedTo(const BoundaryLineSet * const line) const;
    133     bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const;
    134     bool CheckConvexityCriterion() const;
    135     class BoundaryPointSet *GetOtherEndpoint(const BoundaryPointSet * const point) const;
     130    void AddTriangle(class BoundaryTriangleSet *triangle);
     131    bool IsConnectedTo(class BoundaryLineSet *line);
     132    bool ContainsBoundaryPoint(class BoundaryPointSet *point);
     133    bool CheckConvexityCriterion();
     134    class BoundaryPointSet *GetOtherEndpoint(class BoundaryPointSet *);
    136135
    137136    class BoundaryPointSet *endpoints[2];
     
    148147  public:
    149148    BoundaryTriangleSet();
    150     BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number);
     149    BoundaryTriangleSet(class BoundaryLineSet *line[3], int number);
    151150    ~BoundaryTriangleSet();
    152151
    153     void GetNormalVector(const Vector &NormalVector);
    154     void GetCenter(Vector * const center) const;
    155     bool GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const;
    156     double GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const;
    157     bool ContainsBoundaryLine(const BoundaryLineSet * const line) const;
    158     bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const;
    159     bool ContainsBoundaryPoint(const TesselPoint * const point) const;
    160     class BoundaryPointSet *GetThirdEndpoint(const BoundaryLineSet * const line) const;
    161     bool IsPresentTupel(const BoundaryPointSet * const Points[3]) const;
    162     bool IsPresentTupel(const BoundaryTriangleSet * const T) const;
     152    void GetNormalVector(Vector &NormalVector);
     153    void GetCenter(Vector *center);
     154    bool GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection);
     155    bool ContainsBoundaryLine(class BoundaryLineSet *line);
     156    bool ContainsBoundaryPoint(class BoundaryPointSet *point);
     157    bool ContainsBoundaryPoint(class TesselPoint *point);
     158    class BoundaryPointSet *GetThirdEndpoint(class BoundaryLineSet *line);
     159    bool IsPresentTupel(class BoundaryPointSet *Points[3]);
     160    bool IsPresentTupel(class BoundaryTriangleSet *T);
    163161
    164162    class BoundaryPointSet *endpoints[3];
     
    315313    class BoundaryTriangleSet * FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const;
    316314    bool IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const;
    317     double GetDistanceSquaredToSurface(const Vector &Point, const LinkedCell* const LC) const;
    318315    bool AddBoundaryPoint(TesselPoint * Walker, const int n);
    319316    DistanceToPointMap * FindClosestBoundaryPointsToVector(const Vector *x, const LinkedCell* LC) const;
  • src/unittests/Makefile.am

    r124e14 r76102e  
    2222  StackClassUnitTest \
    2323  TesselationUnitTest \
    24   Tesselation_BoundaryTriangleUnitTest \
    25   Tesselation_InOutsideUnitTest \
     24  TesselationInOutsideUnitTest \
    2625  VectorUnitTest
    2726 
     
    8079TesselationUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a
    8180
    82 Tesselation_BoundaryTriangleUnitTest_SOURCES = tesselation_boundarytriangleunittest.cpp tesselation_boundarytriangleunittest.hpp
    83 Tesselation_BoundaryTriangleUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a
    84 
    85 Tesselation_InOutsideUnitTest_SOURCES = tesselation_insideoutsideunittest.cpp tesselation_insideoutsideunittest.hpp
    86 Tesselation_InOutsideUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a
     81TesselationInOutsideUnitTest_SOURCES = tesselation_insideoutsideunittest.cpp tesselation_insideoutsideunittest.hpp
     82TesselationInOutsideUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a
    8783
    8884VectorUnitTest_SOURCES = vectorunittest.cpp vectorunittest.hpp
  • src/vector.cpp

    r124e14 r76102e  
    222222 * \param *Origin first vector of line
    223223 * \param *LineVector second vector of line
    224  * \return true -  \a this contains intersection point on return, false - line is parallel to plane (even if in-plane)
     224 * \return true -  \a this contains intersection point on return, false - line is parallel to plane
    225225 */
    226226bool Vector::GetIntersectionWithPlane(const Vector * const PlaneNormal, const Vector * const PlaneOffset, const Vector * const Origin, const Vector * const LineVector)
     
    235235  Direction.Normalize();
    236236  Log() << Verbose(1) << "INFO: Direction is " << Direction << "." << endl;
    237   //Log() << Verbose(1) << "INFO: PlaneNormal is " << *PlaneNormal << " and PlaneOffset is " << *PlaneOffset << "." << endl;
    238237  factor = Direction.ScalarProduct(PlaneNormal);
    239   if (fabs(factor) < MYEPSILON) { // Uniqueness: line parallel to plane?
    240     Log() << Verbose(1) << "BAD: Line is parallel to plane, no intersection." << endl;
     238  if (factor < MYEPSILON) { // Uniqueness: line parallel to plane?
     239    eLog() << Verbose(2) << "Line is parallel to plane, no intersection." << endl;
    241240    return false;
    242241  }
     
    244243  helper.SubtractVector(Origin);
    245244  factor = helper.ScalarProduct(PlaneNormal)/factor;
    246   if (fabs(factor) < MYEPSILON) { // Origin is in-plane
    247     Log() << Verbose(1) << "GOOD: Origin of line is in-plane." << endl;
     245  if (factor < MYEPSILON) { // Origin is in-plane
     246    Log() << Verbose(1) << "Origin of line is in-plane, simple." << endl;
    248247    CopyVector(Origin);
    249248    return true;
     
    259258  helper.SubtractVector(PlaneOffset);
    260259  if (helper.ScalarProduct(PlaneNormal) < MYEPSILON) {
    261     Log() << Verbose(1) << "GOOD: Intersection is " << *this << "." << endl;
     260    Log() << Verbose(1) << "INFO: Intersection at " << *this << " is good." << endl;
    262261    return true;
    263262  } else {
     
    354353  Vector parallel;
    355354  double factor = 0.;
     355  double pfactor = 0.;
    356356  if (fabs(a.ScalarProduct(&b)*a.ScalarProduct(&b)/a.NormSquared()/b.NormSquared() - 1.) < MYEPSILON) {
    357357    parallel.CopyVector(Line1a);
Note: See TracChangeset for help on using the changeset viewer.