int calculate_pixel(t_pov *pov, t_pixel *pixel, t_object *objects, t_coordinate *lightsource) { t_coordinate rayvector; int i; int color; t_intersect intersect; t_intersect intersectsaved; intersectsaved.k = 0.0; i = 0; calculate_vector(pov, pixel, &rayvector); color = 0x00000000; while (i < OBJECTS_NB) { intersect = calculate_intersection(pov, &rayvector, &objects[i]); if ((intersect.k < intersectsaved.k && intersect.k > 0) || (intersect.k > 0 && intersectsaved.k == 0)) intersectsaved = intersect; i++; } if (intersectsaved.k != 0) color = find_color(&intersectsaved, pov, &rayvector, lightsource, objects); return (color); }
/** * Find intersection between segments. * * @param problem_reporter Any intersections found are reported to this object. * @returns true if there are intersections. */ bool find_intersections(osmium::area::ProblemReporter* problem_reporter) const { if (m_segments.empty()) { return false; } bool found_intersections = false; for (auto it1 = m_segments.begin(); it1 != m_segments.end()-1; ++it1) { const NodeRefSegment& s1 = *it1; for (auto it2 = it1+1; it2 != m_segments.end(); ++it2) { const NodeRefSegment& s2 = *it2; assert(s1 != s2); // erase_duplicate_segments() should have made sure of that if (outside_x_range(s2, s1)) { break; } if (y_range_overlap(s1, s2)) { osmium::Location intersection = calculate_intersection(s1, s2); if (intersection) { found_intersections = true; if (m_debug) { std::cerr << " segments " << s1 << " and " << s2 << " intersecting at " << intersection << "\n"; } if (problem_reporter) { problem_reporter->report_intersection(s1.way()->id(), s1.first().location(), s1.second().location(), s2.way()->id(), s2.first().location(), s2.second().location(), intersection); } } } } } return found_intersections; }