¿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