Advertisement
Bkmz

Untitled

Dec 15th, 2011
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.88 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "vol2.h"
  3. #include <stdio.h>
  4. #define MAX_LOADSTRING 100
  5. #define WS_FIXEDWINDOW  WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX // Ñòèëü îêíà
  6. #define BUFSIZE 255
  7. // Global Variables:
  8. HINSTANCE hInst;                                // current instance
  9. TCHAR szTitle[MAX_LOADSTRING];                  // The title bar text
  10. TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
  11. HDC  hDC;
  12. HWND hWnd;
  13. bool FLAG=true;
  14. float gdot[4];
  15. float **matrix;
  16. float vvv,eee,v,e;
  17. float zBuffer[800][600][4];
  18. int n,m;
  19.  
  20.  
  21. //====òî÷êà íàáëþäåíèÿ
  22. float xe,ye,ze,d_Screen,R;
  23. float xe_old=200,ye_old=151,ze_old=65,d_old=200,R_old=80;
  24.  
  25. int k,i,j,l;
  26. int par_old=10,mer_old=30,par,mer;
  27. float Pi= 3.141592;
  28. float phi;
  29. float **mas, *dot, **ver;
  30. float **A,**B,**C,**D;
  31.  
  32. ATOM                MyRegisterClass(HINSTANCE hInstance);
  33. BOOL                InitInstance(HINSTANCE, int);
  34. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
  35. LRESULT CALLBACK    Param(HWND, UINT, WPARAM, LPARAM);
  36. void QWERT();
  37. void mnozh(float *a,float **b);
  38. void NULL_W();
  39. void Triug(float ax,float ay,float az,float bx,float by,float bz,float cx,float cy,float cz);
  40. void Paint();
  41.  
  42. int APIENTRY _tWinMain(HINSTANCE hInstance,  HINSTANCE hPrevInstance,   LPTSTR    lpCmdLine,   int nCmdShow)
  43.   {     MSG msg;
  44.     HACCEL hAccelTable;
  45.     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  46.     LoadString(hInstance, IDC_VOL2, szWindowClass, MAX_LOADSTRING);
  47.     MyRegisterClass(hInstance);
  48.     if (!InitInstance (hInstance, nCmdShow))
  49.     {return FALSE;}
  50.     hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_VOL2);
  51.         while (GetMessage(&msg, NULL, 0, 0))
  52.     {if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  53.         {   TranslateMessage(&msg);
  54.             DispatchMessage(&msg);  }   }
  55.     return (int) msg.wParam;}
  56.  
  57. ATOM MyRegisterClass(HINSTANCE hInstance)
  58. {   WNDCLASSEX wcex;
  59.     wcex.cbSize = sizeof(WNDCLASSEX);
  60.     wcex.style          = CS_HREDRAW | CS_VREDRAW;
  61.     wcex.lpfnWndProc    = (WNDPROC)WndProc;
  62.     wcex.cbClsExtra     = 0;
  63.     wcex.cbWndExtra     = 0;
  64.     wcex.hInstance      = hInstance;
  65.     wcex.hIcon          = LoadIcon(hInstance, (LPCTSTR)IDI_VOL2);
  66.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
  67.     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
  68.     wcex.lpszMenuName   = (LPCTSTR)IDC_VOL2;
  69.     wcex.lpszClassName  = szWindowClass;
  70.     wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_VOL2);
  71.     return RegisterClassEx(&wcex);}
  72.  
  73. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  74. {   HWND hWnd;
  75.    hInst = hInstance;
  76.    hWnd=CreateWindowEx(
  77.     0,                                           //ðàñøèðåííûé ñòèëü îêíà
  78.      szWindowClass,                                      //èìÿ
  79.      NULL,                                       //çàãîëîâîê
  80.     WS_FIXEDWINDOW,                              //ñòèëü îêíà
  81.     CW_USEDEFAULT,                               //X-êîîðäèíàòà âåðõ. ëåâîãî óãëà îêíà
  82.     CW_USEDEFAULT,                               //Y-êîîðäèíàòà âåðõ. ëåâîãî óãëà îêíà
  83.     800,                                            //øèðèíà îêíà
  84.     600,                                           //âûñîòà îêíà
  85.     NULL,                                        //äåñêðèïòîð ðîäèòåëüñêîãî îêíà
  86.     NULL,                                        //äåñêðèïòîð ìåíþ îêíà
  87.     hInst,                                       //èäåíò. ïðèëîæåíèÿ ñîçäàâøåãî îêíî
  88.     NULL);                                       //óêàçàòåëü íà îáëàñòü äàííûõ ïðèëîæåíèÿ
  89. hDC=GetDC(hWnd);
  90. if (!hDC) return false;
  91.    if (!hWnd)
  92.    {      return FALSE;   }
  93. ShowWindow(hWnd, nCmdShow);
  94. UpdateWindow(hWnd);
  95.       return TRUE;}
  96.  
  97. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  98. {   int wmId, wmEvent;
  99.     PAINTSTRUCT ps;
  100.     HDC hdc;
  101.     switch (message)
  102.     {   case WM_COMMAND:
  103.         wmId    = LOWORD(wParam);
  104.         wmEvent = HIWORD(wParam);
  105.         // Parse the menu selections:
  106.         switch (wmId)
  107.         {
  108.         case IDM_EXIT:
  109.             DestroyWindow(hWnd);
  110.             break;
  111.         case IDM_PUSK:
  112.             {DialogBox(hInst, (LPCTSTR)IDD_PARAM, hWnd, (DLGPROC)Param);
  113.             QWERT();}
  114.             break;
  115.         default:
  116.             return DefWindowProc(hWnd, message, wParam, lParam);    }
  117.         break;
  118.     case WM_PAINT:
  119.         hdc = BeginPaint(hWnd, &ps);
  120.         Paint();// TODO: Add any drawing code here...
  121.         EndPaint(hWnd, &ps);
  122.         break;
  123.     case WM_DESTROY:
  124.         PostQuitMessage(0);
  125.         break;
  126.     default:
  127.         return DefWindowProc(hWnd, message, wParam, lParam);
  128.     }   return 0;}
  129.  
  130. LRESULT CALLBACK Param(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  131. {   //char buf[BUFSIZE];
  132. switch (message)
  133.     {   case WM_INITDIALOG:
  134.         if(FLAG){CheckRadioButton(hDlg, IDC_PERSPECT,IDC_PARALLEL,IDC_PARALLEL );}
  135.         else CheckRadioButton(hDlg, IDC_PERSPECT,IDC_PARALLEL, IDC_PERSPECT);
  136.     return TRUE;
  137.     case WM_COMMAND:
  138.         if (LOWORD(wParam) == IDOK)
  139.         {       R = R_old;
  140.             mer= mer_old;
  141.             par= par_old;
  142.             d_Screen=d_old;
  143.             xe=xe_old;
  144.             ye= ye_old;
  145.             ze= ze_old;
  146.             FLAG=IsDlgButtonChecked(hDlg,IDC_PARALLEL);
  147.             EndDialog(hDlg, LOWORD(wParam));
  148.             return TRUE;
  149.         }break;
  150.     }   return FALSE;}
  151.  
  152.  
  153. void mnozh(float *a,float **b)
  154. {for(int i=0;i<4;i++)
  155. gdot[i]=0;
  156. for(int j=0;j<4;j++)
  157. for(    i=0;i<4;i++)
  158. gdot[j]+=a[i]*b[i][j];}
  159.  
  160. void QWERT()
  161. {   NULL_W();
  162.  
  163.     phi=2.0*Pi/mer;
  164.     vvv=xe*xe+ye*ye; //ñ÷èòàåì âåêòîð V
  165.     v=sqrt(vvv);
  166.     eee=xe*xe+ye*ye+ze*ze; // ñ÷èòàåì âåêòîð Å
  167.     e=sqrt(eee);
  168.  
  169. matrix=new float *[4];
  170. for(i=0;i<4;i++)
  171. {matrix[i]=new float[4];
  172. for(j=0;j<4;j++)
  173. matrix[i][j]=0.0;}
  174.  
  175.  
  176. //Ìàòðèöà ïîâîðîòà ñèñòåìû êîîðäèíàò âîêðóã îñè z
  177. A=new float *[4];
  178. for(i=0;i<4;i++)
  179. {A[i]=new float[4];
  180. for(j=0;j<4;j++)
  181. A[i][j]=0;}
  182.  
  183. 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;
  184.  
  185. //Ìàòðèöà ïîâîðîòà ñèñòåìû êîîðäèíàò âîêðóã îñè Y
  186. B=new float *[4];
  187. for(i=0;i<4;i++)
  188. {B[i]=new float[4];
  189. for(j=0;j<4;j++)
  190. B[i][j]=0.0;}
  191.  
  192. 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;
  193.  
  194.  
  195. //Ìàòðèöà ïåðåíîñà íà÷àëà ñèñòåìû êîîðäèíàò â òî÷êó Å.
  196. C=new float *[4];
  197. for(i=0;i<4;i++)
  198. {C[i]=new float[4];
  199. for(j=0;j<4;j++)
  200. C[i][j]=0.0;}
  201.  
  202. C[0][0]=1; C[1][1]=1; C[2][2]=1; C[3][3]=1; C[3][0]=-e;
  203.  
  204. //Ìàòðèöà ïðåîáðàçîâàíèÿ îñåé ñèñòåìû êîîðäèíàò
  205. D=new float *[4];
  206. for(i=0;i<4;i++)
  207. {D[i]=new float[4];
  208. for(j=0;j<4;j++)
  209. D[i][j]=0.0;}
  210.  
  211. D[0][2]=-1; D[1][0]=1; D[2][1]=1; D[3][3]=1;
  212.  
  213. ver=new float *[(par+1)*mer]; //ìàññèâ âåðøèí
  214. for(i=0;i<(par+1)*mer;i++)
  215. {ver[i]=new float[4];
  216. for(j=0;j<4;j++)
  217. ver[i][j]=1.0;}
  218.  
  219. for(i=0;i<par+1;i++)
  220. for(j=i*mer;j<mer*i+mer;j++)
  221. {ver[j][2]=-R+2*R*i/par;}
  222.  
  223.     for(j=0;j<(par+1)*mer;j++)// z
  224.     {ver[j][0]=0;
  225.     ver[j][1]=sqrt(R*R-ver[j][2]*ver[j][2]);}
  226.  
  227. for(j=0;j<(par+1)*mer;j++)
  228. if(j%mer!=0){
  229. ver[j][1]= cos(phi)*ver[j-1][1]+sin(phi)*ver[j-1][0]; //y
  230. ver[j][0]=-sin(phi)*ver[j-1][1]+cos(phi)*ver[j-1][0];} //x
  231.  
  232.         for(j=0;j<(par+1)*mer;j++)
  233.         {mnozh(ver[j],A);
  234.         for(i=0;i<4;i++)
  235.         ver[j][i]=gdot[i];}
  236.  
  237. for(j=0;j<(par+1)*mer;j++)
  238. {mnozh(ver[j],B);
  239. for(i=0;i<4;i++)
  240. ver[j][i]=gdot[i];}
  241.  
  242.     for(j=0;j<(par+1)*mer;j++)
  243.     {mnozh(ver[j],C);
  244.     for(i=0;i<4;i++)
  245.     ver[j][i]=gdot[i];}
  246.  
  247. for(j=0;j<(par+1)*mer;j++)
  248. {mnozh(ver[j],D);
  249. for(i=0;i<4;i++)
  250. ver[j][i]=gdot[i];}
  251.  
  252. if(FLAG)////////////ÏÀÐÀËËÅËÜ
  253. {InvalidateRect(hWnd,NULL,false);//äîáàâëÿåò ïðÿìîóãîëüíèê ê îáíîâëÿåìîìó ðåãèîíó çàäàííîãî îêíà. Îáíîâëÿåìûé ðåãèîí ïðåäñòàâëÿåò ÷àñòü ðàáî÷åé îáëàñòè îêíà, êîòîðàÿ äîëæíà áûòü ïåðåðèñîâàíà; äåñêðèïòîð îêíà; êîîðäèíàòû ïðÿìîóãîëüíèêà; ñîñòîÿíèå î÷èñòêè
  254. for(j=0;j<(par+1)*mer;j++)
  255. {ver[j][0]=400.0+ver[j][0];
  256. ver[j][1]=300.0-ver[j][1];}
  257. for(i=0;(i+mer)<(par+1)*mer;i++)
  258. {
  259. if((i+1)%(mer)!=0)  {
  260.     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]);
  261.     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]);  
  262. } else{
  263.     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]);  
  264.     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]);
  265. }}}
  266. else{///////////////ïåðñïåêòèâà
  267. InvalidateRect(hWnd,NULL,true);
  268.  
  269. for(j=0;j<(par+1)*mer;j++)
  270. {ver[j][0]=400.0+(ver[j][0]*d_Screen/ver[j][2]);
  271. ver[j][1]=300.0-(ver[j][1]*d_Screen/ver[j][2]);}
  272.  
  273. for(i=0;i+mer<(par+1)*mer;i++)
  274. {
  275. if((i+1)%(mer)!=0){
  276.     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]);
  277.     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]);  
  278. }else   {
  279.     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]);
  280.     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]);  
  281. }}}
  282. }
  283.  
  284. void NULL_W()
  285. {for(i=0; i<800; i++)
  286.     for(j=0; j<600; j++)
  287.         {zBuffer[i][j][0] = 0.0;
  288.         zBuffer[i][j][1] = 0.0;
  289.         zBuffer[i][j][2] = 0.0;
  290.         zBuffer[i][j][3] = 0.0;
  291. }}
  292.  
  293. void Triug(float ax,float ay,float az,float bx,float by,float bz,float cx,float cy,float cz)
  294. {  
  295.     double w;   //BUFFER
  296.     double det_a, det_b, det_c, det_d;//êîýôôèöèåíòû â óðàâíåíèè ïëîñêîñòè: ax-by+cz-d=0
  297.     double sy,x1,x2,temp,tmp;
  298.     double k1,k2,k3;
  299.  
  300.    
  301.         det_a = bz*(ay-cy)+az*(cy-by)+cz*(by-ay);
  302.         det_b = ax*bz + az*cx + bx*cz - bz*cx - az*bx - ax*cz;
  303.         det_c = ax*by + ay*cx + bx*cy - by*cx - ay*bx - ax*cy;
  304.         det_d = ax*by*cz + ay*cx*bz + bx*cy*az - by*cx*az - ay*bx*cz - ax*cy*bz;   
  305.  
  306. // Ñîðòèðîâêà âåðøèí ïî y
  307.         if (ay>by)  {temp=ay;   ay=by;  by=temp;    temp=ax;    ax=bx;  bx=temp; }
  308.         if (by>cy)  {temp=by;   by=cy;  cy=temp;    temp=bx;    bx=cx;  cx=temp; }
  309.         if (ay>by)  {temp=ay;   ay=by;  by=temp;    temp=ax;    ax=bx;  bx=temp; } 
  310. //Ðàñ÷åò êîýôôèöèåíòîâ íàêëîíà ïðÿìûõ
  311.         if (cy!=ay) k1=(cx-ax)/(cy-ay);  else    k1=0;
  312.         if (by!=ay) k2=(bx-ax)/(by-ay);  else    k2=0;
  313.         if (cy!=by) k3=(cx-bx)/(cy-by);  else    k3=0;
  314.  
  315. for (sy=ay;sy<=cy;sy=sy+0.05)
  316.     {                   x1=k1*(sy-ay)+ax;       // ïîèñê ïåðåñå÷åíèÿ ñ ÀÑ
  317.         if (sy<by)      x2=k2*(sy-ay)+ax;       // ïîèñê ïåðåñå÷åíèÿ ñ ÀB
  318.                 else    x2=k3*(sy-by)+bx;       // ïîèñê ïåðåñå÷åíèÿ ñ ÂÑ
  319.            
  320. //êîîðäèíàòà z âû÷èñëÿåòñÿ ïî ôîðìóëå: z = (b*y-a*x+d)/c  w=1/z
  321.         // (x = tmp) (y = sy)
  322.  
  323.     if (x1 >=x2)//lx=x2 ; ly=x1
  324.             {   for (tmp=x2;tmp<=x1;tmp++)
  325.                     {//w=0.0;  
  326.                     //if(det_b!=0 && det_a!=0)
  327.                         w=det_c/(det_b*sy-det_a*tmp+det_d); // w=c/(b*y-a*x+d)
  328.                     //else w=0.1;
  329.                     if( w>=zBuffer[int(tmp)][int(sy)][0])
  330.                     {  
  331.                         zBuffer[int(tmp)][int(sy)][0]=w;     
  332.                         zBuffer[(int)tmp][(int)sy][1] = 0;
  333.                         zBuffer[(int)tmp][(int)sy][2] = 255;
  334.                         zBuffer[(int)tmp][(int)sy][3] = 255;
  335.                     }}
  336.             }
  337.     else
  338.         {   for (tmp=x1;tmp<=x2;tmp++)
  339.                     {w=det_c/(det_b*sy-det_a*tmp+det_d);
  340.                     if( w>=zBuffer[int(tmp)][int(sy)][0])
  341.                     {
  342.            
  343.                         zBuffer[int(tmp)][int(sy)][0]=w;       
  344.                         zBuffer[(int)tmp][(int)sy][1] = 0;
  345.                         zBuffer[(int)tmp][(int)sy][2] = 0;
  346.                         zBuffer[(int)tmp][(int)sy][3] = 255;
  347.                     }}
  348. }}
  349. }
  350.  
  351. void Paint()
  352. {   for(int paint_i=0; paint_i<800; paint_i++)
  353.     for(int paint_j=0; paint_j<600; paint_j++)
  354.     {if(zBuffer[paint_i][paint_j][0]!=0.0)
  355.     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-êîîðäèíàòà ïèêñåëÿ; öâåò ïèêñåëÿ
  356.  
  357. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement