Esempio n. 1
0
#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   );
}