Крутилки-вращалки

Крутилки-вращалки

Крутилки-вращалки

Тут приведены исходники всяких крутилок-вращалок. Написано очень давно, с целью разобраться с языком СИ. Достаточно красивый эффект получается если экспериментировать с вращаемым изображением.

В архиве находятся файлы rotate1.cpp-rotate6.cpp. Здесь приведены лишь два последних. Rotate5.cpp написан на СИ, а в rotate6.cpp внутренний цикл на ассемблере — разница в скорости очевидна.

11.jpg
Скриншот

rotate4.cpp

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <alloc.h>
  4. #include <process.h>
  5. #include <math.h>
  6.  
  7. //################### Изменить один цвет палитры ############################
  8. void palette(unsigned char N,unsigned int R,unsigned int G,unsigned int B)
  9. {
  10. asm {
  11. mov al, [N]
  12. mov dx, 0x3C8
  13. out dx, al
  14. inc dx //DX = 3C9h (Pal DATA REG)
  15. mov ax, [R]
  16. out dx, al //красная составляющая
  17. mov ax, [G]
  18. out dx, al //зеленая составляющая
  19. mov ax, [B]
  20. out dx, al //синяя составляющая
  21. }
  22. }
  23.  
  24. void PutPixel(unsigned int X,unsigned int Y,unsigned char Color)
  25. {
  26. asm {
  27. mov ax, [Y]
  28. mov dx, 320
  29. imul dx
  30. add ax, [X]
  31. mov di, ax
  32. push es
  33. mov ax, 0xA000
  34. mov es, ax
  35. mov al,[Color]
  36. stosb
  37. pop es
  38. }
  39. }
  40.  
  41. void main(void)
  42. {
  43. FILE *file1;
  44. char *str;
  45. char *filename;
  46. int I,J,I1,J1;
  47. int X,Y,Z,size;
  48. float A,sina,cosa;
  49.  
  50. filename="A.BMP";
  51. if ((str = (char *) malloc(10000)) == NULL) printf("Память у вас скончалась :(((\n");
  52. if ((file1 = fopen(filename,"rb")) == NULL) fprintf(stderr,"Файл не найден :((((");
  53. size=fread(str,54,1,file1);
  54. size=fread(str,1024,1,file1);
  55. asm mov ax,0x0013
  56. asm int 0x10
  57. for (I=0;I<256;I++) palette(I,str[I*4+2]>>2,str[I*4+1]>>2,str[I*4+0]>>2);
  58. size=(fread(str,1,10000,file1));
  59. fclose(file1);
  60. A=0;
  61. do
  62. {
  63. for (I=0;I<100;I++)
  64. {
  65. for (J=0;J<100;J++)
  66. {
  67. I1=I-50;
  68. J1=J-50;
  69. sina=sin(A);
  70. cosa=1-tan(A)-sina;
  71. X=100+I1*sina-J1*cosa;
  72. Y=100+I1*cosa+J1*sina;
  73. Z=0;
  74. if ((X<320) && (Y<200) && (X>1) && (Y>1)) PutPixel(X+Z,Y+Z,str[J*100+I]);
  75. }
  76. }
  77. A=A+0.017;
  78. }
  79. while (!kbhit());
  80. asm mov ax,0x0003
  81. asm int 0x10
  82.  
  83. free(str);
  84. }

Download this code: rotate4.cpp

rotate5.cpp

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <alloc.h>
  4. #include <process.h>
  5. #include <math.h>
  6. #include <dos.h>
  7.  
  8. //################### Изменить один цвет палитры ############################
  9. void palette(unsigned char N,unsigned int R,unsigned int G,unsigned int B)
  10. {
  11. asm {
  12. mov al, [N]
  13. mov dx, 0x3C8
  14. out dx, al
  15. inc dx //DX = 3C9h (Pal DATA REG)
  16. mov ax, [R]
  17. out dx, al //красная составляющая
  18. mov ax, [G]
  19. out dx, al //зеленая составляющая
  20. mov ax, [B]
  21. out dx, al //синяя составляющая
  22. }
  23. }
  24.  
  25. void main(void)
  26. {
  27. FILE *file1;
  28. char Color;
  29. char *str;
  30. char *filename;
  31. int I,J,I1,J1,DDX,DDY;
  32. int X,Y,Z,size,deltaX,deltaY;
  33. float A,sina,cosa;
  34.  
  35. filename="A.BMP";
  36. if ((str = (char *) malloc(10000)) == NULL) printf("Память у вас скончалась :(((\n");
  37. if ((file1 = fopen(filename,"rb")) == NULL) fprintf(stderr,"Файл не найден :((((");
  38. fread(str,54,1,file1);
  39. fread(str,1024,1,file1);
  40. asm mov ax,0x0013
  41. asm int 0x10
  42. for (I=0;I<256;I++) palette(I,str[I*4+2]>>2,str[I*4+1]>>2,str[I*4+0]>>2);
  43. fread(str,1,10000,file1);
  44. fclose(file1);
  45. deltaY=100;
  46. deltaX=100;
  47. DDX=1;
  48. DDY=1;
  49. A=0;
  50. do
  51. {
  52. sina=sin(A);
  53. cosa=1-tan(A)-sin(A);
  54. for (I=0;I<100;I++)
  55. {
  56. for (J=0;J<100;J++)
  57. {
  58. I1=I-50;
  59. J1=J-50;
  60. X=I1*sina-J1*cosa;
  61. Y=I1*cosa+J1*sina;
  62. Color=str[J*100+I];
  63. asm {
  64. mov ax, [Y]
  65. add ax, [deltaX]
  66. or ax, ax
  67. jl NoPlot;
  68. cmp ax, 200
  69. jg NoPlot;
  70. mov dx, 320
  71. imul dx
  72. mov dx, [X]
  73. add dx, [deltaY]
  74. or dx, dx
  75. jl NoPlot;
  76. cmp dx, 319
  77. jg NoPlot;
  78. add ax, dx
  79. mov di, ax
  80. push es
  81. mov ax, 0xA000
  82. mov es, ax
  83. mov al,[Color]
  84. mov [es:di],al
  85. pop es
  86. }
  87. NoPlot:
  88. }
  89. }
  90. A=A+0.02;
  91. deltaX=deltaX+DDX;
  92. deltaY=deltaY+DDY;
  93. if (deltaX>150) DDX=-1;
  94. if (deltaY>270) DDY=-1;
  95. if (deltaX<50) DDX=1;
  96. if (deltaY<50) DDY=1;
  97.  
  98. }
  99. while (!kbhit());
  100.  
  101. asm mov ax,0x0003
  102. asm int 0x10
  103.  
  104. free(str);
  105. }

Download this code: rotate5.cpp

Комментарии