7 changed files with 119 additions and 202 deletions
			
			
		@ -0,0 +1,7 @@ | 
				
			|||
#ifndef INTERSECTION_H_ | 
				
			|||
#define INTERSECTION_H_ | 
				
			|||
 | 
				
			|||
#include "bvh.hpp" | 
				
			|||
bool CurveCurveBVHIntersect(BVH_AABB_NodePtr &BoxPtr1, BVH_AABB_NodePtr &BoxPtr2, std::vector<std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr>> &IstNodePtr); | 
				
			|||
 | 
				
			|||
#endif | 
				
			|||
@ -1,155 +0,0 @@ | 
				
			|||
#include "mathdef.hpp" | 
				
			|||
/*
 | 
				
			|||
 | 
				
			|||
// 默认id参数不用传,表示四个变量四个方程,id=1 or 2 的时候是2x2的方程组, id=3时是6x6的方程组, id=4 (x0,x1,x2... xn-1) 表示的方程组
 | 
				
			|||
vector<numeric> newton(const MUL_F &F, const vector<numeric> &init_point, const numeric &eps, bool &isConvergence, int id) | 
				
			|||
{ | 
				
			|||
    vector<symbol> symbols = {get_symbol("u"), get_symbol("v"), get_symbol("s"), get_symbol("t")}; | 
				
			|||
    if (id == 1) | 
				
			|||
        symbols = {get_symbol("u"), get_symbol("v")}; | 
				
			|||
    if (id == 2) | 
				
			|||
        symbols = {get_symbol("s"), get_symbol("t")}; | 
				
			|||
    if (id == 3) | 
				
			|||
        symbols = {get_symbol("u"), get_symbol("v"), get_symbol("s"), get_symbol("t"), get_symbol("p"), get_symbol("q")}; | 
				
			|||
    if (id == 4) | 
				
			|||
    { | 
				
			|||
        symbols = {}; | 
				
			|||
        for (int i = 0; i < init_point.size(); i++) | 
				
			|||
        { | 
				
			|||
            symbols.push_back(get_symbol("x" + to_string(i))); | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
    vector<numeric> x_val = init_point; | 
				
			|||
    vector<numeric> next_x; | 
				
			|||
 | 
				
			|||
    auto checkValue = [&F, &id, &symbols](vector<numeric> &point) | 
				
			|||
    { | 
				
			|||
        ex res = 0; | 
				
			|||
        lst l = {}; | 
				
			|||
        for (int i = 0; i < F.f.size(); i++) | 
				
			|||
        { | 
				
			|||
            l.append(symbols[i] == point[i]); | 
				
			|||
        } | 
				
			|||
        for (int i = 0; i < F.f.size(); i++) | 
				
			|||
        { | 
				
			|||
            ex f = F.f[i].func; | 
				
			|||
            res += abs(evalf(f.subs(l))); | 
				
			|||
        } | 
				
			|||
        return res; | 
				
			|||
    }; | 
				
			|||
    auto derivative = [&symbols](const ex &f, const symbol x, const vector<numeric> &val) | 
				
			|||
    { | 
				
			|||
        ex diff_f = f.diff(x); | 
				
			|||
        lst L = {}; | 
				
			|||
        for (int i = 0; i < val.size(); i++) | 
				
			|||
        { | 
				
			|||
            L.append(symbols[i] == val[i]); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        ex new_f = evalf(diff_f.subs(L)); | 
				
			|||
        return ex_to<numeric>(new_f); | 
				
			|||
    }; | 
				
			|||
    auto GetJacobinMat = [&derivative, &symbols](const MUL_F &F, const vector<numeric> &xk) | 
				
			|||
    { | 
				
			|||
        lst l = {}; | 
				
			|||
        int n = xk.size(); | 
				
			|||
        for (int i = 0; i < F.f.size(); i++) | 
				
			|||
        { | 
				
			|||
            for (int j = 0; j < n; j++) | 
				
			|||
            { | 
				
			|||
                auto tmp = derivative(F.f[i].func, symbols[j], xk); | 
				
			|||
                l.append(tmp); | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
        matrix result = matrix(F.f.size(), n, l); | 
				
			|||
        return result; | 
				
			|||
    }; | 
				
			|||
    auto fn = [&symbols](const ex &f, const vector<numeric> &val) | 
				
			|||
    { | 
				
			|||
        lst L = {}; | 
				
			|||
        for (int i = 0; i < val.size(); i++) | 
				
			|||
        { | 
				
			|||
            L.append(symbols[i] == val[i]); | 
				
			|||
        } | 
				
			|||
        ex new_f = evalf(f.subs(L)); | 
				
			|||
        return ex_to<numeric>(new_f); | 
				
			|||
    }; | 
				
			|||
    auto GetFk = [&symbols, &fn](const MUL_F &F, const vector<numeric> &xk) | 
				
			|||
    { | 
				
			|||
        lst l = {}; | 
				
			|||
        int n = F.f.size(); | 
				
			|||
        for (int i = 0; i < n; i++) | 
				
			|||
        { | 
				
			|||
            auto tmp = fn(F.f[i].func, xk); | 
				
			|||
            l.append(tmp); | 
				
			|||
        } | 
				
			|||
        matrix result = matrix(n, 1, l); | 
				
			|||
        return result; | 
				
			|||
    }; | 
				
			|||
    int n = F.f.size(); | 
				
			|||
    int limit = 300; | 
				
			|||
    isConvergence = true; | 
				
			|||
    numeric totalDelta; | 
				
			|||
    do | 
				
			|||
    { | 
				
			|||
        next_x.clear(); | 
				
			|||
        matrix grad = GetJacobinMat(F, x_val); | 
				
			|||
 | 
				
			|||
        matrix grad_t = grad.transpose(); | 
				
			|||
        matrix f_xk = GetFk(F, x_val); | 
				
			|||
 | 
				
			|||
        matrix JF_1; | 
				
			|||
        try | 
				
			|||
        { | 
				
			|||
            JF_1 = grad.inverse(); | 
				
			|||
        } | 
				
			|||
        catch (const std::exception &e) | 
				
			|||
        { | 
				
			|||
            cout << "grad = " << grad << endl; | 
				
			|||
            JF_1 = grad_t.mul(grad); | 
				
			|||
            isConvergence = false; | 
				
			|||
            for (int i = 0; i < F.f.size(); i++) | 
				
			|||
            { | 
				
			|||
                cout << "f = " << F.f[i].func << endl; | 
				
			|||
            } | 
				
			|||
            cout << __FILE__ << ":" << __LINE__ << " " << e.what() << endl; | 
				
			|||
            throw runtime_error("need to diff"); | 
				
			|||
            return x_val; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        auto result = JF_1.mul(f_xk); | 
				
			|||
        for (int i = 0; i < n; i++) | 
				
			|||
        { | 
				
			|||
            numeric step = (-ex_to<numeric>(result(i, 0))); | 
				
			|||
            next_x.push_back(x_val[i] + step); | 
				
			|||
        } | 
				
			|||
        totalDelta = 0; | 
				
			|||
        for (int i = 0; i < n; i++) | 
				
			|||
        { | 
				
			|||
            totalDelta = max(totalDelta, abs(x_val[i] - next_x[i])); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        if (totalDelta < eps) | 
				
			|||
            break; | 
				
			|||
        x_val = next_x; | 
				
			|||
        if (checkValue(x_val) < eps) | 
				
			|||
            break; | 
				
			|||
        limit--; | 
				
			|||
        if (!limit) | 
				
			|||
            break; | 
				
			|||
    } while (true); | 
				
			|||
    // cout << "limit = " << 300-limit << endl;
 | 
				
			|||
    if (checkValue(x_val) > eps) | 
				
			|||
    { | 
				
			|||
        isConvergence = false; | 
				
			|||
        //        cout << "totaldelta = " << totalDelta << endl;
 | 
				
			|||
        //        cout << "checkValue = " << checkValue(x_val) << endl;
 | 
				
			|||
    } | 
				
			|||
    //    if (totalDelta > eps) {
 | 
				
			|||
    //
 | 
				
			|||
    //        isConvergence = false;
 | 
				
			|||
    //    }
 | 
				
			|||
    return x_val; | 
				
			|||
} | 
				
			|||
 | 
				
			|||
*/ | 
				
			|||
					Loading…
					
					
				
		Reference in new issue