Como obtenho três pontos não colineares em um avião? - C ++

Estou tentando implementar no algoritmo de interseção no plano da linha. De acordo com Wikipedia Eu preciso de três pontos não colineares no avião para fazer iss

Eu tentei implementarthis algoritmo em C ++, no entanto. Definitivamente, algo está errado, porque não faz sentido que eu possa escolher quaisquer coordenadas xey que elas se encaixem no plano. E se o plano for vertical e ao longo do eixo x? Nenhum ponto com y = 1 estaria no plan

Percebo que esse problema foi publicado muito no StackOverflow, e vejo muitas soluções em que o plano é definido por 3 pontos. Mas eu só tenho uma posição normal e. E não posso testar meu algoritmo de interseção no plano da linha antes de resolver meu localizador de pontos não colineare

O problema agora é que estou dividindo pelo normal.z e que obviamente não funcionará quando o normal.z for 0.

Estou testando com este plano: Plane * p = new Plane (Color (), Vec3d (0.0,0.0,0.0), Vec3d (0.0,1.0,0.0)); // segundo parâmetro: posição, terceiro parâmetro: normal

O código atual fornece esta resposta incorreta:

{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

Aqui está o meu 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;
}

Percebo que posso estar tentando resolver isso totalmente errado. Em caso afirmativo, vincule uma implementação concreta disso. Tenho certeza de que deve existir quando vejo tantas implementações de interseção de plano de linha.

Desde já, obrigado

questionAnswers(3)

yourAnswerToTheQuestion