elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Descripción Limpia de Algoritmos y Trucos con Código
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Descripción Limpia de Algoritmos y Trucos con Código  (Leído 1,641 veces)
~

Desconectado Desconectado

Mensajes: 85


Ver Perfil WWW
Descripción Limpia de Algoritmos y Trucos con Código
« en: 28 Febrero 2023, 16:09 pm »

Línea de Bresenham
Código
  1. Elementos en Orden de Dibujado de Línea Bresenham |
  2. ---------------------------------------------------------
  3.    | void OPCODE__graphics__Bresenham_line(unsigned char *BresenObj)
  4.    |
  5. ----
  6.  
  7. - Elementos:
  8.  tipo de diagonal: Bresenham_line__slope
  9.  controles x y: Bresenham_line__xctrl, Bresenham_line__yctrl
  10.  largo x y: Bresenham_line__xlargo, Bresenham_line__ylargo
  11.  coordenada mayor (sin signo): Bresenham_line__maxcoord
  12.  Bresenham_line__xdireccion, Bresenham_line__ydireccion, suman 1 o -1
  13.  Bresenham_line__draw hace más eficiente per no es necesario para saber cuándo dibujar 1 pixel.
  14.  
  15.  
  16. - Tipo de diagonal (slope), horizontal 1, vertical 2,
  17.  Bresenham diagonal 0 (al final, sin chequeo).
  18.  
  19. - Controles x y y de errores de cálculo.
  20.  
  21. - largo x = xfin-xinicio (con signo).
  22.  largo y = yfin-yinicio (con signo).
  23.  El signo es para detectar si la dirección
  24.  suma o resta.
  25.  
  26. - Para x y y: Vemos si el largo es 0.
  27.  Si es 0, lo ponemos a 1.
  28.  Sino, la dirección es largo/abs(largo), es 1 o -1.
  29.  
  30. - Para x y y: Ajustar largo a abs(largo)+1
  31.  para perder el signo necesario para las
  32.  direcciones x y, y convertir el rango
  33.  de coordenadas en cuenta natural.
  34.  Parece que necesitamos sumar 1 y usar un do while
  35.  con actualización HASTA EL FINAL para cubrir
  36.  el primer y último pixel con una ÚNICA
  37.  operación de putpixel.
  38.  
  39. - Para obtener la coordenada más larga:
  40.  Si xlargo==ylargo, coordenadamayor=xlargo
  41.  Si xlargo>ylargo, coordenadamayor=xlargo
  42.  Si ylargo>xlargo, coordenadamayor=ylargo
  43.  Copiamos a coordenadamayor2 para el bucle.
  44.  
  45. - Si slope es 1, dibujar vertical, si es 2, horizontal.
  46.  Terminar.
  47.  
  48. - Esto inicializa los valores.
  49.  
  50.  
  51. do
  52. {
  53. //Esto indica el momento más óptimo
  54. //para dibujar cada pixel:
  55. ///
  56. Bresenham_line__draw=0;
  57.  
  58.  
  59. //Control de X:
  60. ///
  61.  if(Bresenham_line__xctrl)>Bresenham_line__maxcoord))
  62.  {
  63.   Bresenham_line__xctrl)-=Bresenham_line__maxcoord);
  64.   Bresenham_line__x)+=Bresenham_line__xdireccion);
  65.   Bresenham_line__draw=1;
  66.  }
  67.  
  68.  
  69. //Control de Y:
  70. ///
  71.  if(Bresenham_line__yctrl)>Bresenham_line__maxcoord))
  72.  {
  73.   Bresenham_line__yctrl)-=Bresenham_line__maxcoord);
  74.   Bresenham_line__y)+=Bresenham_line__ydireccion);
  75.   Bresenham_line__draw=1;
  76.  }
  77.  
  78.  
  79. Bresenham_line__xctrl)+=Bresenham_line__xlargo);
  80. Bresenham_line__yctrl)+=Bresenham_line__ylargo);
  81. }
  82. while(Bresenham_line__maxcoord)-=1);
  83.  


