Calcular la intersección de plano y plano (con implementación de c ++)

Bases teóricas:

Una línea recta en el espacio puede representarse mediante una coordenada de punto y un vector de dirección. Al calcular la línea de intersección de dos planos, el vector de dirección transversal se puede obtener por el producto transversal de los vectores normales de los dos planos, y luego se puede obtener cualquier punto de la línea.

Derivación de fórmula:

Plano 1: a1x + b1y + c1z + d1 = 0; Plano 2: a2x + b2y + c2z + d2 = 0
vector normal plano; n1 = (a1, b1, c1), n2 = (a2, b2, c2)
línea de intersección El vector de dirección n = n1 × n2 = (b1 c2-c1 b2, c1 a2-a1 c2, a1 b2-b1 a2)
Sea cualquier punto de la línea (x, y, z)
Sea x = 0, obtenga:
b1y + c1z + d1 = 0, b2y + c2z + d2 = 0,
es decir,
y = - (c1z + d1) / b1 = - (c2z + d2) / b2
solución:
z = - (d1 / b1-d2 / b2) / (c1 / b1-c2 / b2)
y = -c1 / b1z-d1 / b1
= c1 * (d1 / b1-d2 / b2) / b1 / (c1 / b1-c2 / b2) -d1 / b1
desde la dirección recta El vector y un punto de coordenadas pueden determinar la línea.

Realización del programa:

Este programa se implementa en C ++ sobre la base de la biblioteca pcl, herramienta de conocimiento del lenguaje de programación, puede apreciar sus ideas:

void calcLine(pcl::ModelCoefficients::Ptr coefsOfPlane1, pcl::ModelCoefficients::Ptr coefsOfPlane2, pcl::ModelCoefficients::Ptr coefsOfLine)
{
    //方向向量n=n1×n2=(b1*c2-c1*b2,c1*a2-a1*c2,a1*b2-b1*a2)
    pcl::ModelCoefficients temcoefs;
    double a1, b1, c1, d1, a2,b2, c2, d2;
    double tempy, tempz;
    a1= coefsOfPlane1->values[0];
    b1= coefsOfPlane1->values[1];
    c1= coefsOfPlane1->values[2];
    d1= coefsOfPlane1->values[3];
    a2= coefsOfPlane2->values[0];
    b2= coefsOfPlane2->values[1];
    c2= coefsOfPlane2->values[2];
    d2= coefsOfPlane2->values[3];
    tempz= -(d1 / b1 - d2 / b2) / (c1 / b1 - c2 / b2);
    tempy= (-c1 / b1)*tempz - d1 / b1;
    coefsOfLine->values.push_back(0.0);
    coefsOfLine->values.push_back(tempy);
    coefsOfLine->values.push_back(tempz);
    coefsOfLine->values.push_back(b1*c2 - c1*b2);
    coefsOfLine->values.push_back(c1*a2 - a1*c2);
    coefsOfLine->values.push_back(a1*b2 - b1*a2);
}

Verificación de resultados:

Inserte la descripción de la imagen aquí

22 artículos originales publicados · Me gusta2 · Visitas 1157

Supongo que te gusta

Origin blog.csdn.net/qinqinxiansheng/article/details/104615531
Recomendado
Clasificación