Example #1
0
File: me.c Project: rforge/phyloc
edge *topFirstTraverse(tree *T, edge *e)
     /*topFirstTraverse starts from the top of T, and from there moves stepwise
       down, left before right*/
     /*assumes tree has been detrifurcated*/
{
  edge *f;
  if (NULL == e)
    return(T->root->leftEdge); /*first Edge searched*/
  else if (!(leaf(e->head)))
    return(e->head->leftEdge); /*down and to the left is preferred*/
  else /*e->head is a leaf*/
    {
      f = moveUpRight(e);
      return(f);
    }
}
void MoveToTheVictim::moveToTheCell(std::vector<int> &x_coord, std::vector<int> &y_coord, TVector &cell, TPlayer &bot/*,
                   rbw::Player * bot_n*/)
{
    //std::cout << "moveToTheCell -> ";
    TVector new_coord,old_coord;

    //----------------it's new---------------------//
    int x_start, x_end, y_start, y_end;
    if(bot.coord.x != x_coord[cell.x] + 1)
    {
        new_coord.x = (x_coord[cell.x] + x_coord[cell.x+1]) / 2 + 1;
        x_start = new_coord.x - 1;
        x_end = new_coord.x;
    }
            else
    {
        new_coord.x = (x_coord[cell.x] + x_coord[cell.x+1]) / 2;
        x_start = new_coord.x;
        x_end = new_coord.x + 1;
    }
    if(bot.coord.y != y_coord[cell.y] + 1)
    {
        new_coord.y = (y_coord[cell.y] + y_coord[cell.y+1]) / 2 + 1;
        y_start = new_coord.y - 1;
        y_end = new_coord.y;
    }
            else
    {
        new_coord.y = (y_coord[cell.y] + y_coord[cell.y+1]) / 2;
        y_start = new_coord.y;
        y_end = new_coord.y + 1;
    }
    if( this->pixelIsInTheWall(new_coord) )
        for(int i = x_start; (i < x_end)&&(this->pixelIsInTheWall(new_coord))&&
            (new_coord.x == bot.coord.x)&&(new_coord.y == bot.coord.y); i++)
            for(int j = y_start; (j < y_end)&&(this->pixelIsInTheWall(new_coord))&&
                (new_coord.x == bot.coord.x)&&(new_coord.y == bot.coord.y); j++)
            {
                new_coord.x = i;
                new_coord.y = j;
            }
    //------------------------------------------//

       /* if(this->pixelIsInTheWall(new_coord))
        {
            if(this->)
        }
*/
      //std::cout << "Bot want move to (" << new_coord.x << "," <<
      //             new_coord.y << ");" << std::endl;
     // std::cout << "This pixel is in the wall: " << this->pixelIsInTheWall(new_coord) << ";" << std::endl;
      //std::cout << "x_coord: " << x_coord[cell.x] << " - " << x_coord[cell.x+1] << ";" << std::endl;
      //std::cout << "y_coord: " << y_coord[cell.y] << " - " << y_coord[cell.y+1] << ";" << std::endl;
        //else
//        new_coord.y = (y_coord[cell.y] + y_coord[cell.y+1]) / 2;
    old_coord = bot.coord;
    std::cout << "Bot_coord: (" << old_coord.x << "," << old_coord.y << ");\n";
    int way_part1,way_part2,time1,time2;

    /*TVector real_speed;
    sf::Vector2f speed = bot_n->GetSpeed();
    real_speed.x = (int)speed.x;
    real_speed.y = (int)speed.y;
    EvadeFromTheRocket stells_system(this->server);
    stells_system.saveDirection(*bot_n,real_speed);
    */
    if( (new_coord.x >= bot.coord.x)&&(new_coord.y <= bot.coord.y ) )
    {
       // std::cout << "IF\n";
        if(new_coord.x - bot.coord.x <  bot.coord.y - new_coord.y)
        {
            way_part1 = new_coord.x - bot.coord.x;
            way_part2 = bot.coord.y - new_coord.y - way_part1;
            num = (way_part1 + way_part2)/2 + 1; // --- //
            time1 = int(way_part1 / bot.speed * 1000) + 1;
            time2 = int(way_part2 / bot.speed * 1000);
            if(time1 < unthinkable_time)
                time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2);
                        else
            {
                time1 = unthinkable_time;
                time2 = 0;
            }
            //if(time1 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y - 1 << ");\n";
            moveUpRight(time1);
            //if(time2 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x << "," << old_coord.y - 1 << ");\n";
            moveUp(time2);
            return;
        }
                else
        {
            way_part1 = bot.coord.y - new_coord.y;
            way_part2 = new_coord.x - bot.coord.x - way_part1;
            num = (way_part1 + way_part2)/2 + 1; // --- //
            time1 = int(way_part1 / bot.speed * 1000) + 1;
            time2 = int(way_part2 / bot.speed * 1000);
            if(time1 < unthinkable_time)
                time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2);
                        else
            {
                time1 = unthinkable_time;
                time2 = 0;
            }
            //if(time1 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y - 1 << ");\n";
            moveUpRight(time1);
            //if(time2 != 0)
            //   std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y << ");\n";
            moveRight(time2);
            return;
        }
    }
    if( (new_coord.x >= bot.coord.x)&&(new_coord.y >= bot.coord.y ) )
    {
        //std::cout << "IF\n";
        if(new_coord.x - bot.coord.x < new_coord.y - bot.coord.y)
        {
            way_part1 = new_coord.x - bot.coord.x;
            way_part2 = new_coord.y - bot.coord.y - way_part1;
            num = (way_part1 + way_part2)/2 + 1; // --- //
            time1 = int(way_part1 / bot.speed * 1000) + 1;
            time2 = int(way_part2 / bot.speed * 1000);
            if(time1 < unthinkable_time)
                time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2);
                        else
            {
                time1 = unthinkable_time;
                time2 = 0;
            }
            //if(time1 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y + 1 << ");\n";
            moveDownRight(time1);
            //if(time2 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x << "," << old_coord.y - 1 << ");\n";
            moveDown(time2);
            return;
        }
                else
        {
            way_part1 = new_coord.y - bot.coord.y;
            way_part2 = new_coord.x - bot.coord.x - way_part1;
            num = (way_part1 + way_part2)/2 + 1; // --- //
            time1 = int(way_part1 / bot.speed * 1000) + 1;
            time2 = int(way_part2 / bot.speed * 1000);
            if(time1 < unthinkable_time)
                time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2);
                        else
            {
                time1 = unthinkable_time;
                time2 = 0;
            }
            //if(time1 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y + 1 << ");\n";
            moveDownRight(time1);
            //if(time2 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y << ");\n";
            moveRight(time2);
            return;
        }
    }
    if( (new_coord.x <= bot.coord.x)&&(new_coord.y >= bot.coord.y ) )
    {
        //std::cout << "IF\n";
        if(bot.coord.x - new_coord.x < new_coord.y - bot.coord.y)
        {
            way_part1 = bot.coord.x - new_coord.x;
            way_part2 = new_coord.y - bot.coord.y - way_part1;
            num = (way_part1 + way_part2)/2 + 1; // --- //
            time1 = int(way_part1 / bot.speed * 1000) + 1;
            time2 = int(way_part2 / bot.speed * 1000);
            if(time1 < unthinkable_time)
                time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2);
                        else
            {
                time1 = unthinkable_time;
                time2 = 0;
            }
            //if(time1 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y + 1 << ");\n";
            moveDownLeft(time1);
            //if(time2 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x << "," << old_coord.y + 1 << ");\n";
            moveDown(time2);
            return;
        }
                else
        {
            way_part1 = new_coord.y - bot.coord.y;
            way_part2 = bot.coord.x - new_coord.x - way_part1;
            num = (way_part1 + way_part2)/2 + 1; // --- //
            time1 = int(way_part1 / bot.speed * 1000) + 1;
            time2 = int(way_part2 / bot.speed * 1000);
            if(time1 < unthinkable_time)
                time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2);
                        else
            {
                time1 = unthinkable_time;
                time2 = 0;
            }
            //if(time1 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y + 1 << ");\n";
            moveDownLeft(time1);
            //if(time1 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y << ");\n";
            moveLeft(time2);
            return;
        }
    }
    if( (new_coord.x <= bot.coord.x)&&(new_coord.y <= bot.coord.y ) )
    {
        //std::cout << "IF\n";
        if(bot.coord.x - new_coord.x < bot.coord.y - new_coord.y)
        {
            way_part1 = bot.coord.x - new_coord.x;
            way_part2 = bot.coord.y - new_coord.y - way_part1;
            num = (way_part1 + way_part2)/2 + 1; // --- //
            time1 = int(way_part1 / bot.speed * 1000) + 1;
            time2 = int(way_part2 / bot.speed * 1000);
            if(time1 < unthinkable_time)
                time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2);
                        else
            {
                time1 = unthinkable_time;
                time2 = 0;
            }
            //if(time1 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y - 1 << ");\n";
            moveUpLeft(time1);
            //if(time2 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x << "," << old_coord.y - 1 << ");\n";
            moveUp(time2);
            return;
        }
                else
        {
            way_part1 = bot.coord.y - new_coord.y;
            way_part2 = bot.coord.x - new_coord.x - way_part1;
            num = (way_part1 + way_part2)/2 + 1; // --- //
            time1 = int(way_part1 / bot.speed * 1000) + 1;
            time2 = int(way_part2 / bot.speed * 1000);
            if(time1 < unthinkable_time)
                time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2);
                        else
            {
                time1 = unthinkable_time;
                time2 = 0;
            }
            //if(time1 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y - 1 << ");\n";
            moveUpLeft(time1);
            //if(time2 != 0)
            //    std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y << ");\n";
            moveLeft(time2);
            return;
        }
    }
}
Example #3
0
File: NNI.c Project: Ward9250/ape
void NNIupdateAverages(double **A, edge *e, edge *par, edge *skew,
		       edge *swap, edge *fixed, tree *T)
{
  node *v;
  edge *elooper;
  v = e->head;
  /*first, v*/
  A[e->head->index][e->head->index] =
    (swap->bottomsize*
     ((skew->bottomsize*A[skew->head->index][swap->head->index]
       + fixed->bottomsize*A[fixed->head->index][swap->head->index])
      / e->bottomsize) +
     par->topsize*
     ((skew->bottomsize*A[skew->head->index][par->head->index]
       + fixed->bottomsize*A[fixed->head->index][par->head->index])
      / e->bottomsize)
     ) / e->topsize;

  elooper = findBottomLeft(e); /*next, we loop over all the edges
				 which are below e*/
  while (e != elooper)
    {
      A[e->head->index][elooper->head->index] =
	A[elooper->head->index][v->index]
	= (swap->bottomsize*A[elooper->head->index][swap->head->index] +
	   par->topsize*A[elooper->head->index][par->head->index])
	/ e->topsize;
      elooper = depthFirstTraverse(T,elooper);
    }
  elooper = findBottomLeft(swap); /*next we loop over all the edges below and
				    including swap*/
  while (swap != elooper)
  {
    A[e->head->index][elooper->head->index] =
      A[elooper->head->index][e->head->index]
      = (skew->bottomsize * A[elooper->head->index][skew->head->index] +
	 fixed->bottomsize*A[elooper->head->index][fixed->head->index])
      / e->bottomsize;
    elooper = depthFirstTraverse(T,elooper);
  }
  /*now elooper = skew */
  A[e->head->index][elooper->head->index] =
    A[elooper->head->index][e->head->index]
    = (skew->bottomsize * A[elooper->head->index][skew->head->index] +
       fixed->bottomsize* A[elooper->head->index][fixed->head->index])
    / e->bottomsize;

  /*finally, we loop over all the edges in the tree
    on the far side of parEdge*/
  elooper = T->root->leftEdge;
  while ((elooper != swap) && (elooper != e)) /*start a top-first traversal*/
    {
      A[e->head->index][elooper->head->index] =
	A[elooper->head->index][e->head->index]
	= (skew->bottomsize * A[elooper->head->index][skew->head->index]
	   + fixed->bottomsize* A[elooper->head->index][fixed->head->index])
	/ e->bottomsize;
      elooper = topFirstTraverse(T,elooper);
    }

  /*At this point, elooper = par.
    We finish the top-first traversal, excluding the subtree below par*/
  elooper = moveUpRight(par);
  while (NULL != elooper)
    {
      A[e->head->index][elooper->head->index]
	= A[elooper->head->index][e->head->index]
	= (skew->bottomsize * A[elooper->head->index][skew->head->index] +
	   fixed->bottomsize* A[elooper->head->index][fixed->head->index])
	/ e->bottomsize;
      elooper = topFirstTraverse(T,elooper);
    }
}