Skip to content

Instantly share code, notes, and snippets.

@soaresfabricio
Last active August 29, 2015 14:20
Show Gist options
  • Select an option

  • Save soaresfabricio/b0f34b44ad49db5800c1 to your computer and use it in GitHub Desktop.

Select an option

Save soaresfabricio/b0f34b44ad49db5800c1 to your computer and use it in GitHub Desktop.
Drawing lines with linear interpolation
void drawLine( pixel * inicio, pixel * final) {
int largura = final->abscissa - inicio->abscissa ;
int altura = final->ordenada - inicio->ordenada ;
int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0 ;
dx1 = largura < 0 ? -1 : 1;
dy1 = altura < 0 ? -1 : 1;
dx2 = dx1;
int maisLongo = abs(largura);
int maisCurto = abs(altura) ;
if (!(maisLongo > maisCurto)) {
std::swap(maisLongo, maisCurto);
dy2 = altura < 0 ? -1 : 1;
dx2 = 0 ;
}
int numerador = maisLongo >> 1 ;
pixel inicio2 = *inicio;
for (int i = 0; i <= maisLongo; i++) {
if ( altura * dy1 <= largura ) {
for (int i = R; i <= A; i++)
{
inicio->cor[i] = (unsigned char)(inicio2.cor[i] + (inicio->abscissa - inicio2.abscissa) * (final->cor[i] - inicio2.cor[i]) / largura);
}
} else {
for (int i = R; i <= A; i++)
{
inicio->cor[i] = (unsigned char)(inicio2.cor[i] + (inicio->ordenada - inicio2.ordenada) * (ifnal->cor[i] - inicio2.cor[i]) / altura);
}
}
putpixel(inicio);
numerador += maisCurto ;
if (!(numerador < maisLongo)) {
numerador -= maisLongo ;
inicio->abscissa += dx1 ;
inicio->ordenada += dy1 ;
} else {
inicio->abscissa += dx2 ;
inicio->ordenada += dy2 ;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment