public override IRayHit Intersect(IRay ray) { IVector p = ray.Origin; IVector u = ray.Direction; IVector v = new Vector(this.Position, p); float b = 2 * (v.Dot(u)); float c = v.Dot(v) - this.Radius.X * this.Radius.X; float discriminant = b * b - 4 * c; if (discriminant < 0) { return(null); } float timeMinus = (b * -1 - ((float)Math.Sqrt(discriminant))) / 2; float timePlus = (b * -1 + ((float)Math.Sqrt(discriminant))) / 2; if (timeMinus < 0 && timePlus < 0) { return(null); } IVector intersection; IVector normal; float timeIntersection; bool incoming; if (timeMinus < 0 && timePlus > 0) { timeIntersection = timePlus; intersection = ray.GetEndAt(timePlus); normal = new Vector(intersection, this.Position); incoming = false; } else { timeIntersection = timeMinus; intersection = ray.GetEndAt(timeMinus); normal = new Vector(this.Position, intersection); incoming = true; } return(new RayHit(ray, this, this, normal.Normalize(), intersection, timeIntersection, incoming)); }
public override IRayHit Intersect(IRay ray) { float denominator = this.Normal.Dot(ray.Direction); if (Math.Abs(denominator) > 0.0f) { IVector difference = this.Position.Minus(ray.Origin); float t = difference.Dot(this.Normal) / denominator; if (t > 0.0f) { IVector intersectionPoint = ray.GetEndAt(t); return(new RayHit(ray, this, this, this.Normal, intersectionPoint, t, false)); } } return(null); }