Bennu Game Development

Foros en Español => Recursos => Mensaje iniciado por: carles en Junio 12, 2010, 09:22:16 am

Título: Funcion para dibujar triangulos
Publicado por: carles en Junio 12, 2010, 09:22:16 am

He hecho una funcion para dibujar triangulos ya que no encontre la correspondiente en bennu.

[code language="bennu"]
Program Triangle;

Global
   angulo1;
   distancia1=100;
begin
   set_mode(320,240,16);
   set_fps(30,0);
   write_var(0,0,0,0,fps);
   
   loop
      if(key(_esc)) exit(); end
      triangle(get_distx(angulo1,distancia1)+160,
         get_disty(angulo1,distancia1)+120,
         get_distx(angulo1+120000,distancia1)+160,
         get_disty(angulo1+120000,distancia1)+120,
         get_distx(angulo1-120000,distancia1)+160,
         get_disty(angulo1-120000,distancia1)+120,
         rgb(125,125,125));
//      triangle(10,10,50,50,110,70,rgb(125,125,125));
      angulo1+=1000;
      frame;
   end
end


Process triangle(x1,y1,x2,y2,x3,y3,color);

Private
   dalt;
   baix;
   dreta;
   esquerra;
   a;
   direccio;
   
   float ax; float ay;
   float bx; float by;
   float cx; float cy;
   float dx1; float dx2; float dx3;
   float ex; float ey;
   float sx; float sy;

Begin

   if(y1>=y2 and y1>=y3) baix=y1;
   elseif(y2>=y1 and y2>=y3) baix=y2;
   else baix=y3; end
   
   if(y1<=y2 and y1<=y3) dalt=y1;
   elseif(y2<=y1 and y2<=y3) dalt=y2;
   else dalt=y3; end

   if(x1>=x2 and x1>=x3) dreta=x1;
   elseif(x2>=x1 and x2>=x3) dreta=x2;
   else dreta=x3; end
//-----------------------------------------------------   
   if(x1<=x2 and x1<=x3) esquerra=x1;
   elseif(x2<=x1 and x2<=x3) esquerra=x2;
   else esquerra=x3;
   end
//------------------------------------------------------
   if(y1<=y2 and y1<=y3)
      if(y2<=y3)
         ax=x1-esquerra; ay=y1-dalt;
         bx=x2-esquerra; by=y2-dalt;
         cx=x3-esquerra; cy=y3-dalt;
      else
         ax=x1-esquerra; ay=y1-dalt;
         bx=x3-esquerra; by=y3-dalt;
         cx=x2-esquerra; cy=y2-dalt;
      end
   end
   if(y2<=y1 and y2<=y3)
      if(y1<=y3)
         ax=x2-esquerra; ay=y2-dalt;
         bx=x1-esquerra; by=y1-dalt;
         cx=x3-esquerra; cy=y3-dalt;
      else
         ax=x2-esquerra; ay=y2-dalt;
         bx=x3-esquerra; by=y3-dalt;
         cx=x1-esquerra; cy=y1-dalt;
      end
   end
   if(y3<=y1 and y3<=y2)
      if(y1<=y2)
         ax=x3-esquerra; ay=y3-dalt;
         bx=x1-esquerra; by=y1-dalt;
         cx=x2-esquerra; cy=y2-dalt;
      else
         ax=x3-esquerra; ay=y3-dalt;
         bx=x2-esquerra; by=y2-dalt;
         cx=x1-esquerra; cy=y1-dalt;
      end
   end
   
   x=esquerra+((dreta-esquerra)/2);   
   y=dalt+((baix-dalt)/2);
   
   graph=new_map(dreta-esquerra+1,baix-dalt+1,16);
   drawing_map(0,graph);
   drawing_color(color);
   
   if(by-ay>0) dx1=(bx-ax)/(by-ay);
   else dx1=bx-ax;
   end

   if(cy-ay>0) dx2=(cx-ax)/(cy-ay);
   else dx2=0;
   end

   if(cy-by>0) dx3=(cx-bx)/(cy-by);
   else dx3=0;
   end

   sx=ax; sy=ay; ex=ax; ey=ay;

   if(dx1>dx2)
      while(sy<=by)
         draw_line(sx,sy,ex,sy);
         sy++;
         ey++;
         sx+=dx2;
         ex+=dx1;
      end
      ex=bx; ey=by;
      while(sy<=cy)
         draw_line(sx,sy,ex,sy);
         sy++;
         ey++;
         sx+=dx2;
         ex+=dx3;
      end
   else
      while(sy<=by)
         draw_line(sx,sy,ex,sy);
         sy++;
         ey++;
         sx+=dx1;
         ex+=dx2;
      end
      sx=bx; sy=by;
      while(sy<=cy)
         draw_line(sx,sy,ex,sy);
         sy++;
         ey++;
         sx+=dx3;
         ex+=dx2;
      end
   end

   drawing_color(rgb(255,0,0));
   draw_line(x1-esquerra,y1-dalt,x2-esquerra,y2-dalt);
   draw_line(x2-esquerra,y2-dalt,x3-esquerra,y3-dalt);
   draw_line(x1-esquerra,y1-dalt,x3-esquerra,y3-dalt);
   
   frame;
   unload_map(0,graph);
