
|
Âîò èñõîäíèê íà Ñè. Àëãîðèòì äîñòàòî÷íî ïîäðîáíî îáúÿñíåí â âèäå êîììåíòàðèåâ.
#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);
}
Îáñóäèòü íà ôîðóìå »
|