Exemplo n.º 1
0
//virtual void set_type(int t) {type=t;}
    int solve( Site* s1, double k1,
               Site* s2, double k2,
               Site* s3, double k3, std::vector<Solution>& slns ) {
        if (debug && !silent)
            std::cout << "ALTSEPSolver.\n";
        Site* lsite;
        Site* psite;
        Site* third_site;
        double lsite_k,  third_site_k;

        if ( type == 0 ) {
            lsite = s3;
            lsite_k = k3;
            psite = s1; // psite_k = k1;    l3 / p1 form a separator
            third_site = s2;
            third_site_k = 1;
        } else if ( type == 1 ) {
            lsite = s3;
            lsite_k = k3;
            psite = s2; // psite_k = k2;    l3 / p2 form a separator
            third_site = s1;
            third_site_k = 1;
        } else {
            std::cout << "ALTSEPSolver FATAL ERROR! type not known.\n";
            exit(-1);
            return 0;
        }
        // separator direction
        Point sv = (k3 == - 1) ? Point(lsite->a(),lsite->b()) : Point(-lsite->a(),-lsite->b());

        if (debug && !silent) {
            std::cout << "ALTSEPSolver type="<< type <<"\n";
            std::cout << " s1= " << s1->str2() << "(k=" << k1<< ")\n";
            std::cout << " s2= " << s2->str2() << "(k=" << k2<< ")\n";
            std::cout << " s3= " << s3->str2() << "(k=" << k3<< ")\n";
            std::cout << " lsite_k=" << lsite_k << "\n";
            std::cout << " sv= " << sv << "\n";
        }


        // now we should have this:
        assert( lsite->isLine() && psite->isPoint() );

        double tsln(0);

        if ( third_site->isPoint() ) {
            double dx = psite->x() - third_site->x();
            double dy = psite->y() - third_site->y();
            if ( fabs(2*( dx*sv.x+dy*sv.y  )) > 0 ) {
                tsln = -(dx*dx+dy*dy) / (2*( dx*sv.x+dy*sv.y  )); // check for divide-by-zero?
            } else {
                //std::cout << " no solutions. (isPoint)\n";
                return 0;
            }
        } else if (third_site->isLine()) {
            if ( fabs(( sv.x*third_site->a() + sv.y*third_site->b() + third_site_k )) > 0 ) {
                tsln = -(third_site->a()*psite->x()+third_site->b()*psite->y()+third_site->c()) /
                       ( sv.x*third_site->a() + sv.y*third_site->b() + third_site_k );
            } else {
                //std::cout << " no solutions. (isLine)\n";
                return 0;
            }
        } else {
            assert(0);
            exit(-1);
        }
        Point psln = Point(psite->x(), psite->y() ) + tsln * sv;
        slns.push_back( Solution( psln, tsln, k3 ) );
        return 1;
    }