Пример #1
0
void Scene::traceRay(PhysicalRay *ray)
{
    Point3D *point = 0, *minpoint = 0;
    Virtual3DObject *nearestObj = 0;
    double mindist = 0;
    // Searching for nearest collision with any object
    Q_FOREACH(Virtual3DObject* obj, m_objects)
    {
        point = NULL;
        PictureObject* picobj = dynamic_cast<PictureObject*>(obj);
        if (picobj)
            point = picobj->intercrossWithRay(*ray);
        LensObject* lensobj = dynamic_cast<LensObject*>(obj);
        if (lensobj)
            point = lensobj->intercrossWithRay(*ray);
        ThinLensObject* thinlensobj = dynamic_cast<ThinLensObject*>(obj);
        if (thinlensobj)
            point = thinlensobj->intercrossWithRay(*ray);
        FlatMirrorObject* flatmirrorobj = dynamic_cast<FlatMirrorObject*>(obj);
        if (flatmirrorobj)
            point = flatmirrorobj->intercrossWithRay(*ray);
        if (point != NULL) {
            double dist = point->dist(ray->point());
            if ((dist > 1e-5) && ((minpoint == NULL) || (dist < mindist))) {
                if (minpoint != NULL)
                    delete minpoint;
                minpoint = point;
                mindist = dist;
                nearestObj = obj;
            } else
                delete point;
        }
    }