QList<RS_Circle> RS_Circle::createTan3(const QVector<RS_AtomicEntity*>& circles) { QList<RS_Circle> ret; if(circles.size()!=3) return ret; QList<RS_Circle> cs; for(unsigned short i=0;i<3;i++){ cs<<RS_Circle(NULL,RS_CircleData(circles.at(i)->getCenter(),circles.at(i)->getRadius())); } unsigned short flags=0; do{ ret.append(solveAppolloniusSingle(cs)); flags++; unsigned short j=0; for(unsigned short i=1u;i<=4u;i<<=1){ if(flags & i) { cs[j].setRadius( - fabs(cs[j].getRadius())); }else{ cs[j].setRadius( fabs(cs[j].getRadius())); } j++; } }while(flags<8u); // std::cout<<__FILE__<<" : "<<__FUNCTION__<<" : line "<<__LINE__<<std::endl; // std::cout<<"before testing, ret.size()="<<ret.size()<<std::endl; for(int i=0;i<ret.size();){ if(ret[i].testTan3(circles) == false) { ret.erase(ret.begin()+i); }else{ i++; } } // std::cout<<"after testing, ret.size()="<<ret.size()<<std::endl; return ret; }
std::vector<RS_Circle> RS_Circle::createTan3(const std::vector<RS_AtomicEntity*>& circles) { std::vector<RS_Circle> ret; if(circles.size()!=3) return ret; std::vector<RS_Circle> cs; for(auto c: circles){ cs.emplace_back(RS_Circle(nullptr, {c->getCenter(),c->getRadius()})); } unsigned short flags=0; do{ for(unsigned short j=0u;j<3u;++j){ if(flags & (1u<<j)) { cs[j].setRadius( - fabs(cs[j].getRadius())); }else{ cs[j].setRadius( fabs(cs[j].getRadius())); } } // RS_DEBUG->print(RS_Debug::D_ERROR, "flags=%d\n",flags); auto list=solveAppolloniusSingle(cs); if(list.size()>=1){ for(RS_Circle& c0: list){ bool addNew=true; for(RS_Circle& c: ret){ if((c0.getCenter()-c.getCenter()).squared()<RS_TOLERANCE15 && fabs(c0.getRadius() - c.getRadius())<RS_TOLERANCE){ addNew=false; break; } } if(addNew) ret.push_back(c0); } } }while(++flags<8u); // std::cout<<__FILE__<<" : "<<__func__<<" : line "<<__LINE__<<std::endl; // std::cout<<"before testing, ret.size()="<<ret.size()<<std::endl; for(size_t i=0;i<ret.size();){ if(ret[i].testTan3(circles) == false) { ret.erase(ret.begin()+i); }else{ ++i; } } // DEBUG_HEADER // std::cout<<"after testing, ret.size()="<<ret.size()<<std::endl; return ret; }