Código de la función:
Código
  1. //Estructura común de funciones gráficas
  2. //de solo calcular comunes donde las 2 primeras variables
  3. //son widewords x y y y la siguiente es el final de la
  4. //operación si es 2, o el inicio si es 0.
  5. ///
  6.  
  7. #define Bresenham_line__x       wideword_sz*0
  8. #define Bresenham_line__y       wideword_sz*1
  9. #define Bresenham_line__inited  wideword_sz*2
  10. #define Bresenham_line__slope   wideword_sz*3
  11. #define Bresenham_line__xstart  wideword_sz*4
  12. #define Bresenham_line__ystart  wideword_sz*5
  13. #define Bresenham_line__xend    wideword_sz*6
  14. #define Bresenham_line__yend    wideword_sz*7
  15. #define Bresenham_line__colorpx wideword_sz*8
  16.  
  17. #define Bresenham_line__xdireccion wideword_sz*9
  18. #define Bresenham_line__ydireccion wideword_sz*10
  19. #define Bresenham_line__xlargo     wideword_sz*11
  20. #define Bresenham_line__ylargo     wideword_sz*12
  21. #define Bresenham_line__maxcoord   wideword_sz*13
  22. #define Bresenham_line__maxcoord2  wideword_sz*14
  23. #define Bresenham_line__xctrl      wideword_sz*15
  24. #define Bresenham_line__yctrl      wideword_sz*16
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34. void OPCODE__graphics__Bresenham_line(unsigned char *BresenObj)
  35. {
  36. // long xdireccion,ydireccion;            //1 o -1
  37. // long xlargo,ylargo;                    //valor absoluto de largo+1
  38. // long coordenadamayor,coordenadamayor2; //si x o y es mayor
  39. // long xctrl=0,yctrl=0;                  //controlar el pixel a dibujar excediendo la longitud de coordenadas de la línea
  40.  
  41.  
  42.  
  43. if(*(long*)(BresenObj+Bresenham_line__inited)==2)return;
  44.  
  45.  
  46. if(!(
  47.    *(long*)(BresenObj+Bresenham_line__inited)
  48.   ))
  49. {
  50.  *(long*)(BresenObj+Bresenham_line__inited)=1;
  51.  *(long*)(BresenObj+Bresenham_line__slope)=0;
  52.  
  53.  
  54.  *(long*)(BresenObj+Bresenham_line__xctrl)=0;
  55.  *(long*)(BresenObj+Bresenham_line__yctrl)=0;
  56.  
  57.  
  58.  *(long*)(BresenObj+Bresenham_line__xlargo)=*(long*)(BresenObj+Bresenham_line__xend)-*(long*)(BresenObj+Bresenham_line__xstart);
  59.  *(long*)(BresenObj+Bresenham_line__ylargo)=*(long*)(BresenObj+Bresenham_line__yend)-*(long*)(BresenObj+Bresenham_line__ystart);
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  if(*(long*)(BresenObj+Bresenham_line__xdireccion))
  67.  *(long*)(BresenObj+Bresenham_line__xdireccion)=*(long*)(BresenObj+Bresenham_line__xlargo)/myabs_long(*(long*)(BresenObj+Bresenham_line__xlargo));
  68.  else *(long*)(BresenObj+Bresenham_line__xdireccion)=1;
  69.  
  70.  if(*(long*)(BresenObj+Bresenham_line__ydireccion))
  71.  *(long*)(BresenObj+Bresenham_line__ydireccion)=*(long*)(BresenObj+Bresenham_line__xlargo)/myabs_long(*(long*)(BresenObj+Bresenham_line__ylargo));
  72.  else *(long*)(BresenObj+Bresenham_line__ydireccion)=1;
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  *(long*)(BresenObj+Bresenham_line__xlargo)=myabs_long(*(long*)(BresenObj+Bresenham_line__xlargo))+1;
  79.  *(long*)(BresenObj+Bresenham_line__ylargo)=myabs_long(*(long*)(BresenObj+Bresenham_line__ylargo))+1;
  80.  
  81.  
  82.  *(long*)(BresenObj+Bresenham_line__maxcoord)=*(long*)(BresenObj+Bresenham_line__xlargo); //si xlargo==ylargo
  83.  if(*(long*)(BresenObj+Bresenham_line__xlargo)>*(long*)(BresenObj+Bresenham_line__ylargo))*(long*)(BresenObj+Bresenham_line__maxcoord)=*(long*)(BresenObj+Bresenham_line__xlargo);
  84.  if(*(long*)(BresenObj+Bresenham_line__ylargo)>*(long*)(BresenObj+Bresenham_line__xlargo))*(long*)(BresenObj+Bresenham_line__maxcoord)=*(long*)(BresenObj+Bresenham_line__ylargo);
  85.  
  86.  *(long*)(BresenObj+Bresenham_line__maxcoord2)=*(long*)(BresenObj+Bresenham_line__maxcoord)+1;
  87.  
  88.  *(long*)(BresenObj+Bresenham_line__x)=*(long*)(BresenObj+Bresenham_line__xstart);
  89.  *(long*)(BresenObj+Bresenham_line__y)=*(long*)(BresenObj+Bresenham_line__ystart);
  90. }
  91.  
  92.  
  93. //Vertical (no Bresenham):
  94. ///
  95.  if(*(long*)(BresenObj+Bresenham_line__slope)==1 || *(long*)(BresenObj+Bresenham_line__xstart)==*(long*)(BresenObj+Bresenham_line__xend))
  96.  {
  97.   *(long*)(BresenObj+Bresenham_line__slope)=1;  //vert
  98.   if(*(long*)(BresenObj+Bresenham_line__y)==*(long*)(BresenObj+Bresenham_line__yend))
  99.   *(long*)(BresenObj+Bresenham_line__inited)=2;
  100.   else
  101.    *(long*)(BresenObj+Bresenham_line__y)+=(*(long*)(BresenObj+Bresenham_line__ydireccion));
  102.  
  103.   return;
  104.  }
  105.  
  106.  
  107.  
  108. //Horizontal (no Bresenham):
  109. ///
  110.  if(*(long*)(BresenObj+Bresenham_line__slope)==2 || *(long*)(BresenObj+Bresenham_line__ystart)==*(long*)(BresenObj+Bresenham_line__yend))
  111.  {
  112.   *(long*)(BresenObj+Bresenham_line__slope)=2;  //horiz
  113.   if(*(long*)(BresenObj+Bresenham_line__x)==*(long*)(BresenObj+Bresenham_line__xend))
  114.   *(long*)(BresenObj+Bresenham_line__inited)=2;
  115.   else
  116.    *(long*)(BresenObj+Bresenham_line__x)+=(*(long*)(BresenObj+Bresenham_line__xdireccion));
  117.  
  118.   return;
  119.  }
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126. if(*(long*)(BresenObj+Bresenham_line__xctrl)>*(long*)(BresenObj+Bresenham_line__maxcoord))
  127. {
  128.  *(long*)(BresenObj+Bresenham_line__xctrl)-=*(long*)(BresenObj+Bresenham_line__maxcoord);
  129.  *(long*)(BresenObj+Bresenham_line__x)+=*(long*)(BresenObj+Bresenham_line__xdireccion);
  130. }
  131.  
  132.  
  133. if(*(long*)(BresenObj+Bresenham_line__yctrl)>*(long*)(BresenObj+Bresenham_line__maxcoord))
  134. {
  135.  *(long*)(BresenObj+Bresenham_line__yctrl)-=*(long*)(BresenObj+Bresenham_line__maxcoord);
  136.  *(long*)(BresenObj+Bresenham_line__y)+=*(long*)(BresenObj+Bresenham_line__ydireccion);
  137. }
  138.  
  139. *(long*)(BresenObj+Bresenham_line__xctrl)+=*(long*)(BresenObj+Bresenham_line__xlargo);
  140. *(long*)(BresenObj+Bresenham_line__yctrl)+=*(long*)(BresenObj+Bresenham_line__ylargo);
  141.  
  142.  
  143. if(*(long*)(BresenObj+Bresenham_line__x)==*(long*)(BresenObj+Bresenham_line__xend) && *(long*)(BresenObj+Bresenham_line__y)==*(long*)(BresenObj+Bresenham_line__yend))
  144. *(long*)(BresenObj+Bresenham_line__inited)=2;
  145. }
  146.  