end
[/code]
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 12, 2010, 01:48:32 pm
acumulando karmas!

gracias
Título: Re: Funcion para dibujar triangulos
Publicado por: panreyes en Junio 12, 2010, 02:51:26 pm
A ver, pero ¿quién quiere hacer triángulos si puedes hacer... rectángulos?
Es broma, karma++! :D
Título: Re: Funcion para dibujar triangulos
Publicado por: Drumpi en Junio 12, 2010, 03:47:25 pm
Tercer código en 7 mensajes, esto merece premio :D
Ahora, con un poco de trabajo más, te montas un renderizado 3D por soft ^^U

Nah. Buen trabajo.
Título: Re: Funcion para dibujar triangulos
Publicado por: Fede en Junio 12, 2010, 03:51:28 pm
Gueeeee, algo que medio entiendo.   ;D

Me uno a la ola de karmas. Por un poné.  ;D
Título: Re: Funcion para dibujar triangulos
Publicado por: carles en Junio 13, 2010, 09:17:44 am

Este codigo ¿cómo consumiria menos recursos? ¿dibujando los triangulos por lineas o pixel a pixel?
Título: Re: Funcion para dibujar triangulos
Publicado por: panreyes en Junio 13, 2010, 09:29:41 am
Yo creo que consumiría menos si hicieses el fill del triángulo pixel a pixel
Título: Re: Funcion para dibujar triangulos
Publicado por: blostec en Junio 13, 2010, 11:35:01 am
Otra de Karma, gracias Carles por la función. Saludos!
Título: Re: Funcion para dibujar triangulos
Publicado por: Windgate en Junio 13, 2010, 03:43:22 pm
Esa variable llamada "esquerra" me ha matado ;D

Este tipo de algoritmos ya están inventados, si es para darle utilidad real lo mejor sería ver cómo lo hicieron los frikis matemáticos en su día. En su día implementé Gouraud a partir de primitivas 2D y había que rellenar las caras de los polígonos pixel a pixel, inicialmente hice un algoritmo "a pelo" y funcionaba, pero luego seguí el algoritmo "oficial" y funcionaba ráaaapidoooo.

Por cierto, siento el offtopic, pero molaría tener el draw_line y otras primitivas en 32 bits, con suavizado de bordes en la linea. Sé que una linea en 32 bits no es una linea estrictamente porque su grosor no siempre es 1 pixel exacto, pero como añadido a nuestro querido Bennu estaría bien. Creo que ya lo comenté en su día :P
Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 14, 2010, 07:10:11 pm
Bueno, quiero mis karmas tambien  ;D, aqui pongo uno que hace lineas (algoritmo bresenham) y tambien triangulos usando el put_pixel. No he probado el tuyo, así que probad el mio y comprobad si tiene mas rendimineto, le dais al space para generar líneas.

Código: [Seleccionar]
PROGRAM bresenham_lines;
PRIVATE
x0,y0;
colour;
BEGIN

set_mode(320, 240, 8);

repeat

 if(key(_space))
  x=rand(0,320);
  y=rand(0,200);
  x0=rand(0,320);
  y0=rand(0,200);
  colour=rand(0,255);
  draw_lines(x,y,x0,y0,colour);
 end
 frame;
until(key(_esc));

