vector<vector<Point> > Resampling(vector<Point>* input_contour, vector<Point>* refer_point) { int i,j; int size = (*input_contour).size(); Point temp; Point Head = (*refer_point)[0]; Point Left_foot = (*refer_point)[1]; Point Right_foot = (*refer_point)[2]; int Head_num=0,Right_foot_num=0,Left_foot_num=0; vector<Point> Head_start_contour(size); int Seg1_length = 0; int Seg2_length = 0; int Seg3_length = 0; int Seg1_sample_point=15; int Seg2_sample_point=10; int Seg3_sample_point=15; for(i=0;i<size;i++) { temp = (*input_contour)[i]; if(temp==Head){Head_num = i;} else if(temp==Right_foot){Right_foot_num=i;} else if(temp==Left_foot){Left_foot_num=i;} else{;}; } if(Head_num > Right_foot_num) { Seg2_length = Right_foot_num - Left_foot_num; Seg3_length = Head_num - Right_foot_num; for(j=Head_num;j<size;j++){Head_start_contour[j-Head_num] = (*input_contour)[j];} for(j=0;j<Head_num;j++){Head_start_contour[j+(size-Head_num)] = (*input_contour)[j];} Right_foot_num = Right_foot_num + (size - Head_num); Left_foot_num = Left_foot_num + (size - Head_num); Head_num = 0; Seg1_length = Left_foot_num; } else if(Head_num < Right_foot_num) { Seg1_length = Left_foot_num - Head_num; Seg2_length = Right_foot_num - Left_foot_num; for(j=Head_num;j<size;j++){Head_start_contour[j-Head_num] = (*input_contour)[j];} for(j=0;j<Head_num;j++){Head_start_contour[j+(size-Head_num)] = (*input_contour)[j];} Right_foot_num = Right_foot_num - Head_num; Left_foot_num = Left_foot_num - Head_num; Head_num = 0; Seg3_length = size - Right_foot_num; } double Seg1_inter_length = ((double)Seg1_length/(double)Seg1_sample_point); double Seg2_inter_length = ((double)Seg2_length/(double)Seg2_sample_point); double Seg3_inter_length = ((double)Seg3_length/(double)Seg3_sample_point); int Whole_point_num = Seg1_sample_point + Seg2_sample_point + Seg3_sample_point; int index1=0,index2=0,index3=0; vector<Point> Segment1(Seg1_sample_point); vector<Point> Segment2(Seg2_sample_point); vector<Point> Segment3(Seg3_sample_point); vector<vector<Point> > result; int k; for(k=0;k<Seg1_sample_point;k++) { index1 = (int)k*Seg1_inter_length; Segment1[k] = Head_start_contour[index1]; temp = Segment1[k]; //cout << index1 << ":" << temp << endl; } for(k=0;k<Seg2_sample_point;k++) { index2 = Seg1_length + (int)k*Seg2_inter_length; Segment2[k] = Head_start_contour[index2]; temp = Segment2[k]; //cout << index2 << ":" << temp << endl; } for(k=0;k<Seg3_sample_point;k++) { index3 = (Seg1_length+Seg2_length) + (int)k*Seg3_inter_length; Segment3[k] = Head_start_contour[index3]; temp = Segment3[k]; //cout << index3 << ":" << temp << endl; } result.push_back(Segment1); result.push_back(Segment2); result.push_back(Segment3); return result; }
bool hit(Ray const& ray, T& minDistance, T& maxDistance) const { minDistance = T(0); maxDistance = T(+inf()); for (int axis = 0; axis < 2; ++axis) { T lo = (min[axis] - ray.origin[axis]) / ray.direction[axis]; T hi = (max[axis] - ray.origin[axis]) / ray.direction[axis]; minDistance = photon_mapping::max(photon_mapping::min(lo, hi), minDistance); maxDistance = photon_mapping::min(photon_mapping::max(lo, hi), maxDistance); } return minDistance <= maxDistance; } }; template <typename T> Segment3<T> const Segment3<T>::NOTHING = Segment3( Point3<T>(+inf(), +inf(), +inf()), Point3<T>(-inf(), -inf(), -inf()) ); template <typename T> Segment3<T> const Segment3<T>::EVERYTHING = Segment3( Point3<T>(-inf(), -inf(), -inf()), Point3<T>(+inf(), +inf(), +inf()) ); typedef Segment3<int> Segment3i; typedef Segment3<float> Segment3f; template <typename T> Point3<T> center(Segment3<T> const& segment) { return Point3<T>( (segment.min.x + segment.max.x) / 2.0f,