Логика кода для нахождения пересечения между двумя линиями

Это часть кода из определенной пользователем функции (программное обеспечение Fluent-CFD) для деформации сетки.

В комментарии говорится, что он находит пересечение между двумя линиями.

Мои вопросы:

1. Представляют ли значения t1 и t2 координаты X и Y точки пересечения?

2. Как он находит пересечение?(Помогите мне с математикой, я не могу распознать формулу, написанную для (*t1 и *t2)). Было бы здорово, если бы вы могли дать некоторое геометрическое объяснение формулы.

    # include "udf.h"
    # include "dynamesh_tools.h"
   /* # define DEBUG */
    #if RP_DOUBLE
    #define SMALL_NUMBER 1e-8
    #else
    #define SMALL_NUMBER 1e-4
    #endif
    extern real RPM;
    extern int Num_Layers;

    /* Find the intersection t1 and t2 for two lines*/
    static void find_t(real xa, real ya, real xb, real yb,
                 real xc, real yc, real xd, real yd,
                 real *t1, real *t2, int * flag)
    { 
      if((xd==xc)&&(xb!=xa))
      {   
        if(yd==yc)
        {     
          Message0("\nc and d are the same points-aborting!!!\n");
          exit(0);
        }
          (*flag) = 2;
          (*t1) = (xc-xa)/(xb-xa);
          (*t2) = ((yb-ya)*(*t1)-(yc-ya))/(yd-yc);
       }
      else if((xd!=xc)&&(xb==xa))
       {
         if(yb==ya)
         {  
            Message0("\na and b are the same points-aborting!!!\n");
            exit(0);
          }
            (*flag) = 2;
            (*t2) = (xc-xa)/(xc-xd);
            (*t1) = ((yd-yc)*(*t2)+(yc-ya))/(yb-ya);
          }
    else if((xd==xc)&&(xb==xa))
          {
             (*flag) = 0;
             return;
          }
    else
         {   
           real k1, k2;
           k1 = (yd-yc)/(xd-xc);
           k2 = (yb-ya)/(xb-xa);
           if(fabs(k2)>=fabs(k1))
       {      
         if(k1==k2)
         {
            (*flag) = 0;
            return;
         }
          (*flag) = 1;
          (*t1) = (-k1*(xc-xa)+(yc-ya))/((yb-ya)-k1*(xb-xa));
          (*t2) = ((xb-xa)*(*t1)-(xc-xa))/(xd-xc);
         }
      else
         { 
           (*flag) = 1;
           (*t2) = (-k2*(xc-xa)+(yc-ya))/(-(yd-yc)+k2*(xd-xc));
           (*t1) = ((xd-xc)*(*t2)+(xc-xa))/(xb-xa);
         }
        }
           return;
           }

0 ответов

Другие вопросы по тегам