Пример #1
0
void LDLT_Solve (Tensor2Symmetric_t<Factor> const & a,
                 Factor & x,
                 Factor const & b)
{
    typedef Eigen::Matrix<typename Factor::Scalar,Factor::DIM,Factor::DIM,Eigen::RowMajor> EigenMatrix;
    typedef Eigen::Matrix<typename Factor::Scalar,Factor::DIM,1,Eigen::ColMajor> EigenVector;
    typedef Tensor2_t<typename Factor::WithStandardEuclideanBasis, typename Factor::WithStandardEuclideanBasis> Tensor;

    Tensor blow_up(Tenh::Static<Tenh::WithoutInitialization>::SINGLETON);

    EuclideanEmbedding_t<Factor> e;
    EuclideanEmbeddingInverse_t<Factor> e_inv;

    TypedIndex_t<typename Factor::WithStandardEuclideanBasis,'i'> i;
    TypedIndex_t<Factor,'j'> j;
    TypedIndex_t<Factor,'k'> k;
    TypedIndex_t<typename Factor::WithStandardEuclideanBasis,'l'> l;

    typename Factor::WithStandardEuclideanBasis tensor_return_value(Tenh::Static<Tenh::WithoutInitialization>::SINGLETON),
                                                tensor_column(Tenh::Static<Tenh::WithoutInitialization>::SINGLETON);

    blow_up(i*l) = e(i*j)*a(j*k)*e(l*k);

    tensor_column(i) = e(i*j)*b(j);

    EigenVector return_value, eigen_column;

    Eigen::LDLT<EigenMatrix> LDLTMatrix(EigenMap_of_Tensor2(blow_up).ldlt());

    memcpy(&eigen_column(0,0), tensor_column.pointer_to_allocation(), tensor_column.allocation_size_in_bytes());

    return_value = LDLTMatrix.solve(eigen_column);

    memcpy(tensor_return_value.pointer_to_allocation(), &return_value(0,0), tensor_return_value.allocation_size_in_bytes());

    x(j) = e_inv(j*i)*tensor_return_value(i);
}
Пример #2
0
    ViewingArea::ViewingArea(GLFWwindow* ptr, GLContext* context):PythonObject<ViewingArea>(this),zCamera_(-1),angle_(0),zScaleOrtho_(0.01f),glfwWindowPointer_(ptr),glContext_(context)
    {
      for(unsigned int i = 0;i<N_4X4_ELEMENTS;i++)   
	projectionMatrix_[i]=inverseProjectionMatrix_[i]=screenToDeviceMatrix_[i]=deviceToScreenMatrix_[i]=i%5?0:1;
      centerAndRelative_[X_INDEX]=centerAndRelative_[Y_INDEX]=0;
      insetCenter_[X_INDEX]=insetCenter_[Y_INDEX]=insetRelative_[X_INDEX]=insetRelative_[Y_INDEX]=0;
      int w,h;
      glfwGetWindowSize(ptr,&w,&h);
      set_size(w,h);
      set_margins(100,100,100,100);
      blow_up(0,0,1,1);
      set_z_camera(-1);
      set_viewing_angle(45);

    }
Пример #3
0
int game(int type){
  int game_over = 0;
  {
    surface *background = new_image("background.png");
    apply_texture(background, window);
    destroy_surface(background);
  }
  initialize_cameras();initialize_star();initialize_ships(2);initialize_dust();
  initialize_shot();initialize_ai();
  play_music("music.ogg");
  draw_tank(0, (window_width / 2 - 421), window_height / 2 - 150);
  draw_tank(1, window_width / 2 + 401, window_height / 2 - 150);
    // Main loop
  for(;;){
    int i;
    get_input();
    if(keyboard[ESC] || game_over){
      break;
    }
    
    for(i = 0; i < 2; i ++)
      if(ship[i].status == DEAD){
	struct timeval now;
	gettimeofday(&now, NULL);
	if((int) (now.tv_sec - ship[i].time.tv_sec) > 2)
	  game_over = 1;
      }



    erase_ships();    
    erase_shot();     
    
    if(type != CPU_X_CPU){ // Rotation: 10 Propulse: 20 Fire: 20 Hyper: 180 
      int my_ship;
      // Player 1 moves
      if(type == CPU_X_PLR){
	ai_play(0);
	my_ship = 1;
      }
      else if(type == PLR_X_CPU){
	my_ship = 0;
	ai_play(1);
      }
      else
	my_ship = 0;
      if(keyboard[LEFT])
	rotate_ship(my_ship, LEFT); 
      if(keyboard[RIGHT])
	rotate_ship(my_ship, RIGHT);
      if(keyboard[UP])
	propulse_ship(my_ship);
      if(keyboard[DOWN])
	ship_fire(my_ship);
      if(keyboard[RIGHT_CTRL])
	goto_hyperspace(my_ship);
    }
    else{
      ai_play(0);
      ai_play(1);
    }

    if(type == PLR_X_PLR){ 
      // Player 2 moves
      if(keyboard[A])
	rotate_ship(1, LEFT);
      if(keyboard[D])
	rotate_ship(1, RIGHT);
      if(keyboard[W])
	propulse_ship(1);
      if(keyboard[L])
	blow_up(1);
      if(keyboard[S])
	ship_fire(1);
      if(keyboard[LEFT_CTRL])
	goto_hyperspace(1);
    }
    
    update_star(); // 6
    update_ships(); // 2
    update_dust(); // 145
    update_shot(); // 16
    film_ships(); // Até 16
    film_dust(); // 20
    film_shot(); // Até 20
    weaver_rest(10000000);
  }
  stop_music();
  destroy_star();
  destroy_ships();
  destroy_cameras();
  destroy_dust();
  destroy_shot();
  clean_keyboard();
  return 0;
}