00001
00005 #include "Ring.h"
00006 #include "BoundingBox.h"
00007 #include "HitRecord.h"
00008 #include "Math.h"
00009 #include "Ray.h"
00010 #include <iostream>
00011 #include <stdlib.h>
00012 using namespace std;
00013
00014 Ring::Ring(Material* material, const Point &c, const Vector& n, const double r1, const double r2)
00015 : Primitive(material), center(c), norm(n), radius1(r1), radius2(r2)
00016 {
00017 r1Sq = r1 * r1;
00018 r2Sq = r2 * r2;
00019
00020 norm.normalize();
00021 d = Dot(norm, c);
00022 }
00023
00024 Ring::~Ring()
00025 {
00026 }
00027
00028 void Ring::intersect(HitRecord& hit, const RenderContext& context, const Ray& ray) const
00029 {
00030 double denom = Dot(norm, ray.direction());
00031 if(Abs(denom) > 1.e-6){
00032 double t = (d-Dot(norm, ray.origin()))/denom;
00033
00034 Point pt = ray.origin() + ray.direction() * t;
00035
00036 Vector v = pt - center;
00037
00038 double l = v.length2();
00039 if (l < r2Sq && l > r1Sq) {
00040 hit.hit(t, this, matl);
00041 }
00042 }
00043
00044 }
00045
00046
00047 void Ring::normal(Vector& normal, const RenderContext&,
00048 const Point&, const Ray&, const HitRecord&) const
00049 {
00050 normal = norm;
00051 }
00052
00053 void Ring::getBounds(BoundingBox& bbox) const
00054 {
00055 Vector diag(radius1, radius1, radius1);
00056 bbox.extend(center+diag);
00057 bbox.extend(center-diag);
00058 }
00059