/* $Id$ * * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * * This file is part of OpenCAMlib * (see https://github.com/aewallin/opencamlib). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #include #include #include "clpoint.hpp" namespace ocl { /* ********************************************** CLPoint *************/ CLPoint::CLPoint() : Point() { cc = new CCPoint(); } CLPoint::CLPoint(double x, double y, double z) : Point(x,y,z) { cc = new CCPoint(); } CLPoint::CLPoint(double x, double y, double z, CCPoint& ccp) : Point(x,y,z) { cc = new CCPoint( ccp ); } CLPoint::CLPoint(const CLPoint& cl) : Point(cl.x,cl.y,cl.z) { cc = new CCPoint( *cl.cc ); } CLPoint::CLPoint(const Point& p) : Point(p.x,p.y,p.z) { cc = new CCPoint(); } CLPoint::~CLPoint() { delete cc.load(); } bool CLPoint::below(const Triangle& t) const { if (z < t.bb.maxpt.z ) return true; else return false; } bool CLPoint::liftZ(const double zin) { if (zin>z) { z=zin; return true; } else { return false; } } bool CLPoint::liftZ(double zin, CCPoint& ccp) { if (zin>z) { z=zin; auto newCC = new CCPoint(ccp); auto prevCC = cc.load(); auto expected = prevCC; // Protect against race between concurrent liftZ calls in multiple // threads cc.compare_exchange_strong(expected, newCC); if (prevCC == expected) { // Successfully replaced cc, go ahead & delete prevCC delete prevCC; } else { // Another thread won the race, back off. delete newCC; } return true; } else { return false; } } bool CLPoint::liftZ_if_InsidePoints(double zin, CCPoint& cc_tmp, const Point& p1,const Point& p2) { if ( cc_tmp.isInside(p1, p2) ) return this->liftZ(zin, cc_tmp); return false; } bool CLPoint::liftZ_if_inFacet(double zin, CCPoint& cc_tmp, const Triangle& t) { if ( cc_tmp.isInside(t) ) return this->liftZ(zin, cc_tmp); return false; } CLPoint& CLPoint::operator=(const CLPoint &clp) { if (this == &clp) // check for self-assignment return *this; x=clp.x; y=clp.y; z=clp.z; if (cc) { delete cc.load(); } cc= new CCPoint( *(clp.cc) ); return *this; } const CLPoint CLPoint::operator+(const CLPoint &p) const { return CLPoint(this->x + p.x, this->y + p.y, this->z + p.z); } const CLPoint CLPoint::operator+(const Point &p) const { return CLPoint(this->x + p.x, this->y + p.y, this->z + p.z); } CCPoint CLPoint::getCC() { return *cc; } std::string CLPoint::str() const { std::ostringstream o; o << "CL(" << x << ", " << y << ", " << z << ") cc=" << *cc ; return o.str(); } } // end namespace // end file clpoint.cpp