#include "point.hpp" #include <vector> #include "catch.hpp" #include "bspline.hpp" #include "testutils.hpp" #include "periodic_bspline_cons.hpp" #include "raise_degree.hpp" TEST_CASE("raise_degree", "[periodic_bspline][degree]") { cpts2d_t pts(4); pts[0] = make_pt(0.0,0.0); pts[1] = make_pt(0.4,0.3); pts[2] = make_pt(0.2,0.8); pts[3] = make_pt(-0.2, 0.4); //pts[4] = make_pt(0.0,0.0); std::vector<double> ks(5); ks[0] = 0.0; ks[1] = 0.3; ks[2] = 0.6; ks[3] = 0.8; ks[4] = 1.0; geom::periodic_bspline<geom::point2d_t> bs( geom::make_periodic_bspline_wrap(pts, ks,2) ); auto p0 = bs.eval(0); auto p1 = bs.eval(.2); auto p2 = bs.eval(0.9); auto p3 = bs.eval(1.2); auto p4 = bs.eval(0.9999); INFO( "at 0:"<< p0 << "\n"); INFO("at 0.2:"<< p1 << "\n"); INFO("at 0.9:"<< p2 << "\n"); INFO("at 1.2:"<< p3 << "\n"); INFO("at 0.9999:"<< p4 << "\n");
std::vector<double> Rectangle::integral(const MyEnum teckAngle) { std::vector<double> S; S.reserve(getRangNewVector()); // result = cos(param * PI / 180.0); //double dX, dY; pt crossDiagLeft,crosDiagRight; pt diagFirstPoint_Left, trash_DiagSecondPoint_Right; pt begin, end, iterator_ActualDown,iterator_actualUp;//begin end y=0 y=0 //const double dX =deltaStep*cos(angle* PI / 180.0); double dX; //const double dY_div2= deltaStep*sin(angle* PI / 180.0)/2; pt outline_Down[2]; pt outline_Up[2]; double hold; switch (teckAngle) { case leftDown: dX = deltaStep / sin(angle* PI / 180.0); hold = norma.second / (tan((angle)* PI / 180.0)); iterator_ActualDown = begin = make_pt(-hold, 0.0); end = make_pt(norma.first, 0.0); iterator_actualUp = make_pt(0.0, norma.second); diagFirstPoint_Left = make_pt(coorDiag[2]); trash_DiagSecondPoint_Right = make_pt(coorDiag[3]); outline_Down[0] = make_pt(coorDiag[0]); outline_Down[1] = make_pt(coorDiag[2]); outline_Up[0] = make_pt(coorDiag[2]); outline_Up[1] = make_pt(coorDiag[1]); break; case leftUp: dX = deltaStep / sin((90.0 - angle)* PI / 180.0); iterator_ActualDown = begin = make_pt(0.0, 0.0); hold = norma.second / (tan((90.0 - angle)* PI / 180.0)); end = make_pt(hold + norma.first, 0.0); iterator_actualUp = make_pt(-hold, norma.second); diagFirstPoint_Left = make_pt(coorDiag[0]); trash_DiagSecondPoint_Right = make_pt(coorDiag[1]); outline_Down[0] = make_pt(coorDiag[0]); outline_Down[1] = make_pt(coorDiag[3]); outline_Up[0] = make_pt(coorDiag[0]); outline_Up[1] = make_pt(coorDiag[2]); break; } { std::cout << "begin " << begin << std::endl; std::cout << "dX=" << dX << std::endl; std::cout << "end " << end << std::endl; std::cout << "diagFirstPoint_Left " << diagFirstPoint_Left << std::endl; std::cout << "trash_DiagSecondPoint_Right " << trash_DiagSecondPoint_Right << std::endl; std::cout << "iterator_actualUp " << iterator_actualUp << std::endl; std::cout << "iterator_ActualDown" << iterator_ActualDown << std::endl; std::cin.get(); } //new version pt downCross; pt upCross; // pt trash; hold = 0; double predDy=0, tecDy=0; bool iter_left_down_angle = true; bool iter_right_up_angle = true; bool firstIter = true; bool lastIter = true; bool display = false; bool finish_calculator = false; int i = -1; //std::cin.get(); //для правильной работы шаг долдены быть меньше минамальной стороны фигуры for (iterator_ActualDown=begin; iterator_ActualDown.x < end.x; iterator_ActualDown.deltaX(dX), iterator_actualUp.deltaX(dX)) { i++; if (display) { std::cout << i << " "; std::cout << "iterator_actualUp " << iterator_actualUp << std::endl; std::cout << "iterator_ActualDown " << iterator_ActualDown << std::endl; //std::cin.get(); } if (intersect(iterator_ActualDown, iterator_actualUp, diagFirstPoint_Left, trash_DiagSecondPoint_Right, crossDiagLeft, crosDiagRight)) { if (teckAngle == leftDown) { //intersect(iterator_ActualDown, iterator_actualUp, make_pt(coorDiag[0]), make_pt(coorDiag[2]), downCross, trash); //intersect(iterator_ActualDown, iterator_actualUp, make_pt(coorDiag[1]), make_pt(coorDiag[2]), upCross, trash); intersect(iterator_ActualDown, iterator_actualUp,outline_Down[0],outline_Down[1], downCross, trash); intersect(iterator_ActualDown, iterator_actualUp,outline_Up[0],outline_Up[1], upCross, trash); predDy = tecDy; tecDy = distanse(downCross, upCross); if (firstIter) { firstIter = false; double first_katet_Dx = distanse(make_pt(coorDiag[2]), upCross); double second_katet_dy = distanse(make_pt(coorDiag[2]), downCross); hold += 0.5*first_katet_Dx*second_katet_dy; } else if (iter_left_down_angle && (downCross.y)<coorDiag[0].second && iter_right_up_angle && (upCross.x)> coorDiag[1].first) { iter_left_down_angle = false; outline_Down[0] = make_pt(coorDiag[0]); outline_Down[1] = make_pt(coorDiag[3]); intersect(iterator_ActualDown, iterator_actualUp, outline_Down[0], outline_Down[1], downCross, trash); tecDy = distanse(downCross, upCross); //левый нижний угол //hold // pt tempLeftDown; intersect(make_pt(iterator_ActualDown.x - dX, iterator_ActualDown.y), make_pt(iterator_actualUp.x - dX, iterator_actualUp.y), make_pt(0.0, coorDiag[0].second), make_pt(norma.first, coorDiag[0].second), tempLeftDown, trash); double firstKatet = distanse(tempLeftDown, make_pt(coorDiag[0])); double secondKatet = firstKatet*tan(angle* PI / 180.0); hold -= 0.5*firstKatet*secondKatet; hold += deltaStep*(tecDy); // iterator_ActualDown.deltaX(dX), iterator_actualUp.deltaX(dX); // iter_right_up_angle = false; outline_Up[0] = make_pt(coorDiag[1]); outline_Up[1] = make_pt(coorDiag[3]); intersect(iterator_ActualDown, iterator_actualUp, outline_Up[0], outline_Up[1], upCross, trash); tecDy = distanse(downCross, upCross); //правый верхний угол //hold // tempLeftDown; intersect(iterator_ActualDown, iterator_actualUp, make_pt(0.0, coorDiag[1].second), make_pt(norma.first, coorDiag[1].second), tempLeftDown, trash); firstKatet = distanse(tempLeftDown, make_pt(coorDiag[1])); secondKatet = firstKatet*tan(angle* PI / 180.0); hold += deltaStep*(predDy); hold -= 0.5*firstKatet*secondKatet; } else if (iter_left_down_angle&&(downCross.y )<coorDiag[0].second ) { iter_left_down_angle = false; outline_Down[0] = make_pt(coorDiag[0]); outline_Down[1] = make_pt(coorDiag[3]); intersect(iterator_ActualDown, iterator_actualUp, outline_Down[0], outline_Down[1], downCross, trash); tecDy = distanse(downCross, upCross); //левый нижний угол //hold // pt tempLeftDown; //make_pt(iterator_ActualDown.x-dX,iterator_ActualDown.y), make_pt(iterator_actualUp.x - dX, iterator_actualUp.y) intersect(make_pt(iterator_ActualDown.x - dX, iterator_ActualDown.y), make_pt(iterator_actualUp.x - dX, iterator_actualUp.y), make_pt(0.0, coorDiag[0].second), make_pt(norma.first, coorDiag[0].second), tempLeftDown, trash); double firstKatet = distanse(tempLeftDown, make_pt(coorDiag[0])); double secondKatet=firstKatet*tan(angle* PI / 180.0); hold -= 0.5*firstKatet*secondKatet; hold += deltaStep*(tecDy); } else if ( iter_right_up_angle&&(upCross.x )> coorDiag[1].first ) { iter_right_up_angle = false; outline_Up[0] = make_pt(coorDiag[1]); outline_Up[1] = make_pt(coorDiag[3]); intersect(iterator_ActualDown, iterator_actualUp, outline_Up[0], outline_Up[1], upCross, trash); tecDy = distanse(downCross, upCross); //правый верхний угол //hold pt tempLeftDown; //make_pt(iterator_ActualDown.x-dX,iterator_ActualDown.y), make_pt(iterator_actualUp.x - dX, iterator_actualUp.y) intersect(iterator_ActualDown,iterator_actualUp, make_pt(0.0, coorDiag[1].second), make_pt(norma.first, coorDiag[1].second), tempLeftDown, trash); double firstKatet = distanse(tempLeftDown, make_pt(coorDiag[1])); double secondKatet = firstKatet*tan(angle* PI / 180.0); hold += deltaStep*(predDy); hold -= 0.5*firstKatet*secondKatet; } else if ( lastIter&&(downCross.x + dX) >=coorDiag[3].first)//последний треугольник { //предыдущая трапеция hold += 0.5*deltaStep*(tecDy + predDy); //последний треугольник lastIter = false; finish_calculator = true; double first_katet_Dx = distanse(make_pt(coorDiag[3]), downCross); double second_katet_dy = distanse(make_pt(coorDiag[3]), upCross); hold += 0.5*first_katet_Dx*second_katet_dy; //iterator_ActualDown.deltaX(dX), iterator_actualUp.deltaX(dX); } else if (finish_calculator) { //ничего с холдом не делаем } else if (true) { hold += 0.5*deltaStep*(tecDy + predDy); //std::cout << i << " "; // std::cout << "true=" << hold << std::endl << std::endl; if (display) { std::cout <<std:: endl <<std:: endl; std::cout <<"downCross " <<downCross << std::endl; std:: cout << "upCross " << upCross <<std:: endl; std::cout <<std:: endl; std::cin.get(); } } } else { //leftUp intersect(iterator_ActualDown, iterator_actualUp, outline_Down[0], outline_Down[1], upCross, trash); intersect(iterator_ActualDown, iterator_actualUp, outline_Up[0], outline_Up[1], downCross, trash); predDy = tecDy; tecDy = distanse(downCross, upCross); if (firstIter) { firstIter = false; double first_katet_Dx = distanse(make_pt(coorDiag[0]), upCross); double second_katet_dy = distanse(make_pt(coorDiag[0]), downCross); hold += 0.5*first_katet_Dx*second_katet_dy; } else if (true) { // iterator_ActualDown.deltaX(dX), iterator_actualUp.deltaX(dX); // } else if (iter_left_down_angle && (upCross.y)>coorDiag[2].second) { iter_left_down_angle = false; outline_Down[0] = make_pt(coorDiag[2]); outline_Down[1] = make_pt(coorDiag[1]); intersect(iterator_ActualDown, iterator_actualUp, outline_Down[0], outline_Down[1], upCross, trash); tecDy = distanse(downCross, upCross); //левый нижний угол //hold // pt tempLeftDown; intersect(make_pt(iterator_ActualDown.x - dX, iterator_ActualDown.y), make_pt(iterator_actualUp.x - dX, iterator_actualUp.y), make_pt(0.0, coorDiag[2].second), make_pt(norma.first, coorDiag[2].second), tempLeftDown, trash); double firstKatet = distanse(tempLeftDown, make_pt(coorDiag[2])); double secondKatet = firstKatet*tan((90.0 - angle)* PI / 180.0); hold -= 0.5*firstKatet*secondKatet; hold += deltaStep*(tecDy); } else if (iter_right_up_angle && (downCross.x)> coorDiag[3].first) { iter_right_up_angle = false; outline_Up[0] = make_pt(coorDiag[3]); outline_Up[1] = make_pt(coorDiag[1]); intersect(iterator_ActualDown, iterator_actualUp, outline_Up[0], outline_Up[1], downCross, trash); tecDy = distanse(downCross, upCross); //правый верхний угол //hold pt tempLeftDown; intersect(iterator_ActualDown, iterator_actualUp, make_pt(0.0, coorDiag[0].second), make_pt(norma.first, coorDiag[0].second), tempLeftDown, trash); double firstKatet = distanse(tempLeftDown, make_pt(coorDiag[3])); double secondKatet = firstKatet*tan((90-angle)* PI / 180.0); hold += deltaStep*(predDy); hold -= 0.5*firstKatet*secondKatet; } else if (lastIter && (downCross.x + dX) >= coorDiag[3].first)//последний треугольник { //предыдущая трапеция hold += 0.5*deltaStep*(tecDy + predDy); //последний треугольник lastIter = false; finish_calculator = true; double first_katet_Dx = distanse(make_pt(coorDiag[1]), downCross); double second_katet_dy = distanse(make_pt(coorDiag[1]), upCross); hold += 0.5*first_katet_Dx*second_katet_dy; //iterator_ActualDown.deltaX(dX), iterator_actualUp.deltaX(dX); } else if (finish_calculator) { //ничего с холдом не делаем } else if (true) { hold += 0.5*deltaStep*(tecDy + predDy); //std::cout << i << " "; // std::cout << "true=" << hold << std::endl << std::endl; if (display) { std::cout << std::endl << std::endl; std::cout << "downCross " << downCross << std::endl; std::cout << "upCross " << upCross << std::endl; std::cout << std::endl; std::cin.get(); } } } } if (display) { std::cout << i << " "; std::cout << "Hold=" << hold << std::endl; } S.push_back(hold); } std::cout << *(S.end()-1) << std::endl; return S; //firstIter=false; //std::for_each(S.begin(), S.end(), double_2x); /* if (intersect(iterator_ActualDown, iterator_actualUp, diagFirstPoint_Left, trash_DiagSecondPoint_Right, crossDiagLeft, crosDiagRight)) { if (teckAngle == leftDown) { hold += dX*(crossDiagLeft.y + dY_div2); } else { hold += dX*(norma.second - crossDiagLeft.y - dY_div2); } } S.push_back(hold); iterator_ActualDown.deltaX(dX); iterator_actualUp.deltaX(dX); for (; iterator_ActualDown.x < end.x; iterator_ActualDown.deltaX(dX), iterator_actualUp.deltaX(dX)) { hold = *(S.vector::end() - 1); if (intersect(iterator_ActualDown,iterator_actualUp,diagFirstPoint_Left,trash_DiagSecondPoint_Right,crossDiagLeft,crosDiagRight)) { if (teckAngle == leftDown) { //hold += dX*(crossDiagLeft.y+dY_div2-coorDiag[0].second); hold += dX*(crossDiagLeft.y - coorDiag[0].second); } else { //hold+= dX*(norma.second-crossDiagLeft.y - dY_div2 - coorDiag[0].second); hold += dX*(norma.second - crossDiagLeft.y - coorDiag[0].second); } //std::cout << "dx" << dX << " dY" << crossDiagLeft.y + dY_div2 - coorDiag[0].second << std::endl; //std::cin.get(); } S.push_back(hold); } //std::for_each(S.begin(), S.end(), double_2x); return S; */ }
void init_nucleotides() { init_A(); init_C(); init_G(); init_U(); rG_.type = 'G'; make_tfo( -0.2067, -0.0264, 0.9780, 0.9770, -0.0586, 0.2049, 0.0519, 0.9979, 0.0379, 1.0331, -46.8078, -36.4742, &rG_.dgf_base_tfo ); make_tfo( -0.8644, -0.4956, -0.0851, -0.0427, 0.2409, -0.9696, 0.5010, -0.8345, -0.2294, 4.0167, 54.5377, 12.4779, &rG_.p_o3_275_tfo ); make_tfo( 0.3706, -0.6167, 0.6945, -0.2867, -0.7872, -0.5460, 0.8834, 0.0032, -0.4686, -52.9020, 18.6313, -0.6709, &rG_.p_o3_180_tfo ); make_tfo( 0.4155, 0.9025, -0.1137, 0.9040, -0.4236, -0.0582, -0.1007, -0.0786, -0.9918, -7.6624, -25.2080, 49.5181, &rG_.p_o3_60_tfo ); make_pt( 31.3810, 0.1400, 47.5810, &rG_.p ); make_pt( 29.9860, 0.6630, 47.6290, &rG_.o1p ); make_pt( 31.7210, -0.6460, 48.8090, &rG_.o2p ); make_pt( 32.4940, 1.2540, 47.2740, &rG_.o5_ ); make_pt( 32.1610, 2.2370, 46.2560, &rG_.c5_ ); make_pt( 31.2986, 2.8190, 46.5812, &rG_.h5_ ); make_pt( 32.0980, 1.7468, 45.2845, &rG_.h5__ ); make_pt( 33.3476, 3.1959, 46.1947, &rG_.c4_ ); make_pt( 33.2668, 3.8958, 45.3630, &rG_.h4_ ); make_pt( 33.3799, 3.9183, 47.4216, &rG_.o4_ ); make_pt( 34.6515, 3.7222, 48.0398, &rG_.c1_ ); make_pt( 35.2947, 4.5412, 47.7180, &rG_.h1_ ); make_pt( 35.1756, 2.4228, 47.4827, &rG_.c2_ ); make_pt( 34.6778, 1.5937, 47.9856, &rG_.h2__ ); make_pt( 36.5631, 2.2672, 47.4798, &rG_.o2_ ); make_pt( 37.0163, 2.6579, 48.2305, &rG_.h2_ ); make_pt( 34.6953, 2.5043, 46.0448, &rG_.c3_ ); make_pt( 34.5444, 1.4917, 45.6706, &rG_.h3_ ); make_pt( 35.6679, 3.3009, 45.3487, &rG_.o3_ ); make_pt( 37.4804, 4.0914, 52.2559, &rG_.n1 ); make_pt( 36.9670, 4.1312, 49.9281, &rG_.n3 ); make_pt( 37.8045, 4.2519, 50.9550, &rG_.c2 ); make_pt( 35.7171, 3.8264, 50.3222, &rG_.c4 ); make_pt( 35.2668, 3.6420, 51.6115, &rG_.c5 ); make_pt( 36.2037, 3.7829, 52.6706, &rG_.c6 ); make_pt( 39.0869, 4.5552, 50.7092, &rG_._.G.n2 ); make_pt( 33.9075, 3.3338, 51.6102, &rG_._.G.n7 ); make_pt( 34.6126, 3.6358, 49.5108, &rG_._.G.n9 ); make_pt( 33.5805, 3.3442, 50.3425, &rG_._.G.c8 ); make_pt( 35.9958, 3.6512, 53.8724, &rG_._.G.o6 ); make_pt( 38.2106, 4.2053, 52.9295, &rG_._.G.h1 ); make_pt( 39.8218, 4.6863, 51.3896, &rG_._.G.h21 ); make_pt( 39.3420, 4.6857, 49.7407, &rG_._.G.h22 ); make_pt( 32.5194, 3.1070, 50.2664, &rG_._.G.h8 ); rU_.type = 'U'; make_tfo( -0.0109, 0.5907, 0.8068, 0.2217, -0.7853, 0.5780, 0.9751, 0.1852, -0.1224, -1.4225, -11.0956, -2.5217, &rU_.dgf_base_tfo ); make_tfo( -0.8313, -0.4738, -0.2906, 0.0649, 0.4366, -0.8973, 0.5521, -0.7648, -0.3322, 1.6833, 6.8060, -7.0011, &rU_.p_o3_275_tfo ); make_tfo( 0.3445, -0.7630, 0.5470, -0.4628, -0.6450, -0.6082, 0.8168, -0.0436, -0.5753, -6.8179, -3.9778, -5.9887, &rU_.p_o3_180_tfo ); make_tfo( 0.5855, 0.7931, -0.1682, 0.8103, -0.5790, 0.0906, -0.0255, -0.1894, -0.9816, 6.1203, -7.1051, 3.1984, &rU_.p_o3_60_tfo ); make_pt( 2.6760, -8.4960, 3.2880, &rU_.p ); make_pt( 1.4950, -7.6230, 3.4770, &rU_.o1p ); make_pt( 2.9490, -9.4640, 4.3740, &rU_.o2p ); make_pt( 3.9730, -7.5950, 3.0340, &rU_.o5_ ); make_pt( 5.2430, -8.2420, 2.8260, &rU_.c5_ ); make_pt( 5.1974, -8.8497, 1.9223, &rU_.h5_ ); make_pt( 5.5548, -8.7348, 3.7469, &rU_.h5__ ); make_pt( 6.3140, -7.2060, 2.5510, &rU_.c4_ ); make_pt( 5.8744, -6.2116, 2.4731, &rU_.h4_ ); make_pt( 7.2798, -7.2260, 3.6420, &rU_.o4_ ); make_pt( 8.5733, -6.9410, 3.1329, &rU_.c1_ ); make_pt( 8.9047, -6.0374, 3.6446, &rU_.h1_ ); make_pt( 8.4429, -6.6596, 1.6327, &rU_.c2_ ); make_pt( 9.2880, -7.1071, 1.1096, &rU_.h2__ ); make_pt( 8.2502, -5.2799, 1.4754, &rU_.o2_ ); make_pt( 8.7676, -4.7284, 2.0667, &rU_.h2_ ); make_pt( 7.1642, -7.4416, 1.3021, &rU_.c3_ ); make_pt( 7.4125, -8.5002, 1.2260, &rU_.h3_ ); make_pt( 6.5160, -6.9772, 0.1267, &rU_.o3_ ); make_pt( 9.4531, -8.1107, 3.4087, &rU_.n1 ); make_pt( 11.5931, -9.0015, 3.6357, &rU_.n3 ); make_pt( 10.8101, -7.8950, 3.3748, &rU_.c2 ); make_pt( 11.1439, -10.2744, 3.9206, &rU_.c4 ); make_pt( 9.7056, -10.4026, 3.9332, &rU_.c5 ); make_pt( 8.9192, -9.3419, 3.6833, &rU_.c6 ); make_pt( 11.3013, -6.8063, 3.1326, &rU_._.U.o2 ); make_pt( 11.9431, -11.1876, 4.1375, &rU_._.U.o4 ); make_pt( 12.5840, -8.8673, 3.6158, &rU_._.U.h3 ); make_pt( 9.2891, -11.2898, 4.1313, &rU_._.U.h5 ); make_pt( 7.9263, -9.4537, 3.6977, &rU_._.U.h6 ); }