Заявка на участие в клубе создателей алгоритма объединения многоугольника и треугольника

950178d7548f859f4b9730e33ae4d826.jpg
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

double interval_point_point(double x, double y,
                            double u, double v){
    double r = sqrt(pow((u-x),2) + pow((v-y),2));
    return r;
}
double interval_line_point(double x0, double y0,
                           double x1, double y1,
                           double u, double v){
    double r;
    double ax;
    double ay;
    double bx;
    double by;
    double mod_a;

    ax = x1 - x0;
    ay = y1 - y0;
    mod_a = sqrt(pow(ax,2) + pow(ay,2));
    bx = u - x0;
    by = v - y0;
    r = abs(ax*by - ay*bx)/mod_a;
    return r;
}
std::vector> segments_intersection_point (std::vector>seg1,
                                                              std::vector>seg2,
                                                              double r_point){
   double x0  = seg1[0][0];
   double y0  = seg1[0][1];
   double x1  = seg1[1][0];
   double y1  = seg1[1][1];
   double u0  = seg2[0][0];
   double v0  = seg2[0][1];
   double u1  = seg2[1][0];
   double v1  = seg2[1][1];
   std::vector iio;
   std::vector> points_attributes; // mask: [t_][tau_][cos_][sin_][x_][y_]
   points_attributes.clear();
   double t_;
   double tau_;
   double cos_ ;
   double sin_ ;
   double x_ ;
   double y_ ;
   double ax = x1 - x0;
   double ay = y1 - y0;
   double bx = u1 - u0;
   double by = v1 - v0;
   double ax_ = x0;
   double ay_ = y0;
   double bx_ = u0;
   double by_ = v0;
   double cx = bx_ - ax_;
   double cy = by_ - ay_;
   double a;
   double b;
   double c;
   double det_0   = - ax*by + ay*bx;
   double det_t   = - cx*by + cy*bx;
   double det_tau =   ax*cy - ay*cx;
   double r_a = sqrt( ax*ax+ay*ay );
   double r_b = sqrt( bx*bx+by*by );
   if (abs(det_0/r_a)> input_array,
                   std::vector>& output_add_array_1,
                   std::vector>& output_add_array_2,
                   std::array& Jordano_flag_t,
                   std::array& Jordano_flag_tau ){
   std::vector iii;
   double t_;
   double tau_;
   double cos_ ;
   double sin_ ;
   double x_ ;
   double y_ ;
   if(input_array.size()==1){
      t_   = input_array[0][0];
      tau_ = input_array[0][1];
      cos_ = input_array[0][2];
      sin_ = input_array[0][3];
      x_   = input_array[0][4];
      y_   = input_array[0][5];
      if( t_<0.0 ){
        if(tau_==0.0){           if(sin_>0.0)      {Jordano_flag_t[0] = Jordano_flag_t[0] + 1;}  };
        if(tau_>0.0 && tau_<1.0){                   Jordano_flag_t[0] = Jordano_flag_t[0] + 1;   };
        if(tau_==1.0){           if(-sin_>0.0)     {Jordano_flag_t[0] = Jordano_flag_t[0] + 1;}  };
      };
      if( t_==0.0 ){
        if(tau_<0.0){            if(-sin_>0.0)     {Jordano_flag_tau[0] = Jordano_flag_tau[0] + 1;}  };
        if(tau_==0.0){
                                 iii.push_back(t_); // t_
                                 iii.push_back(0.0); // tau_
                                 iii.push_back(cos_); // cos_
                                 iii.push_back(sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(0.0);  // t_
                                 iii.push_back(cos_);  // cos_
                                 iii.push_back(-sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
        };
        if(tau_>0.0 && tau_<1.0){
                                 iii.push_back(t_); // t_
                                 iii.push_back(0.0); // tau_
                                 iii.push_back(cos_); // cos_
                                 iii.push_back(sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(t_); // t_
                                 iii.push_back(1.0); // tau_
                                 iii.push_back(-cos_); // cos_
                                 iii.push_back(-sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(0.0);  // t_
                                 iii.push_back(cos_);  // cos_
                                 iii.push_back(-sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();

        };
        if(tau_==1.0){
                                 iii.push_back(t_); // t_
                                 iii.push_back(1.0); // tau_
                                 iii.push_back(-cos_); // cos_
                                 iii.push_back(-sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(0.0);  // t_
                                 iii.push_back(cos_);  // cos_
                                 iii.push_back(-sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
        };
        if(tau_>1.0){            if(-sin_>0.0)     {Jordano_flag_tau[1] = Jordano_flag_tau[1] + 1;}  };
      };
      if( t_>0.0 && t_<1.0 ){
        if(tau_<0.0){                               Jordano_flag_tau[0] = Jordano_flag_tau[0] + 1;   };
        if(tau_==0.0){
                                 iii.push_back(t_); // t_
                                 iii.push_back(0.0); // tau_
                                 iii.push_back(cos_); // cos_
                                 iii.push_back(sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(0.0);  // t_
                                 iii.push_back(cos_);  // cos_
                                 iii.push_back(-sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(1.0);  // t_
                                 iii.push_back(-cos_);  // cos_
                                 iii.push_back(sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
        };
        if(tau_>0.0 && tau_<1.0){
                                 iii.push_back(t_); // t_
                                 iii.push_back(0.0); // tau_
                                 iii.push_back(cos_); // cos_
                                 iii.push_back(sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(t_); // t_
                                 iii.push_back(1.0); // tau_
                                 iii.push_back(-cos_); // cos_
                                 iii.push_back(-sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(0.0);  // t_
                                 iii.push_back(cos_);  // cos_
                                 iii.push_back(-sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(1.0);  // t_
                                 iii.push_back(-cos_);  // cos_
                                 iii.push_back(sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();

        };
        if(tau_==1.0){
                                 iii.push_back(t_); // t_
                                 iii.push_back(1.0); // tau_
                                 iii.push_back(-cos_); // cos_
                                 iii.push_back(-sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(0.0);  // t_
                                 iii.push_back(cos_);  // cos_
                                 iii.push_back(-sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(1.0);  // t_
                                 iii.push_back(-cos_);  // cos_
                                 iii.push_back(sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
        };
        if(tau_>1.0){                               Jordano_flag_tau[1] = Jordano_flag_tau[1] + 1;   };
      };
      if( t_==1.0 ){
        if(tau_<0.0){            if(sin_>0.0)      {Jordano_flag_tau[0] = Jordano_flag_tau[0] + 1;}   };
        if(tau_==0.0){
                                 iii.push_back(t_); // t_
                                 iii.push_back(0.0); // tau_
                                 iii.push_back(cos_); // cos_
                                 iii.push_back(sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(1.0);  // t_
                                 iii.push_back(-cos_);  // cos_
                                 iii.push_back(sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
        };
        if(tau_>0.0 && tau_<1.0){
                                 iii.push_back(t_); // t_
                                 iii.push_back(0.0); // tau_
                                 iii.push_back(cos_); // cos_
                                 iii.push_back(sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(t_); // t_
                                 iii.push_back(1.0); // tau_
                                 iii.push_back(-cos_); // cos_
                                 iii.push_back(-sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(1.0);  // t_
                                 iii.push_back(-cos_);  // cos_
                                 iii.push_back(sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
        };
        if(tau_==1.0){
                                 iii.push_back(t_); // t_
                                 iii.push_back(1.0); // tau_
                                 iii.push_back(-cos_); // cos_
                                 iii.push_back(-sin_); // sin_
                                 iii.push_back(x_); // x_
                                 iii.push_back(y_); // y_
                                 output_add_array_1.push_back(iii);
                                 iii.clear();
                                 iii.push_back(tau_);  // tau_
                                 iii.push_back(1.0);  // t_
                                 iii.push_back(-cos_);  // cos_
                                 iii.push_back(sin_);  // sin_
                                 iii.push_back(x_);  // x_
                                 iii.push_back(y_);  // y_
                                 output_add_array_2.push_back(iii);
                                 iii.clear();
        };
        if(tau_>1.0){            if(sin_>0.0)      {Jordano_flag_tau[1] = Jordano_flag_tau[1] + 1;}   };
      };
      if( t_>1.0 ){
        if(tau_==0.0){           if(sin_>0.0)      {Jordano_flag_t[1] = Jordano_flag_t[1] + 1;}  };
        if(tau_>0.0 && tau_<1.0){                   Jordano_flag_t[1] = Jordano_flag_t[1] + 1;   };
        if(tau_==1.0){           if(-sin_>0.0)     {Jordano_flag_t[1] = Jordano_flag_t[1] + 1;}  };
      };
   } else {
   if(input_array.size()== 4){
   double t0   = input_array[0][0]; //0
   double tau0 = input_array[0][1];
   double t1   = input_array[1][0]; //1
   double tau1 = input_array[1][1];
   double t2   = input_array[2][0];
   double tau2 = input_array[2][1]; //0
   double t3   = input_array[3][0];
   double tau3 = input_array[3][1]; //1
   int num_aad = 0;
   if (tau0>=0.0 && tau0 <=1.0){ //t = 0
         num_aad = num_aad + 1;
    if ( tau0 == 0.0 ){
         iii.push_back(0.0); // t_
         iii.push_back(0.0); // tau_
         iii.push_back(input_array[0][2]); // cos_
         iii.push_back(0.0); // sin_
         iii.push_back(input_array[0][4]); // x_
         iii.push_back(input_array[0][5]); // y_
         output_add_array_1.push_back(iii);
         iii.clear();
         iii.push_back(0.0);  // tau_
         iii.push_back(0.0);  // t_
         iii.push_back(input_array[0][2]);  // cos_
         iii.push_back(0.0);  // sin_
         iii.push_back(input_array[0][4]);  // x_
         iii.push_back(input_array[0][5]);  // y_
         output_add_array_2.push_back(iii);
         iii.clear();
    };
    if ( tau0>0.0 && tau0 <1.0 ){
         iii.push_back(0.0); // t_
         iii.push_back(0.0); // tau_
         iii.push_back(input_array[0][2]); // cos_
         iii.push_back(0.0); // sin_
         iii.push_back(input_array[0][4]); // x_
         iii.push_back(input_array[0][5]); // y_
         output_add_array_1.push_back(iii);
         iii.clear();
         iii.push_back(0.0); // t_
         iii.push_back(1.0); // tau_
         iii.push_back(-input_array[0][2]); // cos_
         iii.push_back(0.0); // sin_
         iii.push_back(input_array[0][4]); // x_
         iii.push_back(input_array[0][5]); // y_
         output_add_array_1.push_back(iii);
         iii.clear();
         iii.push_back(input_array[0][1]);  // tau_
         iii.push_back(0.0);  // t_
         iii.push_back(input_array[0][2]);  // cos_
         iii.push_back(0.0);  // sin_
         iii.push_back(input_array[0][4]);  // x_
         iii.push_back(input_array[0][5]);  // y_
         output_add_array_2.push_back(iii);
         iii.clear();
    };
    if ( tau0 == 1.0 ){
         iii.push_back(0.0); // t_
         iii.push_back(1.0); // tau_
         iii.push_back(-input_array[0][2]); // cos_
         iii.push_back(0.0); // sin_
         iii.push_back(input_array[0][4]); // x_
         iii.push_back(input_array[0][5]); // y_
         output_add_array_1.push_back(iii);
         iii.clear();
         iii.push_back(1.0);  // tau_
         iii.push_back(0.0);  // t_
         iii.push_back(input_array[0][2]);  // cos_
         iii.push_back(0.0);  // sin_
         iii.push_back(input_array[0][4]);  // x_
         iii.push_back(input_array[0][5]);  // y_
         output_add_array_2.push_back(iii);
         iii.clear();
    };
    };
   if (tau1>=0.0 && tau1 <=1.0){
         num_aad = num_aad + 1;
         if(tau1 == 0.0){
           iii.push_back(1.0); // t_
           iii.push_back(0.0); // tau_
           iii.push_back(input_array[1][2]); // cos_
           iii.push_back(0.0); // sin_
           iii.push_back(input_array[1][4]); // x_
           iii.push_back(input_array[1][5]); // y_
           output_add_array_1.push_back(iii);
           iii.clear();
           iii.push_back(0.0);  // tau_
           iii.push_back(1.0);  // t_
           iii.push_back(-input_array[1][2]);  // cos_
           iii.push_back(0.0);  // sin_
           iii.push_back(input_array[1][4]);  // x_
           iii.push_back(input_array[1][5]);  // y_
           output_add_array_2.push_back(iii);
           iii.clear();
         };
         if(tau1>0.0 && tau1<1.0){
           iii.push_back(1.0); // t_
           iii.push_back(0.0); // tau_
           iii.push_back(input_array[1][2]); // cos_
           iii.push_back(0.0); // sin_
           iii.push_back(input_array[1][4]); // x_
           iii.push_back(input_array[1][5]); // y_
           output_add_array_1.push_back(iii);
           iii.clear();
           iii.push_back(1.0); // t_
           iii.push_back(1.0); // tau_
           iii.push_back(-input_array[1][2]); // cos_
           iii.push_back(0.0); // sin_
           iii.push_back(input_array[1][4]); // x_
           iii.push_back(input_array[1][5]); // y_
           output_add_array_1.push_back(iii);
           iii.clear();
           iii.push_back(input_array[1][1]);  // tau_
           iii.push_back(1.0);  // t_
           iii.push_back(-input_array[1][2]);  // cos_
           iii.push_back(0.0);  // sin_
           iii.push_back(input_array[1][4]);  // x_
           iii.push_back(input_array[1][5]);  // y_
           output_add_array_2.push_back(iii);
           iii.clear();};
         if(tau1 == 1.0){
           iii.push_back(1.0); // t_
           iii.push_back(1.0); // tau_
           iii.push_back(-input_array[1][2]); // cos_
           iii.push_back(0.0); // sin_
           iii.push_back(input_array[1][4]); // x_
           iii.push_back(input_array[1][5]); // y_
           output_add_array_1.push_back(iii);
           iii.clear();
           iii.push_back(1.0);  // tau_
           iii.push_back(1.0);  // t_
           iii.push_back(-input_array[1][2]);  // cos_
           iii.push_back(0.0);  // sin_
           iii.push_back(input_array[1][4]);  // x_
           iii.push_back(input_array[1][5]);  // y_
           output_add_array_2.push_back(iii);
           iii.clear();};
         };
   if (t2 >=0.0 && t2 <=1.0 && num_aad<2){
         if(t2 != t0 || tau2 != tau0){
               if(t2 != t1 || tau2 != tau1){
                     num_aad = num_aad + 1;
                     if(t2 == 0.0){
                        iii.push_back(0.0); // t_
                        iii.push_back(0.0); // tau_ = 0
                        iii.push_back(input_array[2][2]); // cos_
                        iii.push_back(0.0); // sin_
                        iii.push_back(input_array[2][4]); // x_
                        iii.push_back(input_array[2][5]); // y_
                        output_add_array_1.push_back(iii);
                        iii.clear();
                        iii.push_back(0.0);  // tau_ = 0
                        iii.push_back(0.0);  // t_
                        iii.push_back(input_array[2][2]);  // cos_
                        iii.push_back(0.0);  // sin_
                        iii.push_back(input_array[2][4]);  // x_
                        iii.push_back(input_array[2][5]);  // y_
                        output_add_array_2.push_back(iii);
                        iii.clear();
                     };
                     if(t2>0.0 && t2<1.0){
                        iii.push_back(input_array[2][0]); // t_
                        iii.push_back(0.0); // tau_ = 0
                        iii.push_back(input_array[2][2]); // cos_
                        iii.push_back(0.0); // sin_
                        iii.push_back(input_array[2][4]); // x_
                        iii.push_back(input_array[2][5]); // y_
                        output_add_array_1.push_back(iii);
                        iii.clear();
                        iii.push_back(0.0);  // tau_ = 0
                        iii.push_back(0.0);  // t_
                        iii.push_back(input_array[2][2]);  // cos_
                        iii.push_back(0.0);  // sin_
                        iii.push_back(input_array[2][4]);  // x_
                        iii.push_back(input_array[2][5]);  // y_
                        output_add_array_2.push_back(iii);
                        iii.clear();
                        iii.push_back(0.0);  // tau_ = 0
                        iii.push_back(1.0);  // t_
                        iii.push_back(-input_array[2][2]);  // cos_
                        iii.push_back(0.0);  // sin_
                        iii.push_back(input_array[2][4]);  // x_
                        iii.push_back(input_array[2][5]);  // y_
                        output_add_array_2.push_back(iii);
                        iii.clear();
                     };
                     if(t2 == 1.0){
                        iii.push_back(input_array[2][0]); // t_
                        iii.push_back(0.0); // tau_ = 0
                        iii.push_back(input_array[2][2]); // cos_
                        iii.push_back(0.0); // sin_
                        iii.push_back(input_array[2][4]); // x_
                        iii.push_back(input_array[2][5]); // y_
                        output_add_array_1.push_back(iii);
                        iii.clear();
                        iii.push_back(0.0);  // tau_ = 0
                        iii.push_back(1.0);  // t_
                        iii.push_back(-input_array[2][2]);  // cos_
                        iii.push_back(0.0);  // sin_
                        iii.push_back(input_array[2][4]);  // x_
                        iii.push_back(input_array[2][5]);  // y_
                        output_add_array_2.push_back(iii);
                        iii.clear();
                     };
                     };
               };
         };
   if (t3>=0.0 && t3 <=1.0 && num_aad<2){
         if(t3 != t0 || tau3 != tau0){
               if(t3 != t1 || tau3 != tau1){
                     if(t3 == 0.0){
                       iii.push_back(0.0); // t_
                       iii.push_back(1.0); // tau_
                       iii.push_back(-input_array[3][2]); // cos_
                       iii.push_back(0.0); // sin_
                       iii.push_back(input_array[3][4]); // x_
                       iii.push_back(input_array[3][5]); // y_
                       output_add_array_1.push_back(iii);
                       iii.clear();
                       iii.push_back(1.0);  // tau_
                       iii.push_back(0.0);  // t_
                       iii.push_back(input_array[3][2]);  // cos_
                       iii.push_back(0.0);  // sin_
                       iii.push_back(input_array[3][4]);  // x_
                       iii.push_back(input_array[3][5]);  // y_
                       output_add_array_2.push_back(iii);
                       iii.clear();
                     };
                     if(t3>0.0 && t3<1.0){
                       iii.push_back(input_array[3][0]); // t_
                       iii.push_back(1.0); // tau_
                       iii.push_back(-input_array[3][2]); // cos_
                       iii.push_back(0.0); // sin_
                       iii.push_back(input_array[3][4]); // x_
                       iii.push_back(input_array[3][5]); // y_
                       output_add_array_1.push_back(iii);
                       iii.clear();
                       iii.push_back(1.0);  // tau_
                       iii.push_back(0.0);  // t_
                       iii.push_back(input_array[3][2]);  // cos_
                       iii.push_back(0.0);  // sin_
                       iii.push_back(input_array[3][4]);  // x_
                       iii.push_back(input_array[3][5]);  // y_
                       output_add_array_2.push_back(iii);
                       iii.clear();
                       iii.push_back(1.0);  // tau_
                       iii.push_back(1.0);  // t_
                       iii.push_back(-input_array[3][2]);  // cos_
                       iii.push_back(0.0);  // sin_
                       iii.push_back(input_array[3][4]);  // x_
                       iii.push_back(input_array[3][5]);  // y_
                       output_add_array_2.push_back(iii);
                       iii.clear();
                     };
                     if(t3 == 1.0){
                       iii.push_back(1.0); // t_
                       iii.push_back(1.0); // tau_
                       iii.push_back(-input_array[3][2]); // cos_
                       iii.push_back(0.0); // sin_
                       iii.push_back(input_array[3][4]); // x_
                       iii.push_back(input_array[3][5]); // y_
                       output_add_array_1.push_back(iii);
                       iii.clear();
                       iii.push_back(1.0);  // tau_
                       iii.push_back(1.0);  // t_
                       iii.push_back(-input_array[3][2]);  // cos_
                       iii.push_back(0.0);  // sin_
                       iii.push_back(input_array[3][4]);  // x_
                       iii.push_back(input_array[3][5]);  // y_
                       output_add_array_2.push_back(iii);
                       iii.clear();
                     };
                     };
               };
         };
   }
   };
};
std::vector> give_spirit_tau(std::vector> segment,
                                                 std::vector> his,
                                                 std::array Jordano,
                                                 double tau_point){
std::vector> spirit;
std::vector> analize_tmp;
std::vector io;
double x0 = segment[0][0];
double y0 = segment[0][1];
double x1 = segment[1][0];
double y1 = segment[1][1];
int left_N = Jordano[0]%2;
int right_N = Jordano[1]%2;
double x_tmp;
double y_tmp;
double parameter_tmp;
int i_min;
int i_max;
double cos_a;
double sin_a;
double max_a;
double min_a;
double tmp;
double left_light ;
double right_light;
std::sort(begin(his), end(his));
   parameter_tmp = his[0][0];
   if (parameter_tmp > 0.0){
    io.push_back(left_N);
    io.push_back(x0);
    io.push_back(y0);
    io.push_back(left_N);
    spirit.push_back(io);
    io.clear();
   };
   for ( int m = 0; m max_a ){
                    max_a = tmp;
                    i_max = d;
                   };
                    if ( tmp < min_a ){
                    min_a = tmp;
                    i_min = d;
                   };
                };
                x_tmp = analize_tmp[0][3];
                y_tmp = analize_tmp[0][4];

                left_light = 1.0;
                if ( (analize_tmp[i_min][0]==1.0 && analize_tmp[i_min][2]>0)
                  || (analize_tmp[i_min][0]==0.0 && analize_tmp[i_min][2]<0) )
                    {left_light = 0.0;};
                if ( analize_tmp[i_min][0] == 1.0 && analize_tmp[i_min][2] == 0.0 )
                    {left_light = 0.0;};
                right_light = 1.0;
                if ( (analize_tmp[i_max][0]==0.0 && analize_tmp[i_max][2]>0)
                  || (analize_tmp[i_max][0]==1.0 && analize_tmp[i_max][2]<0) )
                    {right_light = 0.0;};
                if ( analize_tmp[i_max][0] == 0.0 && analize_tmp[i_max][2] == 0.0 )
                    {right_light = 0.0;};
                io.push_back(left_light);
                io.push_back(x_tmp);
                io.push_back(y_tmp);
                io.push_back(right_light);
                spirit.push_back(io);
                io.clear();
                analize_tmp.clear();
                };
    };
                i_min = 0;
                i_max = 0;
                cos_a = analize_tmp[0][1];
                sin_a = analize_tmp[0][2];
                max_a = cos_a/sqrt(pow(cos_a,2)+pow(sin_a,2)) ;
                min_a = max_a;
                for (int d=1; d max_a ){
                    max_a = tmp;
                    i_max = d;
                   };
                    if ( tmp < min_a ){
                    min_a = tmp;
                    i_min = d;
                   };
                };
                x_tmp = analize_tmp[0][3];
                y_tmp = analize_tmp[0][4];
                left_light = 1.0;
                if ( (analize_tmp[i_min][0]==1.0 && analize_tmp[i_min][2]>0.0)
                  || (analize_tmp[i_min][0]==0.0 && analize_tmp[i_min][2]<0.0) )
                    {left_light = 0.0;};
                if ( analize_tmp[i_min][0] == 1.0 && analize_tmp[i_min][2] == 0.0 )
                    {left_light = 0.0;};
                right_light = 1.0;
                if ( (analize_tmp[i_max][0]==0.0 && analize_tmp[i_max][2]>0)
                  || (analize_tmp[i_max][0]==1.0 && analize_tmp[i_max][2]<0) )
                    {right_light = 0.0;};
                if ( analize_tmp[i_max][0] == 0.0 && analize_tmp[i_max][2] == 0.0 )
                    {right_light = 0.0;};
                io.push_back(left_light);
                io.push_back(x_tmp);
                io.push_back(y_tmp);
                io.push_back(right_light);
                spirit.push_back(io);
                io.clear();
                analize_tmp.clear();
    parameter_tmp = his[his.size()-1][0];
    if (parameter_tmp < 1.0){
    io.push_back(right_N);
    io.push_back(x1);
    io.push_back(y1);
    io.push_back(right_N);
    spirit.push_back(io);
    io.clear();
   };
return spirit;
};
std::vector> give_spirit_t(std::vector> segment,
                                                 std::vector> his,
                                                 std::array Jordano,
                                                 double tau_point){
std::vector> spirit;
std::vector> analize_tmp;
std::vector io;
double x0 = segment[0][0];
double y0 = segment[0][1];
double x1 = segment[1][0];
double y1 = segment[1][1];
int left_N = Jordano[0]%2;
int right_N = Jordano[1]%2;
double x_tmp;
double y_tmp;
double parameter_tmp;
int i_min;
int i_max;
double cos_a;
double sin_a;
double max_a;
double min_a;
double tmp;
double left_light ;
double right_light;
std::sort(begin(his), end(his));
   parameter_tmp = his[0][0];
   if (parameter_tmp > 0.0){
    io.push_back(left_N);
    io.push_back(x0);
    io.push_back(y0);
    io.push_back(left_N);
    spirit.push_back(io);
    io.clear();
   };
   for ( int m = 0; m max_a ){
                    max_a = tmp;
                    i_max = d;
                   };
                    if ( tmp < min_a ){
                    min_a = tmp;
                    i_min = d;
                   };
                };
                x_tmp = analize_tmp[0][3];
                y_tmp = analize_tmp[0][4];
                left_light = 1.0;
                if ( (analize_tmp[i_min][0]==1.0 && analize_tmp[i_min][2]>0)
                  || (analize_tmp[i_min][0]==0.0 && analize_tmp[i_min][2]<0) )
                    {left_light = 0.0;};
                right_light = 1.0;
                if ( (analize_tmp[i_max][0]==0.0 && analize_tmp[i_max][2]>0)
                  || (analize_tmp[i_max][0]==1.0 && analize_tmp[i_max][2]<0) )
                    {right_light = 0.0;};
                io.push_back(left_light);
                io.push_back(x_tmp);
                io.push_back(y_tmp);
                io.push_back(right_light);
                spirit.push_back(io);
                io.clear();
                analize_tmp.clear();
                };
    };
                i_min = 0;
                i_max = 0;
                cos_a = analize_tmp[0][1];
                sin_a = analize_tmp[0][2];
                max_a = cos_a/sqrt(pow(cos_a,2)+pow(sin_a,2)) ;
                min_a = max_a;
                for (int d=1; d max_a ){
                    max_a = tmp;
                    i_max = d;
                   };
                    if ( tmp < min_a ){
                    min_a = tmp;
                    i_min = d;
                   };
                };
                x_tmp = analize_tmp[0][3];
                y_tmp = analize_tmp[0][4];
                left_light = 1.0;
                if ( (analize_tmp[i_min][0]==1.0 && analize_tmp[i_min][2]>0) || (analize_tmp[i_min][0]==0.0 && analize_tmp[i_min][2]<0) )
                    {left_light = 0.0;};
                right_light = 1.0;
                if ((analize_tmp[i_max][0]==0.0 && analize_tmp[i_max][2]>0) || (analize_tmp[i_max][0]==1.0 && analize_tmp[i_max][2]<0))
                    {right_light = 0.0;};
                io.push_back(left_light);
                io.push_back(x_tmp);
                io.push_back(y_tmp);
                io.push_back(right_light);
                spirit.push_back(io);
                io.clear();
                analize_tmp.clear();
    parameter_tmp = his[his.size()-1][0];
    if (parameter_tmp < 1.0){
    io.push_back(right_N);
    io.push_back(x1);
    io.push_back(y1);
    io.push_back(right_N);
    spirit.push_back(io);
    io.clear();
   };
return spirit;
};
std::vector> add_triangle (std::vector> shad,
                                               std::vector triangle_shad,
                                               double r_point){
    std::vector> merge_shadow;
    merge_shadow.clear();
    std::vector> spirit;
    std::vector shad_el;
    double x0 = triangle_shad[0];
    double y0 = triangle_shad[1];
    double x1 = triangle_shad[2];
    double y1 = triangle_shad[3];
    double x2 = triangle_shad[4];
    double y2 = triangle_shad[5];
    double x0_;
    double y0_;
    double x1_;
    double y1_;
    if(shad.size() == 0 ){
        shad_el.push_back(x0);
        shad_el.push_back(y0);
        shad_el.push_back(x1);
        shad_el.push_back(y1);
        merge_shadow.push_back(shad_el);
        shad_el.clear();

        shad_el.push_back(x1);
        shad_el.push_back(y1);
        shad_el.push_back(x2);
        shad_el.push_back(y2);
        merge_shadow.push_back(shad_el);
        shad_el.clear();

        shad_el.push_back(x2);
        shad_el.push_back(y2);
        shad_el.push_back(x0);
        shad_el.push_back(y0);
        merge_shadow.push_back(shad_el);
        shad_el.clear();
    } else {
    double t1_point = r_point/(sqrt(pow((x1-x0),2) + pow((y1 - y0),2)));
    double t2_point = r_point/(sqrt(pow((x2-x1),2) + pow((y2 - y1),2)));
    double t3_point = r_point/(sqrt(pow((x0-x2),2) + pow((y0 - y2),2)));
    double u0;
    double v0;
    double u1;
    double v1;
    std::vector point1_t;
    std::vector point2_t;
    std::vector point3_t;
    std::vector> segment1_t;
    std::vector> segment2_t;
    std::vector> segment3_t;
    std::vector point1_tau;
    std::vector point2_tau;
    std::vector> segment4_tau;
    std::vector> vector_tmp;
    std::vector> his_1t;
    std::vector> his_2t;
    std::vector> his_3t;
    std::vector> his_tau;
    std::vector io;
    std::array Jordano_t1;
    std::array Jordano_t2;
    std::array Jordano_t3;
    std::array Jordano_tau;

    Jordano_t1[0] = 0;
    Jordano_t1[1] = 0;

    Jordano_t2[0] = 0;
    Jordano_t2[1] = 0;

    Jordano_t3[0] = 0;
    Jordano_t3[1] = 0;

    Jordano_tau[0] = 0;
    Jordano_tau[1] = 0;

    point1_t.clear();
    point1_t.push_back(x0);
    point1_t.push_back(y0);

    point2_t.clear();
    point2_t.push_back(x1);
    point2_t.push_back(y1);

    point3_t.clear();
    point3_t.push_back(x2);
    point3_t.push_back(y2);

    segment1_t.clear();
    segment1_t.push_back(point1_t);
    segment1_t.push_back(point2_t);

    segment2_t.clear();
    segment2_t.push_back(point2_t);
    segment2_t.push_back(point3_t);

    segment3_t.clear();
    segment3_t.push_back(point3_t);
    segment3_t.push_back(point1_t);

    his_1t.clear();
    his_2t.clear();
    his_3t.clear();
    Jordano_t1[0] = 0;
    Jordano_t1[1] = 0;
    Jordano_t2[0] = 0;
    Jordano_t2[1] = 0;
    Jordano_t3[0] = 0;
    Jordano_t3[1] = 0;
    if(interval_point_point(segment1_t[0][0],segment1_t[0][1],segment1_t[1][0],segment1_t[1][1])>r_point &&
       interval_point_point(segment2_t[0][0],segment2_t[0][1],segment2_t[1][0],segment2_t[1][1])>r_point &&
       interval_point_point(segment3_t[0][0],segment3_t[0][1],segment3_t[1][0],segment3_t[1][1])>r_point)
       {
    for (int k = 0; k< shad.size(); k++){
    u0 = shad[k][0];
    v0 = shad[k][1];
    u1 = shad[k][2];
    v1 = shad[k][3];

    double tau_point = r_point/(sqrt(pow((u1-u0),2) + pow((v1 - v0),2)));

    point1_tau.clear();
    point1_tau.push_back(u0);
    point1_tau.push_back(v0);

    point2_tau.clear();
    point2_tau.push_back(u1);
    point2_tau.push_back(v1);

    segment4_tau.clear();
    segment4_tau.push_back(point1_tau);
    segment4_tau.push_back(point2_tau);

    his_tau.clear();
    Jordano_tau[0] = 0;
    Jordano_tau[1] = 0;
       vector_tmp.clear();
       vector_tmp = segments_intersection_point(segment1_t,segment4_tau,r_point);
       two_histories(vector_tmp,his_1t,his_tau,Jordano_t1,Jordano_tau);
       vector_tmp.clear();
       vector_tmp = segments_intersection_point(segment2_t,segment4_tau,r_point);
       two_histories(vector_tmp,his_2t,his_tau,Jordano_t2,Jordano_tau);
       vector_tmp.clear();
       vector_tmp = segments_intersection_point(segment3_t,segment4_tau,r_point);
       two_histories(vector_tmp,his_3t,his_tau,Jordano_t3,Jordano_tau);
       if (his_tau.size()==0){
             if (Jordano_tau[0]%2 == 0){
                   shad_el.push_back(u0);
                   shad_el.push_back(v0);
                   shad_el.push_back(u1);
                   shad_el.push_back(v1);
                   merge_shadow.push_back(shad_el);
                   shad_el.clear();
                   };
             } else {
                   spirit.clear();
                   spirit = give_spirit_tau(segment4_tau,his_tau,Jordano_tau,tau_point);
                   for(int q = 1; q triangle_shadow;
    triangle_shadow.clear();
    triangle_shadow.push_back(1.0); //x1   (0.0)
    triangle_shadow.push_back(0.0); //y1   (0.0)
    triangle_shadow.push_back(1.0); //x2   (1.0)
    triangle_shadow.push_back(1.0); //y2   (0.0)
    triangle_shadow.push_back(0.0); //x3   (0.0)
    triangle_shadow.push_back(1.0); //y3   (1.0)

    std::vector> shadow;
    shadow.clear();
    std::vector shadow_element;

    shadow_element.push_back(0.0);   //u0   (0.0 );
    shadow_element.push_back(0.0);   //v0   (-0.5);
    shadow_element.push_back(1.0);    //u1    (0.5);
    shadow_element.push_back(0.0);    //v1    (0.0);
    shadow.push_back(shadow_element);
    shadow_element.clear();
    shadow_element.push_back(1.0);   //u0     (0.5);
    shadow_element.push_back(0.0);   //v0     (0.0);
    shadow_element.push_back(0.0);   //u1    (-0.5);
    shadow_element.push_back(1.0);   //v1    (0.0 );
    shadow.push_back(shadow_element);
    shadow_element.clear();
    shadow_element.push_back(0.0);   //u0    (-0.5);
    shadow_element.push_back(1.0);   //v0    (0.0 );
    shadow_element.push_back(0.0);  //u1    (0.0 );
    shadow_element.push_back(0.0);  //v1    (-0.5);
    shadow.push_back(shadow_element);
    shadow_element.clear();
//    shadow.clear();
        std::vector> rez_of_merge;
        rez_of_merge = add_triangle(shadow,triangle_shadow,r_point);

        if (rez_of_merge.size()>0){
             std::cout<< "rez_of_merge" <

© Habrahabr.ru