P
Hab ich schon, aber da blick ich mal gar nicht durch.
Ich hab mir jetzt mal was mit Hilfe dieser Seite gebaut:
http://www.cl.cam.ac.uk/teaching/1999/AGraphHCI/SMAG/node1.html
Damit habe ich bisher folgendes:
Shape* Zylinder::intersect(point3d const& rayUrsprung, vector3d const& rayRichtung, point3d& result)
{
vector3d normRichtung = normalize(rayRichtung);
vector3d const p(minPunkt_, rayUrsprung);
double const a = ((normRichtung[0] * normRichtung[0]) + (normRichtung[1] * normRichtung[1]));
double const b = ((2 * rayUrsprung[0] * normRichtung[0]) + (2 * rayUrsprung[1] * normRichtung[1]));
double const c = ((rayUrsprung[0] * rayUrsprung[0]) + (rayUrsprung[1] * rayUrsprung[1]) -1);
double ray_length;
double t0, t1, z0, z1;
t0= (- b + std::sqrt((b*b) - (4*a*c))) / (2 * a);
t1= (- b - std::sqrt((b*b) - (4*a*c))) / (2 * a);
z0= (rayUrsprung[2] + t0 * normRichtung[2]);
z1= (rayUrsprung[2] + t1 * normRichtung[2]);
if (epsilon < z0)
ray_length = z0;
else if (epsilon > z1)
ray_length = z1;
else {
return NULL;
}
if (ray_length < distance(rayUrsprung, result)) {
result = get_intersection(rayUrsprung, normRichtung, ray_length);
return this;
}
return NULL;
}
Wobei nach den z alles noch mehr oder minder von der Kugel stammt. Jetzt geht es wieder um die min und max z Vergleiche. Ich blicke gerade nicht mehr durch.....wann, was wie....ahh, wenn das morgen nicht raus müsste, wäre schlaf angebracht! Also wenn ihr mir nochmal nen Schupser geben könntet?^^
P.S.: Diese ominöse Epsilon:
double const epsilon = std::numeric_limits<double>::epsilon() *96;