Логика кода для нахождения пересечения между двумя линиями
Это часть кода из определенной пользователем функции (программное обеспечение 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;
}