当前位置: 首页>>代码示例>>C++>>正文


C++ Vector4::HasNonNegativeEntries方法代码示例

本文整理汇总了C++中Vector4::HasNonNegativeEntries方法的典型用法代码示例。如果您正苦于以下问题:C++ Vector4::HasNonNegativeEntries方法的具体用法?C++ Vector4::HasNonNegativeEntries怎么用?C++ Vector4::HasNonNegativeEntries使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Vector4的用法示例。


在下文中一共展示了Vector4::HasNonNegativeEntries方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: RT_shade

// For Shading Purposes
void RT_shade(Ray* ray, int depth) {
    
    if (depth <= MAX_DEPTH){                
        
        // Color Coefficients
        Vector4* diffuseCoeff = new Vector4();
        Vector4* specularCoeff = new Vector4();
        double shininess;
        
        // Diffuse and Specular Terms
        double diffuseTerm[3] = {0.0, 0.0, 0.0};
        double specularTerm[3] = {0.0, 0.0, 0.0};
        
        if (ray->intersectedObject == SPHERE) {

            diffuseCoeff->ReInitialize(spheres[ray->intersectID].color_diffuse);
            specularCoeff->ReInitialize(spheres[ray->intersectID].color_specular);
            shininess = spheres[ray->intersectID].shininess;
        }
        else if (ray->intersectedObject == TRIANGLE) {

            // Interpolate diffuse and specular coefficients
            double alpha, beta;
            ObtainIntermediateTriangleIntersection(ray->intersectID, ray->intersectPoint, &alpha, &beta);

            diffuseCoeff->ReInitialize();
            InterpolateTriangleProperty(triangles[ray->intersectID].v[0].color_diffuse,
                    triangles[ray->intersectID].v[1].color_diffuse,
                    triangles[ray->intersectID].v[2].color_diffuse,
                    alpha, beta, diffuseCoeff, false);

            specularCoeff->ReInitialize();
            InterpolateTriangleProperty(triangles[ray->intersectID].v[0].color_specular,
                    triangles[ray->intersectID].v[1].color_specular,
                    triangles[ray->intersectID].v[2].color_specular,
                    alpha, beta, specularCoeff, false);

            // Interpolate shininess
            if (alpha > 0) {

                double intermediateShininess = beta * triangles[ray->intersectID].v[2].shininess
                        + (1 - beta) * triangles[ray->intersectID].v[1].shininess;

                shininess = ((alpha - 1) * triangles[ray->intersectID].v[0].shininess
                        + intermediateShininess) / alpha;
            } 
            else {
                shininess = triangles[ray->intersectID].v[0].shininess;
            }
        }

        // Boundary Checking        
        assert(diffuseCoeff->HasNonNegativeEntries());
        assert(!diffuseCoeff->HasGreaterThanOneEntries());
        assert(specularCoeff->HasNonNegativeEntries());
        assert(!specularCoeff->HasGreaterThanOneEntries());
        assert(shininess >= 0);
        
        // Normal Vector: N
        Vector4* N = new Vector4(ray->normal);
        N->ConvertToUnitVector();
        
        // Viewer Direction: V = ray->intersectedPoint - ray->source = -ray->dir
        Vector4* V = new Vector4(ray->dir);
        V->Scale(-1);
        V->ConvertToUnitVector();
        
        int dontCheckObject = NONE;
        int dontCheckObjectID = NONE;
        
        if (ray->intersectedObject == TRIANGLE) {
            dontCheckObject = ray->intersectedObject;
            dontCheckObjectID = ray->intersectID;
        }
        
                
        unsigned int i;
        for (i = 0; i < num_lights; i++) {            
            
            // Shoot a ray in the direction of the light
            Vector4* lightPos = new Vector4(lights[i].position);
            Ray* checkShadow = new Ray(ray->intersectPoint, lightPos);
            bool shadow = false;            
            
            double nearestTIntersect = FindNearestTIntersection(checkShadow,dontCheckObject,dontCheckObjectID);
            double point2LightDistance = FindDistanceOfIntersectedPointWithLight(ray,i);
            if (nearestTIntersect != INFINITY 
                && nearestTIntersect< point2LightDistance)
            {
                shadow = true;    
            }

            // Point to Light Vector: L = light_pos - intersectedPoint
            Vector4* L = new Vector4(lights[i].position);
            L->Subtraction(ray->intersectPoint);
            L->ConvertToUnitVector();            

            // Reflected Ray: R = 2(N.L)N - L
            Vector4* R = new Vector4(ray->normal);
//.........这里部分代码省略.........
开发者ID:AshishPrasad,项目名称:Ray-Tracing,代码行数:101,代码来源:assign3.cpp

示例2: FindNearestTIntersection

double FindNearestTIntersection(Ray* ray, int noCheckObject = NONE, int noCheckID = NONE){
    
    assert((noCheckObject==NONE && noCheckID==NONE) 
            || (noCheckObject==SPHERE && noCheckID>=0 && noCheckID<num_spheres)
            || (noCheckObject==TRIANGLE && noCheckID>=0 && noCheckID<num_triangles));
            
    
    int dontCheckSphereID = NONE;
    int dontCheckTriangleID = NONE;
    
    if(noCheckObject==SPHERE){
        dontCheckSphereID = noCheckID;
    }
    if(noCheckObject==TRIANGLE){
        dontCheckTriangleID = noCheckID;
    }
    
    int index1 = NONE;
    double nearestSphereIntersect = FindNearestTIntersectionWithSphere(ray,&index1, dontCheckSphereID);    
        
    int index2 = NONE;    
    double nearestTriangleIntersect = FindNearestTIntersectionWithTriangle(ray,&index2, dontCheckTriangleID);    
    
//    // For Debugging Purposes
//    printf("[%f,%f]\t",nearestSphereIntersect,nearestTriangleIntersect);
    
    int index = NONE;
    double nearestTIntersect = INFINITY;
    
    if (nearestSphereIntersect < nearestTriangleIntersect){
        nearestTIntersect = nearestSphereIntersect;
        index = index1;
    }
    else{
        nearestTIntersect = nearestTriangleIntersect;
        index = index2;
        
//        // For Debugging Purposes
//        intersectTriangle[index] = 1;
    }
    
    if (index != NONE) {

        ray->intersectID = index;
        ray->tIntersect = nearestTIntersect;

        // Obtaining Intersection Point = P0 + t*dir
        ray->intersectPoint->ReInitialize(ray->dir->vector);
        ray->intersectPoint->Scale(nearestTIntersect);
        ray->intersectPoint->Addition(ray->source);
        
        ray->color->ReInitialize(ambient_light);             
                
        if (index == index1){
            
            ray->intersectedObject = SPHERE;            

            // Obtaining normal at Intersection Point = intersectPoint - center
            ray->normal->ReInitialize(spheres[index].position);
            ray->normal->Scale(-1);
            ray->normal->Addition(ray->intersectPoint);
            ray->normal->ConvertToUnitVector();

            // Assuming ambient coefficient = diffused coefficient, add ambient light
            ray->color->Scale(spheres[index].color_diffuse[0], spheres[index].color_diffuse[1],
                    spheres[index].color_diffuse[2]);                
        }
        else {
            
            ray->intersectedObject = TRIANGLE;
            
            // Obtaining normal at Intersection Point
            double alpha = 0.0, beta = 0.0;
            ObtainIntermediateTriangleIntersection(index, ray->intersectPoint, &alpha, &beta);
            //printf("\n(%f,%f):%f\n",alpha,beta,ray->tIntersect);
            
            InterpolateTriangleProperty(triangles[index].v[0].normal, triangles[index].v[1].normal,
                    triangles[index].v[2].normal, alpha, beta, ray->normal, true);

            // Assuming ambient coefficient = diffused coefficient, add ambient light
            Vector4* diffusedCoeff = new Vector4();
            InterpolateTriangleProperty(triangles[index].v[0].color_diffuse, triangles[index].v[1].color_diffuse, triangles[index].v[2].color_diffuse,
                    alpha, beta, diffusedCoeff);
                      
            assert(diffusedCoeff->HasNonNegativeEntries());
            ray->color->Scale(diffusedCoeff->vector[0], diffusedCoeff->vector[1], diffusedCoeff->vector[2]);
            delete(diffusedCoeff);
        }
    }    
    
    return nearestTIntersect;
}
开发者ID:AshishPrasad,项目名称:Ray-Tracing,代码行数:92,代码来源:assign3.cpp


注:本文中的Vector4::HasNonNegativeEntries方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。