Я написал следующее, но я не понимаю его после его модификации, чтобы он соответствовал одиночным пикселям (графическим дисплеям) вместо одиночных символов (символьных отображений).Помогите мне разобраться и исправить этот алгоритм
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);
}
«Я написал следующее, но я не понимаю его» - как вы могли его написать, если вы этого не понимаете? –
Я сначала написал его в Python, где «списки» очень просты в обращении. Мне посчастливилось немного разобраться. Небольшое испытание и ошибка проходят долгий путь. – Scott
Что я никогда не понимал по этому поводу, почему первый символ пуст, независимо от того, идет ли он вправо или влево. Как я уже сказал, проб и ошибок. Я не ожидал, что он сделает то, что он сделал, и когда он просто сработал, я оставил его в покое. Я понимаю это намного больше, чем тогда, но эта конкретная проблема путала меня до конца. Я до сих пор не понимаю, почему это произошло. Это моя слабость, как программист; У меня есть дискалькулия, и некоторые проблемы просто выходят за рамки меня. Я размышляю над проблемами и в конечном итоге получаю их. – Scott