:: àëãîðèòìû  è ìåòîäû ::
:: îëèìïèàäíûå çàäà÷è ::
:: ñâÿçü ::
:: ôîðóì ::
:: î ñàéòå ::
:: ññûëêè ::

Path: Ãðàôèêà » Âpàùåíèå pàñòpîâîé êàpòèíêè
  Âpàùåíèå pàñòpîâîé êàpòèíêè



Âîò èñõîäíèê íà Ñè. Àëãîðèòì äîñòàòî÷íî ïîäðîáíî îáúÿñíåí â âèäå êîììåíòàðèåâ.

#include <dos.h>
#include <alloc.h>
#include <fcntl.h>
#include <io.h>
#include <mem.h>
#include <math.h>

typedef struct {
 char              bfType[2];
 unsigned long     bfSize;
 unsigned long     bfReserved;
 unsigned long     bfOffBits;

 unsigned long     biSize;
 unsigned long     biWidth;
 unsigned long     biHeight;
 unsigned int      biPlanes;
 unsigned int      biBitCount;
 unsigned long     biCompression;
 unsigned long     biSizeImage;
 unsigned long     biXPelsPerMeter;
 unsigned long     biYPelsPerMeter;
 unsigned long     biClrUsed;
 unsigned long     biClrImportant;

 struct {
   unsigned char rgbBlue;
   unsigned char rgbGreen;
   unsigned char rgbRed;
   unsigned char rgbReserved;
 } bmiColors[256];

} TBMPFileHeader;

typedef unsigned char Row[320];

main(argc,argv)
int argc;
char **argv;
{
 Row            *screen = MK_FP(0xA000,0),
                *picture,
                *buffer;

 int            BMP;
 TBMPFileHeader header;

 unsigned       x,y,i,
                xp,yp;

 long           x0,y0,
                xdx,xdy,
                ydx,ydy,
                x1,y1;

 double         A, SinA, CosA, scale;

 int            r,g,b, black, black_bri, bri;

 if ( argc<2 ||
      (picture = malloc(64000)) == NULL ||
      (buffer = malloc(64000)) == NULL )
   return(1);

 // ÷èòàåì êàpòèíêy èç 256-öâåòíîãî *.BMP ôàéëà ñ pàçìåpîì 
 // èçîápàæåíèÿ 320x200
 // è áåç èñïîëüçîâàíèÿ êîìïpåññèè. Ðàçìåp ôàéëà äîëæåí áûòü 
 // 65078 áàéò.

 BMP = open(argv[1], O_RDONLY | O_BINARY);
 read(BMP,&header,sizeof(header));
 read(BMP,buffer,64000);
 close(BMP);

 // ïåpåõîäèì â ãpàôè÷åñêèé påæèì 13h
 _AX=0x13;
 geninterrupt(0x10);

 // èçìåíÿåì ïàëèòpy è íàõîäèì ñàìûé ÷åpíûé öâåò
 black_bri=32767; // ÿpêîñòü ñàìîãî ÷åpíîãî èç íàéäåííûõ öâåòîâ
 outportb(0x3c8,0);
 for (i=0; i<256; i++) {
    r=header.bmiColors[i].rgbRed >> 2;
    g=header.bmiColors[i].rgbGreen >> 2;
    b=header.bmiColors[i].rgbBlue >> 2;
    outportb(0x3c9, r);
    outportb(0x3c9, g);
    outportb(0x3c9, b);
    bri=r*r+g*g+b*b; // ÿpêîñòü òåêyùåãî öâåòà
    if (bri<black_bri) {
      black_bri=bri;
      black=i; // ñàìûé ÷åpíûé èç íàéäåííûõ öâåòîâ
    }
 }
 _AX=0x1001; // îêpàøèâåì áîpäþp â ÷åpíûé öâåò
 _BH=black;
 geninterrupt(0x10);

 // â ôàéëå ñòpîêè õpàíèëèñü â îápàòíîì ïîpÿäêå, èõ íåîáõîäèìî 
 // ïåpåñòàâèòü

 for (y=0; y<200; y++)
   memcpy(picture[y],buffer[199-y],320);

 // âpàùàåì êàpòèíêy
 for (A=0.0; inportb(0x60)!=0x01; A+=0.03) {//ïîêà íå íàæàëè ESCAPE

    scale=1.0/(1.0+0.2*cos(A*4.0)); //êîýôôèöèåíò yâåëè÷åíèÿ êàpòèíêè
    SinA=sin(A);
    CosA=cos(A);
    // êàêyþ òî÷êy êàpòèíêè íàäî èçîápàæàòü â âåpõíåé ëåâîé òî÷êå 
	// ýêpàíà?
    // (èñïîëüçyþòñÿ âû÷èñëåíèÿ ñ ôèêñèpîâàííîé òî÷êîé â ôîpìàòå
	//  16.16)
    x0= (160.0+scale*(-160.0*CosA+100.0*1.2*SinA))*65536.0;
    y0= (100.0+scale*(-100.0*CosA-160.0*SinA/1.2))*65536.0;
    // íà ñêîëüêî íàäî ñìåñòèòüñÿ ïî êàpòèíêå ïpè ïåpåìåøåíèè 
	// ïî ýêpàíy 
	// íà ïèêñåëü âëåâî
    xdx = scale*CosA*65536.0;
    xdy = scale*SinA*65536.0/1.2;

    // íà ïèêñåëü âíèç
    ydx = -scale*SinA*65536.0*1.2;
    ydy = scale*CosA*65536.0;

    for (y=0; y<200; y++) {
     // x0, y0 - êîîpäèíàòû íà êàpòèíêå íà÷àëà òåêyùåé ñòpîêè 
	 // ñêàíèpîâàíèÿ
     // x1, y1 - êîîpäèíàòû íà êàpòèíêå òåêyùåé pèñyåìîé òî÷êè
     x1 = x0;
     y1 = y0;
     for (x=0; x<320; x++) {
      // xp, yp - êîîpäèíàòû íà êàpòèíêå òåêyùåé pèñyåìîé òî÷êè 
	  // (ôîpìàò 16:0)
      xp = x1 >> 16;
      yp = y1 >> 16;
      // "êëèïïèíã"
      if (/*xp>=0 &&*/ xp<=319 && /*yp>=0 &&*/ yp<=199) 
	  // Ò.ê. îíè unsigned
         buffer[y][x]=picture[yp][xp];
      else
         buffer[y][x]=black;
      // ïåpåäâèæåíèå âäîëü ñòpîêè ñêàíèpîâàíèÿ
      x1+=xdx;
      y1+=xdy;
     }
     // ïåpåõîä ê íîâîé ñòpîêå ñêàíèpîâàíèÿ
     x0+=ydx;
     y0+=ydy;
    }

    // èçîápàæàåì íà ýêpàíå è åùå íåìíîæêî ïîâîpà÷èâàåì
    memcpy(screen,buffer,64000);
 };

 _AX=0x03;
 geninterrupt(0x10);

 free(buffer);
 free(picture);
 return(0);
}

Îáñóäèòü íà ôîðóìå »


  Êîììåíòàðèè äëÿ âåá-ìàñòåðà



Âàøè êîììåíòàðèè. Âîïðîñû áóäóò óäàëåíû: äëÿ íèõ åñòü ôîðóì.
Èìÿ:
E-mail:
  


Copyright 2000-2002 © Ilia Kantor, ïðè ïîääåðæêå ïðîåêòà MANUAL.RU

ÀëãîËèñò íà CD