END

PROCESS draw_lines(xp,yp,xq,yq,colour)
PRIVATE
D=0;
dx,dy,c,M,xinc=1,yinc=1;
BEGIN
 x=xp;
 y=yp;
 dx=xq-xp;
 dy=yq-yp;

 if(dx<0) xinc=-1; dx=-dx; end
 if(dy<0) yinc=-1; dy=-dy; end

 if(dy < dx)
  c=2*dx; M=2*dy;

  while(x!=xq)
   put_pixel(x,y,colour);
   x+=xinc; D+=M;

   if(D>dx) y+=yinc; D-=c; end
  end
 else
  c=2*dy; M=2*dx;
  while(y!=yq)
   put_pixel(x,y,colour);
   y+=yinc; D+=M;

   if(D>dy) x+=xinc; D-=c; end
  end
 end
 put_pixel(xq,yq,colour);

END


PROCESS draw_box(x,y,x0,y0,colour)
BEGIN
 draw_lines(x,y,x+x0,y,colour);
 draw_lines(x,y,x,y+y0,colour);

 draw_lines(x,y+y0,x+x0,y+y0,colour);
 draw_lines(x+x0,y,x+x0,y+y0,colour);
end


PROCESS draw_triangle(x,y,x0,y0,x1,y1,colour)
BEGIN
 draw_lines(x,y,x0,y0,colour);
 draw_lines(x0,y0,x1,y1,colour);
 draw_lines(x1,y1,x,y,colour);
END

EDIT: corregido, splintergu
Título: Re: Funcion para dibujar triangulos
Publicado por: carles en Junio 15, 2010, 10:07:09 am

Siento ser portador de malas noticias, pero te falta un parentesis en el 3º if del proceso draw_lines.

Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 15, 2010, 10:46:37 am
Pues si!!! Pero me ha compilado y lo he probado!!!! O se lo ha comido al hacer aqui el paste, cosa que no creo, o Bennu esta chutando con esto!!!
Pruebalo tal cual a ver.
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 15, 2010, 03:37:57 pm
mentira free, no compila el tuyo, bueno, no compilaba, ya lo corregi...

ahora, veo que el tuyo tiene mas rendimiento que el que esta en C... :P

bueno, hay que considerar un par de cosas, la funcion en C soporta "stipple"... despues el algoritmo es el mismo, salvo inicializaciones, pero me sorprende que eso cause tanta diferencia... o habra otra cosa que no me estoy dando cuenta.

deberia implementar una funcion rapida sin stipple, para verificar como se comporta.

como sea, te has ganado un karma.

con set_fps(0,0) dibujando 1000 lineas, me dio una media de 0,98seg con tu programa en prg y 1,77seg usando las draw de bennu... :P
Título: Re: Funcion para dibujar triangulos
Publicado por: Fede en Junio 15, 2010, 05:04:49 pm
Buenoooo, el karma de FreeYourMind, que lo necesita anciosamente.  ;D
Título: Re: Funcion para dibujar triangulos
Publicado por: Drumpi en Junio 15, 2010, 05:24:04 pm
No veas, Free le ha ganado la carrera con Bennu al propio C :D :D :D Esto merece un karma ^^U
Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 15, 2010, 06:19:47 pm
Que notición!!!! Una función en Bennu superando en rendimiento a una interna de Bennu en C!!!!

Esta sólo demuestra una cosa Splinter, Bennu es bueno, pero no es mejor por tu culpa  ;D (Se comprueba que es posible mejorar su rendimiento, toca a currartelo :)).

Por cierto, el parentesis del 3º if se lo ha comido al pegarlo aqui porque tambien lo tengo bien en el prg....
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 15, 2010, 07:13:48 pm
claro, se al copiar en el foro si no tenes puesto espacios se pierde...

mi culpa??? como ya te dije, la funcion interna es mas completa que la que armaste, el algoritmo usado es el mismo que pusiste vos, solo que la interna en C es mas completa, tiene mas cosas, esto demuestra que bennu es muy rapido procesando.

por favor, hacele el cambio del stipple.

otra opcion es que el modulo no esta compilado con aceleracion...
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 15, 2010, 07:18:23 pm
ah, si soy un idiota, claro que si...

