ColonelNV

3d cube

Nov 1st, 2019
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {//обработчик сообщений
  2.  PAINTSTRUCT ps;
  3.  static HBRUSH hBrush;
  4.  class TFPoint{
  5.  public:
  6.  float X;
  7.  float Y;
  8.  float Z;
  9.  };
  10.  TFPoint CubePoints[]={
  11.  {-50, -50, -50},
  12.  {50, -50, -50},
  13.  {50, 50, -50},
  14.  {-50, 50, -50},
  15.  {-50, 50, 50},
  16.  {-50, -50, 50},
  17.  {50, -50, 50},
  18.  {50, 50, 50}
  19.  };
  20.  int Gran[6][4]={
  21.  {0, 3, 4, 5},
  22.  {0, 5, 6, 1},
  23.  {2, 7, 4, 3},
  24.  {7, 6, 5, 4},
  25.  {0, 1, 2, 3},
  26.  {2, 1, 6, 7}
  27.  };
  28.  POINT point1[4];
  29.  HDC hdc;
  30.  int sx, sy, xPos, yPos, zDelta;
  31.  switch (message)
  32.  {
  33.  case WM_MOUSEMOVE:
  34.  sx = LOWORD(lParam);
  35.  sy = HIWORD(lParam);
  36.  thetta+=((sx%180)-90)/10;
  37.  phi+=((sy%180)-90)/10;
  38.  InvalidateRect(hWnd, NULL, TRUE);
  39.  break;
  40.  case WM_MOUSEWHEEL:
  41.  zDelta=(int) wParam;
  42.  ScreenDist-=zDelta/1000000.;
  43.  InvalidateRect(hWnd, NULL, TRUE);
  44.  break;
  45.  case WM_SIZE:
  46.  sx = LOWORD(lParam);//Ширина
  47.  sy = HIWORD(lParam);//Высота
  48.  break;
  49.  case WM_PAINT:
  50.  hBrush = CreateSolidBrush(RGB(255, 0, 0)); // Создание кисти
  51.  hdc = BeginPaint(hWnd, &ps);//Установка режима
  52.  th=thetta*factor;
  53.  ph=phi*factor;
  54.  costh=cos(th);
  55.  sinth=sin(th);
  56.  cosph=cos(ph);
  57.  sinph=sin(ph);
  58.  A=rho*sinph*costh; B=rho*sinph*sinth; C=rho*cosph;
  59.  Al=A/(sqrt(A*A+B*B+C*C));
  60.  Bl=B/(sqrt(A*A+B*B+C*C));
  61.  Cl=C/(sqrt(A*A+B*B+C*C));
  62.  for(int i = 0; i<6; i++){
  63.  for(int j=0; j<3; j++){
  64.  xt[j]=CubePoints[Gran[i][j]].X;
  65.  yt[j]=CubePoints[Gran[i][j]].Y;
  66.  zt[j]=CubePoints[Gran[i][j]].Z;
  67.  }
  68.  A = yt[0]*(zt[1]-zt[2])-yt[1]*(zt[0]-zt[2])+yt[2]*(zt[0]-zt[1]);
  69.  B =-(xt[0]*(zt[1]-zt[2])-xt[1]*(zt[0]-zt[2])+xt[2]*(zt[0]-zt[1]));
  70.  C = xt[0]*(yt[1]-yt[2])-xt[1]*(yt[0]-yt[2])+xt[2]*(yt[0]-yt[1]);
  71.  An = A/(sqrt(A*A+B*B+C*C));
  72.  Bn = B/(sqrt(A*A+B*B+C*C));
  73.  Cn = C/(sqrt(A*A+B*B+C*C));
  74.  alpha=(An*Al+Bn*Bl+Cn*Cl);
  75.  for(int j=0; j<4; j++){
  76.  point1[j]=Perspective(CubePoints[Gran[i][j]].X,
  77.  CubePoints[Gran[i][j]].Y,
  78.  CubePoints[Gran[i][j]].Z);
  79.  }
  80.  D = point1[0].x*(point1[1].y-point1[2].y)-
  81.  point1[1].x*(point1[0].y-point1[2].y)+
  82.  point1[2].x*(point1[0].y-point1[1].y);
  83.  if (D<0){
  84.  hBrush = CreateSolidBrush(RGB((1-alpha)*255,
  85.  (1-alpha)*255,(1-alpha)*255));
  86.  SelectObject(hdc,hBrush);
  87.  Polygon(hdc,point1,4);
  88.  }
  89.  }
  90.  EndPaint(hWnd, &ps);
  91.  break;
  92.  case WM_DESTROY:PostQuitMessage(0);
  93.  break;
  94.  default:return DefWindowProc(hWnd, message, wParam, lParam);
  95.  }
  96.  return 0;
  97. }
  98.  
  99. // Обработчик сообщений для окна "О программе".
  100. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  101. {
  102.  UNREFERENCED_PARAMETER(lParam);
  103.  switch (message)
  104.  {
  105.  case WM_INITDIALOG:
  106.   return (INT_PTR)TRUE;
  107.  
  108.  case WM_COMMAND:
  109.   if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  110.   {
  111.    EndDialog(hDlg, LOWORD(wParam));
  112.    return (INT_PTR)TRUE;
  113.   }
  114.   break;
  115.  }
  116.  return (INT_PTR)FALSE;
  117. }
Add Comment
Please, Sign In to add comment