Помогите мне понять и исправить этот алгоритм - PullRequest
0 голосов
/ 16 ноября 2009

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

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

LCOLS равно 256 (часовой), и 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);
}

1 Ответ

1 голос
/ 16 ноября 2009

Я понял это. Просто половина 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...