draw_line sin drawing_map, genera objetos draw, son como procesos, por eso es que consume mas.

la version con drawing_map(0,0) consume 0,65seg...

soy un idiota, ya me parecia raro que la C sea mas lenta.

Bennu volvio a recuperar su poderio.

Te deberia quitar el karma, pero bueno, te lo dejo porque anda mendigando karmas.
Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 15, 2010, 09:05:27 pm
Hombre, ahora tengo yo culpa de las funciones de Bennu ? Yo no puse el ejemplo por tus funciones, pero por poner otra alternativa a la de Carles y tambien para que no digais que nunca pongo código...  ;D

Lo del rendimiento lo decia en broma claro esta, pero lo llevaste mal, es lógico que si tu funcion interna es más lenta, motivo tiene que tener, ya que si fuera igual a la mia tendria que ser más rápida...
Título: Re: Funcion para dibujar triangulos
Publicado por: Drumpi en Junio 15, 2010, 10:02:43 pm
Ya me parecía a mi :D :D :D
Era raro que una función que pinta un pixel, llamada muchas veces, fuese más rápida que una única llamada a una función que pinta muchos pixels.
Es como decir que un proceso congelado consume más recursos que otro que hace loop frame; end :P
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 15, 2010, 10:58:13 pm
lo que dije era medio en broma tambien.

Si, la de C es mas rapida, solo que estaba probando mal.

jajaja, lo del freeze (en movimiento) es cierto, consume mas, solo unos pocos frames (20 a 30, sobre pruebas de un total de 90frames), pero se debe a que estas accediendo desde otro proceso y recorriendo la lista de procesos. (para los que no entienden de que hablamos, fue un mensaje en privado sobre pruebas de un scroll tileado, que estuvimos haciendo con bomberlink, donde en versiones anteriores de bennu, bastante viejas, cercanas a la ultima de fenix, drumpi, vio que hacer tiles con procesos freeze y un proceso controlador, era mas rapido que hacerlos con procesos normales que se autocontrolen, ahora con todas las mejoras de bennu, esto ya no es asi)

Título: Re: Funcion para dibujar triangulos
Publicado por: Drumpi en Junio 16, 2010, 12:18:10 am
Lo malo es que no puedo cambiar el estilo del actual motor. Ten en cuenta que he sustituido muchas multiplicaciones por sumas incrementales, y algunas operaciones repetitivas se guardan en una estructura global.
Es raro que el acceso a datos locales sea tan lento, más que tener que procesar el cambio de contexto de procesos.
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 01:38:29 am
a mi no me resulta rara, la verdad me resultaba raro lo contario.

obviamente que dependiendo la carga de lo que se hace.
Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 16, 2010, 06:19:11 am
Hacker argentino SplinterGU, tu puedes  :D
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 01:21:06 pm
Hacker argentino SplinterGU, tu puedes  :D

me no entender you
Título: Re: Funcion para dibujar triangulos
Publicado por: panreyes en Junio 16, 2010, 01:25:39 pm
Hacker realmente no es uno que revienta cosas, sino uno que entiende como funcionan las cosas e investiga sobre como poder aprovecharlas.

Quicir, un hacker es un programador muy bueno. Quien entienda otra cosa no sabe lo que es un hacker :)
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 01:52:50 pm
Hacker realmente no es uno que revienta cosas, sino uno que entiende como funcionan las cosas e investiga sobre como poder aprovecharlas.

Quicir, un hacker es un programador muy bueno. Quien entienda otra cosa no sabe lo que es un hacker :)

Esto se te habra escapado!!!
Título: Re: Funcion para dibujar triangulos
Publicado por: panreyes en Junio 16, 2010, 01:58:52 pm
"What you say!!"

¿Qué se me ha "escapado"? XD
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 02:10:01 pm
Hacker realmente no es uno que revienta cosas, sino uno que entiende como funcionan las cosas e investiga sobre como poder aprovecharlas.

Quicir, un hacker es un programador muy bueno. Quien entienda otra cosa no sabe lo que es un hacker :)

 :-\  :-\  :-\

