2009-11-16 2 views
-2

Я написал следующее, но я не понимаю его после его модификации, чтобы он соответствовал одиночным пикселям (графическим дисплеям) вместо одиночных символов (символьных отображений).Помогите мне разобраться и исправить этот алгоритм

XRES x YRES - это разрешение пикселей каждого символа. LCDGraphic рисует собственные символы на основе этих значений. Идея в этом алгоритме перехода состоит в том, что вы можете идти вправо, влево или (оба) в одну строку, оставлять следующую строку, затем правую и т. Д. Текстовая версия работает так, как предполагается, но когда я перевел ее для графические дисплеи, это странно.

LCOLS is 256 (sentinal), а transition_tick_ увеличивается до этой стражи каждый раз, когда выполняется LCDGraphic::Transition(). col может находиться в диапазоне между 0-255. Ну, когда пиксели идут влево и вправо, они должны двигаться вместе. Однако по какой-то причине линии, идущие вправо, двигаются до тех пор, пока они не закончатся, а линии, двигающиеся влево, двигаются, пока они не закончатся. Похоже, что где col - < 128, левые движущиеся линии регулируются, тогда, когда col - >= 128, правые движущиеся линии корректируют. Я довольно смущен этим.

void LCDGraphic::Transition() { 
    int direction = visitor_->GetDirection(); 
    int col; 
    transitioning_ = true; 
    for(unsigned int row = 0; row < LROWS/YRES; row++) { 
     if(direction == TRANSITION_LEFT || 
      (direction == TRANSITION_BOTH && row % 2 == 0)) 
      col = LCOLS - transition_tick_; 
     else if(direction == TRANSITION_RIGHT || direction == TRANSITION_BOTH) 
      col = transition_tick_; 
     else 
      col = 0; 

     if(col < 0) 
      col = 0; 

     for(unsigned int i = 0; i < YRES; i++) { 
      int n = row * YRES * LCOLS + i * LCOLS; 
      for(unsigned int l = 0; l < 1; l++) {// LAYERS; l++) { 
       RGBA tmp[LCOLS]; 
       memcpy(tmp + XRES, GraphicFB[l] + n + col + XRES, (LCOLS - col) * sizeof(RGBA)); 
       for(unsigned j = 0; j < XRES; j++) 
         tmp[j] = NO_COL; 
       memcpy(GraphicFB[l] + n + col, tmp, sizeof(RGBA) * (LCOLS - col)); 
      } 
     }  
    } 

    transition_tick_+=XRES; 
    if(transition_tick_ >= (int)LCOLS) { 
     transitioning_ = false; 
     transition_tick_ = 0; 
     emit static_cast<LCDEvents *>(
      visitor_->GetWrapper())->_TransitionFinished(); 
    } 

    GraphicBlit(0, 0, LROWS, LCOLS); 
} 
+5

«Я написал следующее, но я не понимаю его» - как вы могли его написать, если вы этого не понимаете? –

+0

Я сначала написал его в Python, где «списки» очень просты в обращении. Мне посчастливилось немного разобраться. Небольшое испытание и ошибка проходят долгий путь. – Scott

+0

Что я никогда не понимал по этому поводу, почему первый символ пуст, независимо от того, идет ли он вправо или влево. Как я уже сказал, проб и ошибок. Я не ожидал, что он сделает то, что он сделал, и когда он просто сработал, я оставил его в покое. Я понимаю это намного больше, чем тогда, но эта конкретная проблема путала меня до конца. Я до сих пор не понимаю, почему это произошло. Это моя слабость, как программист; У меня есть дискалькулия, и некоторые проблемы просто выходят за рамки меня. Я размышляю над проблемами и в конечном итоге получаю их. – Scott

ответ

1

Я понял. Всего половина LCOLS. Странная проблема. Я все еще немного смущен.

void LCDGraphic::Transition() { 
    int direction = visitor_->GetDirection(); 
    int col; 
    transitioning_ = true; 
    for(unsigned int row = 0; row < LROWS/YRES; row++) { 
     if(direction == TRANSITION_LEFT || 
      (direction == TRANSITION_BOTH && row % 2 == 0)) 
      col = LCOLS/2 - transition_tick_; // changed this line 
     else if(direction == TRANSITION_RIGHT || direction == TRANSITION_BOTH) 
      col = transition_tick_; 
     else 
      col = 0; 

     if(col < 0) 
      col = 0; 

     for(unsigned int i = 0; i < YRES; i++) { 
      int n = row * YRES * LCOLS + i * LCOLS; 
      for(unsigned int l = 0; l < 1; l++) {// LAYERS; l++) { 
       RGBA tmp[LCOLS]; 
       LCDError("Transition: LROWS: %u, LCOLS: %u, n: %d, row: %d, col: %d, calc1: %d, calc2: %d, fb: %p, tmp: %p", 
        LROWS, LCOLS, n, row, col, n + col + XRES, (LCOLS - col) * sizeof(RGBA), GraphicFB, tmp); 
       memcpy(tmp + XRES, GraphicFB[l] + n + col + XRES, (LCOLS - col) * sizeof(RGBA)); 
       for(unsigned j = 0; j < XRES; j++) 
         tmp[j] = NO_COL; 
       memcpy(GraphicFB[l] + n + col, tmp, sizeof(RGBA) * (LCOLS - col)); 
      } 
     } 
    } 

    transition_tick_+=XRES; 
    if(transition_tick_ >= (int)LCOLS/2) { //changed this line 
     transitioning_ = false; 
     transition_tick_ = 0; 
     emit static_cast<LCDEvents *>(
      visitor_->GetWrapper())->_TransitionFinished(); 
    } 

    GraphicBlit(0, 0, LROWS, LCOLS); 
} 
Смежные вопросы