Exemple #1
0
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);
}
Exemple #2
0
                /**
                 * 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;
                }