fue un comentario muy desleal. :(


xD
Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 16, 2010, 03:22:26 pm
Hacker argentino SplinterGU

Es así como te das a conocer en la Wiki sobre Bennu, me hace grácia vamos, sobretodo porque los hackers suele ser gente huida de la justicia  ;D
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 03:56:14 pm
yo nunca puse eso, nunca hice nada en la wiki!

donde esta eso? dame el link por favor.
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 03:59:48 pm
Hacker argentino SplinterGU

Es así como te das a conocer en la Wiki sobre Bennu, me hace grácia vamos, sobretodo porque los hackers suele ser gente huida de la justicia  ;D

Por otro lado, vos te pensas que de casualidad me gusta estar en el anonimato? y que me costo muchisimo dar mi nombre completo las pocas veces que lo hice?
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 04:02:29 pm
ja, no se quien me puso el "Hacker Argentino" en la wiki, pero parece estar puesto con ironia.
Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 16, 2010, 04:30:01 pm
Ya lo has visto o no ? Si con google te sale en los primeros resultados si pones Bennu.
Título: Re: Funcion para dibujar triangulos
Publicado por: Rein (K´)ah Al-Ghul en Junio 16, 2010, 04:40:11 pm
Hacker argentino SplinterGU

Es así como te das a conocer en la Wiki sobre Bennu, me hace grácia vamos, sobretodo porque los hackers suele ser gente huida de la justicia  ;D

yo no puedo dar mi cara, porque tengo pedido de captura...
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 05:29:15 pm
Ya lo has visto o no ? Si con google te sale en los primeros resultados si pones Bennu.

si, lo busque ni bien lei tu mensaje, por eso te respondi que parece estar en plan ironia.

Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 05:30:44 pm
Hacker argentino SplinterGU

Es así como te das a conocer en la Wiki sobre Bennu, me hace grácia vamos, sobretodo porque los hackers suele ser gente huida de la justicia  ;D

yo no puedo dar mi cara, porque tengo pedido de captura...

 :o  :o  :o

obviamente ese comentario no hice en sentido figurado... a ver si ahora alguien malinterpreta y me vienen a buscar a casa... :P
Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 16, 2010, 07:32:19 pm
Buenas, me ha salido un error muy raro, a ver si sabeis lo que puede ser.

He decidido probar esta funcion que he puesto de drawlines, para crear la siguiente imagen para mi remake de Pinball Action:

(http://forum.bennugd.org/index.php?action=dlattach;topic=1442.0;attach=1242)


Pues bien, el proceso me da error al compilar en la variable que es privada 'c', o sea, me pone el siguiente mensaje:

Variable already defined as process, expected type or variable name (";").

El inicio es este:

PROCESS draw_lines(xp, yp, xq, yq, colour)
PRIVATE
D = 0;
dx;
dy;
c; // Es aqui que indica la línea de error
M;
xinc = 1;
yinc = 1;

BEGIN

...


O sea, si es privada no importa que tenga esa variable en otro sitio, pero es que ni tengo una variable con ese nombre en ningun sitio, sin duda el error que indica no se corresponde con el real.
Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 16, 2010, 07:41:13 pm
Lo he cambiado por c1 y he resuelto el problema. Esto sólo suele ocurrir con variables reservadas del sistema, pero una c !!??
Habria que descubrir que proceso interno tira de esta variable....
Título: Re: Funcion para dibujar triangulos
Publicado por: FreeYourMind en Junio 16, 2010, 08:32:51 pm
16bit power, mola :)

(http://forum.bennugd.org/index.php?action=dlattach;topic=1442.0;attach=1248)

Ostias, me acabo de fijar comparando, que el original es más gris, no es blanco del todo, bueno ya es trabajo para mañana, por hoy es suficiente  :D
Título: Re: Funcion para dibujar triangulos
Publicado por: SplinterGU en Junio 16, 2010, 09:40:21 pm
no podes tener una variable global que tambien sea local, podria ser privada.


a mi me compila perfectamente usando c.

dice que tenes la variable ya definida como proceso.
Título: Re:Funcion para dibujar triangulos
Publicado por: Ryo Suzuki en Enero 08, 2020, 04:06:04 pm
Pues gracias Carles.

Me ha ido bien para una cosilla del estilo salvapantallas que tenía que implementar.
Título: Re:Funcion para dibujar triangulos
Publicado por: Mr.Vic en Mayo 15, 2020, 04:12:14 pm
Me servirá de guía para lo que quiero hacer, buenisimo