Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
//бва®Ё¬ Їа®бва б⢥го н«Ґ¬Ґв аго ЄаЁўго ЃҐ§мҐ
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <math.h>
#include <stdio.h>
//ЁвҐа䥩б
//Ё¬п Є« бб ®Є
char const szClassName[] = "LineClass";
//§ Ј®«®ў®Є ®Є
char const szWindowTitle[] = "Bizer - line, rotation by mouse and keyboard (arrows)";
//Їа®в®вЁЇл дгЄжЁ©
BOOL RegisterApp(HINSTANCE hInst);
HWND CreateApp(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Line_OnCreate(HWND);
void Line_OnDestroy(HWND);
void Line_OnPaint(HWND);
//ѓ« ў п дгЄжЁп - в®зЄ ўе®¤ ў Їа®Ја ¬¬г
#pragma argsused
int PASCAL WinMain(HINSTANCE hInst,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
int nCmdShow)
{
MSG msg;
if(!RegisterApp(hInst)) //ॣЁбва жЁп ЇаЁ«®¦ҐЁп
return FALSE;
if(!CreateApp(hInst,nCmdShow)) //ᮧ¤ ЁҐ ®Є ЇаЁ«®¦ҐЁп
return FALSE;
while(GetMessage(&msg,NULL,0,0)) //жЁЄ« ®Ўа Ў®вЄЁ б®®ЎйҐЁ©
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//ђҐЈЁбва жЁп Є« бб ®Є
BOOL RegisterApp(HINSTANCE hInst)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockBrush(GRAY_BRUSH);
wc.lpszMenuName = "APP_MENU";
wc.lpszClassName = szClassName;
return RegisterClass(&wc);
}
//‘®§¤ ЁҐ ®Є ЇаЁ«®¦ҐЁп
HWND CreateApp(HINSTANCE hInstance, int nCmdShow)
{
HWND hwnd;
hwnd = CreateWindow(szClassName,
szWindowTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, //x -Є®®а¤Ё в ®Є
CW_USEDEFAULT, //y -Є®®а¤Ё в ®Є
CW_USEDEFAULT, //иЁаЁ ®Є
CW_USEDEFAULT, //ўлб®в ®Є
NULL,
NULL,
hInstance,
NULL);
if(hwnd == NULL)
return hwnd;
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
return hwnd;
}
double fi,teta,sf,cf,st,ct;
int kluch, xma0,xma,yma,yma0, xma1,yma1;
//®Є® п Їа®жҐ¤га , ®Ўа Ў влў ой п б®®ЎйҐЁп
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
Line_OnCreate(hwnd);
break;
case WM_PAINT:
Line_OnPaint(hwnd);
break;
case WM_LBUTTONDOWN:
if(kluch == 0)
{
xma1 = LOWORD(lParam);
yma1 = HIWORD(lParam);
}
kluch = 1;
break;
case WM_LBUTTONUP:
kluch = 0;
break;
case WM_MOUSEMOVE:
if(kluch == 1)
{
xma = LOWORD(lParam);
yma = HIWORD(lParam);
fi += xma-xma1;
teta += yma-yma1;
xma1 = xma; yma1 = yma;
InvalidateRect(hwnd,NULL,TRUE);
}
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_LEFT:
fi += 15;
InvalidateRect(hwnd,NULL,TRUE);
break;
case VK_RIGHT:
fi -= 15;
InvalidateRect(hwnd,NULL,TRUE);
break;
case VK_UP:
teta += 15;
InvalidateRect(hwnd,NULL,TRUE);
break;
case VK_DOWN:
teta -= 15;
InvalidateRect(hwnd,NULL,TRUE);
break;
}
break;
case WM_DESTROY:
Line_OnDestroy(hwnd);
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0L;
}
void Line_OnCreate(HWND hwnd)
{
fi = 30; teta = 60;
}
#pragma argsused
void Line_OnDestroy(HWND hwnd)
{
PostQuitMessage(0); //§ Єалў Ґ¬ ®Є®
}
double Px[4], Py[4], Pz[4];
double Bezie(int i, double t) //зҐвлॠдгЄжЁЁ ЃҐаи⥩
{
double b;
switch(i)
{
case 0 : b=(1-t)*(1-t)*(1-t); break;
case 1 : b=3*t*(1-t)*(1-t); break;
case 2 : b=3*t*t*(1-t); break;
case 3 : b=t*t*t; break;
}
return b;
}
double splineX(double t)
{
double S=0;
for(int i=0; i<4; i++)
S += Px[i]*Bezie(i,t);
return S;
}
double splineY(double t)
{
double S=0;
for(int i=0; i<4; i++)
S += Py[i]*Bezie(i,t);
return S;
}
double splineZ(double t)
{
double S=0;
for(int i=0; i<4; i++)
S += Pz[i]*Bezie(i,t);
return S;
}
//ЇҐаҐе®¤ ў ўЁ¤®ўго бЁб⥬㠪®®а¤Ё в Ё ®ав®Ја дЁзҐбЄ®Ґ Їа®ҐЄвЁа®ў ЁҐ
double Xe(double x,double y)
{
return -sf*x+cf*y;
}
//ЇҐаҐе®¤ ў ўЁ¤®ўго бЁб⥬㠪®®а¤Ё в Ё ®ав®Ја дЁзҐбЄ®Ґ Їа®ҐЄвЁа®ў ЁҐ
double Ye(double x,double y,double z)
{
return -ct*cf*x-ct*sf*y+st*z;
}
//ЇҐаҐў®¤ ўЁ¤®ўле Є®®а¤Ё в ў Є®®а¤Ё вл ЇЁЄбҐ«Ґ©
//Ј«®Ў «млҐ ЇҐаҐ¬ҐлҐ
double xe1, xe2, ye1, ye2;
int ne1, ne2, me1, me2;
//ЇҐаҐе®¤ ®в x Є ЇЁЄбҐ«о n
inline int xn(double x)
{
return (int)((x - xe1)/(xe2 - xe1)*(ne2 - ne1)) + ne1;
}
//ЇҐаҐе®¤ ®в y Є ЇЁЄбҐ«о m
inline int ym(double y)
{
return (int)((y - ye1)/(ye2 - ye1)*(me2 - me1)) + me1;
}
void Line_OnPaint(HWND hwnd)
{
Px[0] = 1.0; Py[0] = 0; Pz[0] = 0;
Px[1] = 0; Py[1] = 1.0; Pz[1] = 1.0;
Px[2] = -1.0; Py[2] = 0; Pz[2] = 0.6;
Px[3] = 0; Py[3] = -1.0; Pz[3] = 1.8;
//а §¬Ґал ®Є ў ¬Ёа®ўле Є®®а¤Ё в е Ё ў ЇЁЄбҐ«пе
xe1 = -2; xe2 = 2; ye1 = -2; ye2 = 2;
ne1 = 150; ne2 = 450; me1 = 350; me2 = 50;
//¬ ЄбЁ¬ «млҐ ¤«Ёл ®бҐ© -¬Ёа®ўлҐ Є®®а¤Ё вл
double xmax=1.8, ymax=1.8, zmax=1.8;
double fi1, fi2, rad;
//Є®®а¤Ё вл Їа®ҐЄвЁа㥬®© в®зЄЁ
double xe, ye;
//Є®®а¤Ё вл ЇЁЄбҐ«®ў
int x1,y1,x2,y2;
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd, &ps); //Ї®«гз Ґ¬ Є®вҐЄбв гбва®©бвў
HBRUSH hbrush;
HPEN hpen;
MoveTo(hdc,ne1,me1);
LineTo(hdc,ne2,me1);
LineTo(hdc,ne2,me2);
LineTo(hdc,ne1,me2);
LineTo(hdc,ne1,me1);
//ўлзЁб«ҐЁҐ бЁгб®ў Ё Є®бЁгб®ў ®аЁҐвЁа®ўЄЁ ўЁ¤®ў®© бЁбвҐ¬л Є®®а¤Ё в
sf=sin(M_PI*fi/180);
cf=cos(M_PI*fi/180);
st=sin(M_PI*teta/180);
ct=cos(M_PI*teta/180);
char ss[10];
SetBkColor(hdc,RGB(127,127,127));
SetTextColor(hdc,RGB(0,255,127));
sprintf(ss,"fi = %4.0lf",fi);
TextOut(hdc,(ne1+ne2)/2-80,me2-25,ss,9);
sprintf(ss,"teta = %4.0lf",teta);
TextOut(hdc,(ne1+ne2)/2+20,me2-25,ss,11);
//®ЇаҐ¤Ґ«пҐ¬ ЇҐа®: 1) бвЁ«м - бЇ«®и®©
// 2) в®«йЁ «ЁЁ© - 3 ЇЁЄбҐ«Ґ©
// 3) 梥⠫ЁЁ© - паЄ®-¦Ґ«вл©
hpen = CreatePen(PS_SOLID,1,RGB(0,255,255));
SelectPen(hdc,hpen); //ўлЎЁа Ґ¬ ЇҐа® hpen
//®бм Ox
xe=Xe(0,0);
ye=Ye(0,0,0);
x1=xn(xe);
y1=ym(ye);
xe=Xe(xmax,0);
ye=Ye(xmax,0,0);
x2=xn(xe);
y2=ym(ye);
MoveTo(hdc,x1,y1);
LineTo(hdc,x2,y2);
SetBkColor(hdc,RGB(127,127,127));
SetTextColor(hdc,RGB(255,0,127));
TextOut(hdc,x2, y2, "X",1);
//®бм Oy
xe=Xe(0,0);
ye=Ye(0,0,0);
x1=xn(xe);
y1=ym(ye);
xe=Xe(0,ymax);
ye=Ye(0,ymax,0);
x2=xn(xe);
y2=ym(ye);
MoveTo(hdc,x1,y1);
LineTo(hdc,x2,y2);
SetBkColor(hdc,RGB(127,127,127));
SetTextColor(hdc,RGB(255,0,127));
TextOut(hdc,x2, y2, "Y",1);
//®бм Oz
xe=Xe(0,0);
ye=Ye(0,0,0);
x1=xn(xe);
y1=ym(ye);
xe=Xe(0,0);
ye=Ye(0,0,zmax);
x2=xn(xe);
y2=ym(ye);
MoveTo(hdc,x1,y1);
LineTo(hdc,x2,y2);
SetBkColor(hdc,RGB(127,127,127));
SetTextColor(hdc,RGB(255,0,127));
TextOut(hdc,x2, y2, "Z",1);
//®ЇаҐ¤Ґ«пҐ¬ ЇҐа®: 1) бвЁ«м - бЇ«®и®©
// 2) в®«йЁ «ЁЁ© - 3 ЇЁЄбҐ«Ґ©
// 3) 梥⠫ЁЁ© - паЄ®-¦Ґ«вл©
hpen = CreatePen(PS_SOLID,1,RGB(255,255,255));
SelectPen(hdc,hpen); //ўлЎЁа Ґ¬ ЇҐа® hpen
xe = Xe(Px[0],Py[0]);
ye = Ye(Px[0],Py[0],Pz[0]);
x1=xn(xe);
y1=ym(ye);
for(int k=1; k<4; k++)
{
xe = Xe(Px[k],Py[k]);
ye = Ye(Px[k],Py[k],Pz[k]);
x2 = xn(xe);
y2 = ym(ye);
MoveTo(hdc,x1,y1);
LineTo(hdc,x2,y2);
x1 = x2; y1 = y2;
}
int J=150;
double xt, yt, zt, t, dt = 1.0/J;
for(int j=0; j<J; j++)
{
t = dt*j;
xt = splineX(t);
yt = splineY(t);
zt = splineZ(t);
xe = Xe(xt,yt);
ye = Ye(xt,yt,zt);
x1 = xn(xe);
y1 = ym(ye);
SetPixel(hdc,x1,y1,RGB(255,255,0));
}
DeletePen(hpen); //гЎЁа Ґ¬ ЇҐа® hpen
EndPaint(hwnd, &ps); //®бў®Ў®¦¤ Ґ¬ Є®вҐЄбв гбва®©бвў
}
Соседние файлы в папке Surfaces