Ayuda dibujando linea SDL

Hola, quiero hacer una funcion que me dije una line con SDL en la pantalla, que para trabajar en el ordenador tengo a 800x600.
He probado varias funciones y todas me van bien si los puntos son aproximados, ejmp:p1(0,0), p2(300,300) o p1(250,250), p2(0,0).
El probema es si le meto p1(200, 350),p2(800, 0) que lo dibuja mal.
Esta es la funcion que he creado:

void putline(SDL_Surface *screen, int xa, int ya, int xb, int yb, Uint32 color)
{
int xx;
float yy;
if (xa<=xb)
{
for (xx=xa;xx<=xb;xx++)
{
yy=((((yb-ya)/(xb-xa))*xx)+((ya-(xa*((yb-ya)/(xb-xa))))));
putpixel (screen,xx,(int) yy,color);
}
}
else
{
for (xx=xa;xx>=xb;xx--)
{
yy=((((yb-ya)/(xb-xa))*xx)+((ya-(xa*((yb-ya)/(xb-xa))))));
putpixel (screen,xx,yy,color);
}
}
}

y la linea la dibujo llamando a la funcion:
putline (screen, 200, 350, 800, 0, SDL_MapRGB(screen->format, 0, 0, 0));

Gracias y un saludo!
Edito: la funcion putpixel dibuja un pixel, xx es la coordenada x e yy es la coordenada y.
Hola, parece que estás utilizando el algoritmo de fuerza bruta para dibujar líneas,¿no es correcto? Te recomendaría que utilizaras el del punto medio que es bastante más eficiente, ya que no utiliza casi cálculos en coma flotante. Este año en la universidad he realizado unas prácticas en las que lo usábamos, si quieres te puedo pasar el código.
Saludos.
Delroy escribió:Hola, parece que estás utilizando el algoritmo de fuerza bruta para dibujar líneas,¿no es correcto? Te recomendaría que utilizaras el del punto medio que es bastante más eficiente, ya que no utiliza casi cálculos en coma flotante. Este año en la universidad he realizado unas prácticas en las que lo usábamos, si quieres te puedo pasar el código.
Saludos.


Habia probado varias cosas, pero como siempre lo hacia mal pues decici coger la formula matematica de una recta y ponerla a lo bestia.
Si me puedes pasar algo que me sirva te lo agradecere [beer] [beer] [beer] [beer] [beer]
A ver, te paso el código tal como lo hice yo, o sea, con las funciones propias de la librería que usábamos. A partir de ahí puedes adaptar el tuyo. Si tienes alguna duda, que supongo que sí, no dudes en preguntar, aquí o por privado.
Por cierto, si no has estudiado nunca el algorítmo del punto medio te recomiendo este pdf, ahí está la base teórica.
http://www.dsic.upv.es/~cmonserr/TID/Bloque1_apuntes.pdf
Saludos.

Parece que al enviar el archivo se ha perdido la cabecera de la función, es ésta:
DibujaLinea(int p1[2], int p2[2]){

Adjuntos

Muchas gracias, voy a mirarlo tranquilamente

Edito:
Conseguido, muchas gracias Delroy.
4 respuestas