Ejemplo de uso:
Código
  1. unsigned char bresenObj0[wideword_sz*17];
  2. *(long*)(bresenObj0+Bresenham_line__inited)=0;
  3. *(long*)(bresenObj0+Bresenham_line__xstart)=0;
  4. *(long*)(bresenObj0+Bresenham_line__ystart)=0;
  5. *(long*)(bresenObj0+Bresenham_line__xend)=319;
  6. *(long*)(bresenObj0+Bresenham_line__yend)=199;
  7.  
  8. while(1)
  9. {
  10.  OPCODE__graphics__Bresenham_line(bresenObj0);
  11.  putpixel(*(long*)(bresenObj0+Bresenham_line__x), *(long*)(bresenObj0+Bresenham_line__y), 6);
  12.  if(*(long*)(bresenObj0+Bresenham_line__inited)==2)break;
  13. }
  14.  


En línea

Donar con PayPal para que siga trabajando:
https://www.ebay.com/usr/udocproject3

Streams en vivo de programación:
PC 1 - PC 2

http://www.youtube.com/@AltComp126/streams
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Descripcion de Archivo « 1 2 »
Programación Visual Basic
el_chente23 10 8,556 Último mensaje 27 Agosto 2005, 02:07 am
por el_chente23
Descripcion incompleta
Sugerencias y dudas sobre el Foro
kraszic 0 2,544 Último mensaje 8 Julio 2008, 14:57 pm
por kraszic
Manera límpia de descomprimir un ZIP/RAR
.NET (C#, VB.NET, ASP)
Eleкtro 2 2,428 Último mensaje 29 Enero 2013, 10:49 am
por Eleкtro
Instalación de Windows 8.1 limpia
Windows
Joake6 5 3,634 Último mensaje 12 Junio 2015, 03:22 am
por Br1ant
duda meta descripcion
Desarrollo Web
General Dmitry Vergadoski 1 2,689 Último mensaje 5 Enero 2022, 13:15 pm
por #!drvy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines