float ACO(Element x[SIZE][SIZE],int n,int k[2*SIZE],int m)
{   
    int i,j,c,q1,q2;   
    

    if(m==0)
    { 
       q1 = 38 ;
       q2 = 33 ;
    }
    else
    {
      q1 = 70 ;
      q2 = 65 ;
    }
    for(i=0;i<n;i++)
{ 
    x[i][n+1].flag=0;
    for(j=0;j<n;j++)
    {   
        if(i==j)
        x[i][j].flag=1;
        else
        x[i][j].flag=0;
     }
}
    
    float sum=0;
    int dest,p=0;
    int source = GetRand(0,n-1);
    int f = source ;
/*  printf("\n %d \n",source) ; */
    for(c=0;c<n;c++)
    {  
       
          if(c==(n-1))
          dest=f;
          else
          dest = pseudorand(x,source,n,f,q1,q2);
          if(dest==n+1)
          return 0;
          x[source][n+1].flag++;
          x[dest][n+1].flag++;
          x[source][dest].flag++;
          x[dest][source].flag++;
          sum+=x[source][dest].e;
          k[p]=source;
      /*  printf("  %d,%d  ",source,dest); */
          k[++p]=dest;
          p++;
          source = dest ;
         } 
     
     return sum;
}
float ACOr(Element x[SIZE][SIZE],int n,int k[2*SIZE],int a[2])
{   
    int i,j,c;   
 
    for(i=0;i<n;i++)
{ 
    x[i][n+1].flag=0;
    for(j=0;j<n;j++)
    {   
        if(i==j)
        x[i][j].flag=1;
        else
        x[i][j].flag=0;
     }
}
    
    float sum1=0;
    int dest,g;
    int p=0;
    int z = 0;
    int source = a[z];
    int f = source ;
    x[f][n+1].flag = 1 ;
    g = a[1] ;
/*  printf("\n %d \n",source) ; */
    for(c=0;c<(n-1);c++)
    {  
       
          if(c==(n-2))
          dest=g;
          else
          dest = pseudorand(x,source,n,g,36,32);
          if(dest==n+1)
          { /* printf("error"); */
            return 0;  }
          x[source][n+1].flag++;
          x[dest][n+1].flag++;
          x[source][dest].flag++;
          x[dest][source].flag++;
          sum1+=x[source][dest].e;
          k[p]=source;
 /*       printf("  %d,%d  ",source,dest); */ 
          k[++p]=dest;
          p++;
          source = dest ;
         }
/*    printf("  %d  ",sum1);   */
         return sum1;
     
}
Esempio n. 3
0
void CameraOrtho::calcCamRay(const int x, const int y, Ray &ray) const
{
    // Tent filter for each ray's xy directions
    float r1 = 2.0f * pseudorand(), dx = r1 < 1.0f ? std::sqrt(r1) - 1.0f : 1.0f - std::sqrt(2.0f - r1);
    float r2 = 2.0f * pseudorand(), dy = r2 < 1.0f ? std::sqrt(r2) - 1.0f : 1.0f - std::sqrt(2.0f - r2);

    // Construct the ray's origin vector
    vec3 e = m_transform.getPosition();
    vec3 s = e + vec3(m_film.getResolutionX() * 0.5f - x + dx + 0.5f, m_film.getResolutionY() * 0.5f - y + dy + 0.5f, 5.0f) * m_zoom;

    // Get the ray's direction vector
    vec3 p = m_transform.getOrientation().getForwardVector();

    // Rotate the ray origin based on camera orientation
    quaternion q = m_transform.getOrientation();
    quaternion q_inv = q.conjugate();
    quaternion w(0.0f, s.x, s.y, s.z);
    quaternion r = q * w * q_inv;

    // Assign final parameters to the output &ray
    ray.setOrigin(vec3(r.x, r.y, r.z));
    ray.setDirection(p);
}