¿Cómo obtengo tres puntos no colineales en un avión? - C ++

Estoy intentando implementar en el algoritmo de intersección línea-plano. De acuerdo a Wikipedia Necesito tres puntos no colineales en el avión para hacer eso.

or lo tanto, @ intenté implementareste algoritmo en C ++, sin embargo. Algo definitivamente está mal, porque no tiene sentido que pueda elegir las coordenadas x e y y que quepan en el plano. ¿Qué pasa si el plano es vertical y a lo largo del eje x? Ningún punto con y = 1 estaría entonces en el plano.

Me doy cuenta de que este problema se ha publicado mucho en StackOverflow, y veo muchas soluciones en las que el avión está definido por 3 puntos. Pero solo tengo una posición normal y otra. Y no puedo probar mi algoritmo de intersección línea-plano antes de ordenar mi buscador de puntos no colineales.

El problema en este momento es que estoy dividiendo entre normal.z, y eso obviamente no funcionará cuando normal.z sea 0.

Estoy probando con este plano: Plano * p = nuevo Plano (Color (), Vec3d (0.0,0.0,0.0), Vec3d (0.0,1.0,0.0)); // segundo parámetro: posición, tercer parámetro: normal

El código actual da esta respuesta incorrecta:

{0 , 0 , 0} // alright, this is the original
{12.8377 , 17.2728 , -inf} // obviously this is not a non-colinear point on the given plane

Aquí está mi código:

std::vector<Vec3d>* Plane::getThreeNonColinearPoints() {
    std::vector<Vec3d>* v = new std::vector<Vec3d>();

    v->push_back(Vec3d(position.x, position.y, position.z)); // original position can serve as one of the three non-colinear points.

    srandom(time(NULL));

    double rx, ry, rz, start;

    rx = Plane::fRand(10.0, 20.0);
    ry = Plane::fRand(10.0, 20.0);
    // Formula from here: http://en.wikipedia.org/wiki/Plane_(geometry)#Definition_with_a_point_and_a_normal_vector
    // nx(x-x0) + ny(y-y0) + nz(z-z0) = 0
    // |-----------------| <- this is "start"
    //I'll try to insert position as x0,y0,z0 and normal as nx,ny,nz, and solve the equation
    start = normal.x * (rx - position.x) + normal.y * (ry - position.y);
    // nz(z-z0) = -start
    start = -start;
    // (z-z0) = start/nz
    start /= normal.z; // division by zero
    // z = start+z0
    start += position.z;
    rz = start;

    v->push_back(Vec3d(rx, ry, rz));

    // TODO one more point

    return v;
}

Me doy cuenta de que podría estar tratando de resolver esto totalmente mal. Si es así, enlace una implementación concreta de esto. Estoy seguro de que debe existir, cuando veo tantas implementaciones de intersección línea-plano.

Gracias por adelantado

Respuestas a la pregunta(6)

Su respuesta a la pregunta