2009-11-16 3 views
-2

다음 글을 썼습니다 만, 하나의 문자 (문자 디스플레이) 대신 단일 픽셀 (그래픽 디스플레이)에 맞도록 수정 한 후에 이해하지 못합니다.이 알고리즘을 이해하고 해결할 수 있도록 도와주세요.

XRES x YRES는 각 문자의 픽셀 해상도입니다. LCDGraphic은이 값을 기반으로 고유 한 문자를 그립니다. 이 전환 알고리즘의 아이디어는 오른쪽, 왼쪽 또는 (양쪽 모두) 오른쪽으로 한 줄 이동하고 다음 줄을 누른 다음 오른쪽으로 이동할 수 있다는 것입니다. 텍스트 버전은 예상대로 작동하지만 번역을 위해 그래픽 디스플레이, 그것은 이상한 행동.

LCOLS은 256 (sentinal)이며 이 실행될 때마다이 센티넬까지 transition_tick_이 증가합니다. 따라서 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

내가 이해하지 못하는 이유는 오른쪽이나 왼쪽으로 갈지라도 첫 번째 글자가 비어있는 이유입니다. 내가 말했듯이, 시행 착오. 나는 그것이 그 일을하기를 기대하지 않았고, 그것이 효과가있을 때, 나는 그것을 홀로 남겨 두었습니다. 나는 그 때보다 훨씬 더 많이 이해하지만,이 특별한 문제는 나에게 혼란을 주었다. 나는 아직도 왜 그렇게했는지 이해하지 못합니다. 프로그래머로서의 약점입니다. 나는 dyscalculia를 가지고 있으며, 어떤 문제는 저를 넘어갑니다. 나는 문제에 대해 반추하고 결국 그것을 얻는다. – 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); 
} 
관련 문제