Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include "vol2.h"
- #include <stdio.h>
- #define MAX_LOADSTRING 100
- #define WS_FIXEDWINDOW WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX // Стиль окна
- #define BUFSIZE 255
- // Global Variables:
- HINSTANCE hInst; // current instance
- TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
- TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
- HDC hDC;
- HWND hWnd;
- bool FLAG=true;
- float gdot[4];
- float **matrix;
- float vvv,eee,v,e;
- float zBuffer[800][600][4];
- int n,m;
- //====точка наблюдения
- float xe,ye,ze,d_Screen,R;
- float xe_old=200,ye_old=151,ze_old=65,d_old=200,R_old=80;
- int k,i,j,l;
- int par_old=10,mer_old=30,par,mer;
- float Pi= 3.141592;
- float phi;
- float **mas, *dot, **ver;
- float **A,**B,**C,**D;
- ATOM MyRegisterClass(HINSTANCE hInstance);
- BOOL InitInstance(HINSTANCE, int);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- LRESULT CALLBACK Param(HWND, UINT, WPARAM, LPARAM);
- void QWERT();
- void mnozh(float *a,float **b);
- void NULL_W();
- void Triug(float ax,float ay,float az,float bx,float by,float bz,float cx,float cy,float cz);
- void Paint();
- int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
- { MSG msg;
- HACCEL hAccelTable;
- LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- LoadString(hInstance, IDC_VOL2, szWindowClass, MAX_LOADSTRING);
- MyRegisterClass(hInstance);
- if (!InitInstance (hInstance, nCmdShow))
- {return FALSE;}
- hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_VOL2);
- while (GetMessage(&msg, NULL, 0, 0))
- {if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
- { TranslateMessage(&msg);
- DispatchMessage(&msg); } }
- return (int) msg.wParam;}
- ATOM MyRegisterClass(HINSTANCE hInstance)
- { WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = (WNDPROC)WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = hInstance;
- wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_VOL2);
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wcex.lpszMenuName = (LPCTSTR)IDC_VOL2;
- wcex.lpszClassName = szWindowClass;
- wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_VOL2);
- return RegisterClassEx(&wcex);}
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- { HWND hWnd;
- hInst = hInstance;
- hWnd=CreateWindowEx(
- 0, //расширенный стиль окна
- szWindowClass, //имя
- NULL, //заголовок
- WS_FIXEDWINDOW, //стиль окна
- CW_USEDEFAULT, //X-координата верх. левого угла окна
- CW_USEDEFAULT, //Y-координата верх. левого угла окна
- 800, //ширина окна
- 600, //высота окна
- NULL, //дескриптор родительского окна
- NULL, //дескриптор меню окна
- hInst, //идент. приложения создавшего окно
- NULL); //указатель на область данных приложения
- hDC=GetDC(hWnd);
- if (!hDC) return false;
- if (!hWnd)
- { return FALSE; }
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- return TRUE;}
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- { int wmId, wmEvent;
- PAINTSTRUCT ps;
- HDC hdc;
- switch (message)
- { case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // Parse the menu selections:
- switch (wmId)
- {
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- case IDM_PUSK:
- {DialogBox(hInst, (LPCTSTR)IDD_PARAM, hWnd, (DLGPROC)Param);
- QWERT();}
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam); }
- break;
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- Paint();// TODO: Add any drawing code here...
- EndPaint(hWnd, &ps);
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- } return 0;}
- LRESULT CALLBACK Param(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- { //char buf[BUFSIZE];
- switch (message)
- { case WM_INITDIALOG:
- if(FLAG){CheckRadioButton(hDlg, IDC_PERSPECT,IDC_PARALLEL,IDC_PARALLEL );}
- else CheckRadioButton(hDlg, IDC_PERSPECT,IDC_PARALLEL, IDC_PERSPECT);
- return TRUE;
- case WM_COMMAND:
- if (LOWORD(wParam) == IDOK)
- { R = R_old;
- mer= mer_old;
- par= par_old;
- d_Screen=d_old;
- xe=xe_old;
- ye= ye_old;
- ze= ze_old;
- FLAG=IsDlgButtonChecked(hDlg,IDC_PARALLEL);
- EndDialog(hDlg, LOWORD(wParam));
- return TRUE;
- }break;
- } return FALSE;}
- void mnozh(float *a,float **b)
- {for(int i=0;i<4;i++)
- gdot[i]=0;
- for(int j=0;j<4;j++)
- for( i=0;i<4;i++)
- gdot[j]+=a[i]*b[i][j];}
- void QWERT()
- { NULL_W();
- phi=2.0*Pi/mer;
- vvv=xe*xe+ye*ye; //считаем вектор V
- v=sqrt(vvv);
- eee=xe*xe+ye*ye+ze*ze; // считаем вектор Е
- e=sqrt(eee);
- matrix=new float *[4];
- for(i=0;i<4;i++)
- {matrix[i]=new float[4];
- for(j=0;j<4;j++)
- matrix[i][j]=0.0;}
- //Матрица поворота системы координат вокруг оси z
- A=new float *[4];
- for(i=0;i<4;i++)
- {A[i]=new float[4];
- for(j=0;j<4;j++)
- A[i][j]=0;}
- A[0][0]=xe/v; A[0][1]=-ye/v; A[1][0]=ye/v; A[1][1]=xe/v; A[2][2]=1; A[3][3]=1;
- //Матрица поворота системы координат вокруг оси Y
- B=new float *[4];
- for(i=0;i<4;i++)
- {B[i]=new float[4];
- for(j=0;j<4;j++)
- B[i][j]=0.0;}
- B[0][0]=v/e; B[0][2]=ze/e; B[1][1]=1; B[2][0]=-ze/e; B[2][2]=v/e; B[3][3]=1;
- //Матрица переноса начала системы координат в точку Е.
- C=new float *[4];
- for(i=0;i<4;i++)
- {C[i]=new float[4];
- for(j=0;j<4;j++)
- C[i][j]=0.0;}
- C[0][0]=1; C[1][1]=1; C[2][2]=1; C[3][3]=1; C[3][0]=-e;
- //Матрица преобразования осей системы координат
- D=new float *[4];
- for(i=0;i<4;i++)
- {D[i]=new float[4];
- for(j=0;j<4;j++)
- D[i][j]=0.0;}
- D[0][2]=-1; D[1][0]=1; D[2][1]=1; D[3][3]=1;
- ver=new float *[(par+1)*mer]; //массив вершин
- for(i=0;i<(par+1)*mer;i++)
- {ver[i]=new float[4];
- for(j=0;j<4;j++)
- ver[i][j]=1.0;}
- for(i=0;i<par+1;i++)
- for(j=i*mer;j<mer*i+mer;j++)
- {ver[j][2]=-R+2*R*i/par;}
- for(j=0;j<(par+1)*mer;j++)// z
- {ver[j][0]=0;
- ver[j][1]=sqrt(R*R-ver[j][2]*ver[j][2]);}
- for(j=0;j<(par+1)*mer;j++)
- if(j%mer!=0){
- ver[j][1]= cos(phi)*ver[j-1][1]+sin(phi)*ver[j-1][0]; //y
- ver[j][0]=-sin(phi)*ver[j-1][1]+cos(phi)*ver[j-1][0];} //x
- for(j=0;j<(par+1)*mer;j++)
- {mnozh(ver[j],A);
- for(i=0;i<4;i++)
- ver[j][i]=gdot[i];}
- for(j=0;j<(par+1)*mer;j++)
- {mnozh(ver[j],B);
- for(i=0;i<4;i++)
- ver[j][i]=gdot[i];}
- for(j=0;j<(par+1)*mer;j++)
- {mnozh(ver[j],C);
- for(i=0;i<4;i++)
- ver[j][i]=gdot[i];}
- for(j=0;j<(par+1)*mer;j++)
- {mnozh(ver[j],D);
- for(i=0;i<4;i++)
- ver[j][i]=gdot[i];}
- if(FLAG)////////////ПАРАЛЛЕЛЬ
- {InvalidateRect(hWnd,NULL,false);//добавляет прямоугольник к обновляемому региону заданного окна. Обновляемый регион представляет часть рабочей области окна, которая должна быть перерисована; дескриптор окна; координаты прямоугольника; состояние очистки
- for(j=0;j<(par+1)*mer;j++)
- {ver[j][0]=400.0+ver[j][0];
- ver[j][1]=300.0-ver[j][1];}
- for(i=0;(i+mer)<(par+1)*mer;i++)
- {
- if((i+1)%(mer)!=0) {
- Triug(ver[i][0],ver[i][1],ver[i][2],ver[i+1+mer][0],ver[i+1+mer][1],ver[i+1+mer][2],ver[i+mer][0],ver[i+mer][1],ver[i+mer][2]);
- Triug(ver[i][0],ver[i][1],ver[i][2],ver[i+1][0],ver[i+1][1],ver[i+1][2],ver[i+1+mer][0],ver[i+1+mer][1],ver[i+1+mer][2]);
- } else{
- Triug(ver[i][0],ver[i][1],ver[i][2],ver[i+1][0],ver[i+1][1],ver[i+1][2],ver[i+1-mer][0],ver[i+1-mer][1],ver[i+1-mer][2]);
- Triug(ver[i][0],ver[i][1],ver[i][2],ver[i+1][0],ver[i+1][1],ver[i+1][2],ver[i+mer][0],ver[i+mer][1],ver[i+mer][2]);
- }}}
- else{///////////////перспектива
- InvalidateRect(hWnd,NULL,true);
- for(j=0;j<(par+1)*mer;j++)
- {ver[j][0]=400.0+(ver[j][0]*d_Screen/ver[j][2]);
- ver[j][1]=300.0-(ver[j][1]*d_Screen/ver[j][2]);}
- for(i=0;i+mer<(par+1)*mer;i++)
- {
- if((i+1)%(mer)!=0){
- Triug(ver[i][0],ver[i][1],ver[i][2],ver[i+1+mer][0],ver[i+1+mer][1],ver[i+1+mer][2],ver[i+mer][0],ver[i+mer][1],ver[i+mer][2]);
- Triug(ver[i][0],ver[i][1],ver[i][2],ver[i+1+mer][0],ver[i+1+mer][1],ver[i+1+mer][2],ver[i+1][0],ver[i+1][1],ver[i+1][2]);
- }else {
- Triug(ver[i][0],ver[i][1],ver[i][2],ver[i+1][0],ver[i+1][1],ver[i+1][2],ver[i+mer][0],ver[i+mer][1],ver[i+mer][2]);
- Triug(ver[i][0],ver[i][1],ver[i][2],ver[i+1-mer][0],ver[i+1-mer][1],ver[i+1-mer][2],ver[i+1][0],ver[i+1][1],ver[i+1][2]);
- }}}
- }
- void NULL_W()
- {for(i=0; i<800; i++)
- for(j=0; j<600; j++)
- {zBuffer[i][j][0] = 0.0;
- zBuffer[i][j][1] = 0.0;
- zBuffer[i][j][2] = 0.0;
- zBuffer[i][j][3] = 0.0;
- }}
- void Triug(float ax,float ay,float az,float bx,float by,float bz,float cx,float cy,float cz)
- {
- double w; //BUFFER
- double det_a, det_b, det_c, det_d;//коэффициенты в уравнении плоскости: ax-by+cz-d=0
- double sy,x1,x2,temp,tmp;
- double k1,k2,k3;
- det_a = bz*(ay-cy)+az*(cy-by)+cz*(by-ay);
- det_b = ax*bz + az*cx + bx*cz - bz*cx - az*bx - ax*cz;
- det_c = ax*by + ay*cx + bx*cy - by*cx - ay*bx - ax*cy;
- det_d = ax*by*cz + ay*cx*bz + bx*cy*az - by*cx*az - ay*bx*cz - ax*cy*bz;
- // Сортировка вершин по y
- if (ay>by) {temp=ay; ay=by; by=temp; temp=ax; ax=bx; bx=temp; }
- if (by>cy) {temp=by; by=cy; cy=temp; temp=bx; bx=cx; cx=temp; }
- if (ay>by) {temp=ay; ay=by; by=temp; temp=ax; ax=bx; bx=temp; }
- //Расчет коэффициентов наклона прямых
- if (cy!=ay) k1=(cx-ax)/(cy-ay); else k1=0;
- if (by!=ay) k2=(bx-ax)/(by-ay); else k2=0;
- if (cy!=by) k3=(cx-bx)/(cy-by); else k3=0;
- for (sy=ay;sy<=cy;sy=sy+0.05)
- { x1=k1*(sy-ay)+ax; // поиск пересечения с АС
- if (sy<by) x2=k2*(sy-ay)+ax; // поиск пересечения с АB
- else x2=k3*(sy-by)+bx; // поиск пересечения с ВС
- //координата z вычисляется по формуле: z = (b*y-a*x+d)/c w=1/z
- // (x = tmp) (y = sy)
- if (x1 >=x2)//lx=x2 ; ly=x1
- { for (tmp=x2;tmp<=x1;tmp++)
- {//w=0.0;
- //if(det_b!=0 && det_a!=0)
- w=det_c/(det_b*sy-det_a*tmp+det_d); // w=c/(b*y-a*x+d)
- //else w=0.1;
- if( w>=zBuffer[int(tmp)][int(sy)][0])
- {
- zBuffer[int(tmp)][int(sy)][0]=w;
- zBuffer[(int)tmp][(int)sy][1] = 0;
- zBuffer[(int)tmp][(int)sy][2] = 255;
- zBuffer[(int)tmp][(int)sy][3] = 255;
- }}
- }
- else
- { for (tmp=x1;tmp<=x2;tmp++)
- {w=det_c/(det_b*sy-det_a*tmp+det_d);
- if( w>=zBuffer[int(tmp)][int(sy)][0])
- {
- zBuffer[int(tmp)][int(sy)][0]=w;
- zBuffer[(int)tmp][(int)sy][1] = 0;
- zBuffer[(int)tmp][(int)sy][2] = 0;
- zBuffer[(int)tmp][(int)sy][3] = 255;
- }}
- }}
- }
- void Paint()
- { for(int paint_i=0; paint_i<800; paint_i++)
- for(int paint_j=0; paint_j<600; paint_j++)
- {if(zBuffer[paint_i][paint_j][0]!=0.0)
- SetPixel(hDC, paint_i, paint_j, RGB(zBuffer[paint_i][paint_j][1],zBuffer[paint_i][paint_j][2],zBuffer[paint_i][paint_j][3]));} //устанавливает пиксель в заданных координатах в заданном цвете. дескриптор DC;x-координата пикселя;y-координата пикселя; цвет пикселя
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement