home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / atl / atltangram / atlmodel / atltangrammodel.cpp < prev    next >
C/C++ Source or Header  |  1998-03-26  |  5KB  |  240 lines

  1. // ATLTangramModel.cpp : Implementation of CATLTangramModel
  2. //
  3. // This is a part of the Active Template Library.
  4. // Copyright (C) 1996-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Active Template Library Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Active Template Library product.
  12.  
  13. #include "stdafx.h"
  14. #include "ATLModel.h"
  15. #include "ATLTangramModel.h"
  16.  
  17. // Headers required by STL.
  18. #include <new.h>
  19. #include <algorithm>
  20. #include <xmemory>
  21. #include <list>
  22.  
  23. // Utilities
  24. #include "util.h"
  25. #include "util.cpp"
  26.  
  27. // Other include files
  28. #include "math.h"
  29.  
  30. ///////////////////////////////////////////////////////////
  31. //
  32. // Constants
  33. //
  34. static const double PI = 3.141592654;
  35.  
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CATLTangramModel
  38.  
  39. ///////////////////////////////////////////////////////////
  40. //
  41. //                      IATLTangramModel Interface
  42. //
  43. ///////////////////////////////////////////////////////////
  44. //
  45. //  GetNumberOfVertices
  46. //
  47. HRESULT CATLTangramModel::GetNumberOfVertices(long* pcVertices)
  48. {
  49.     // Preconditions.
  50.     if (IsValidAddress(pcVertices, sizeof(long), TRUE))
  51.     {
  52.         *pcVertices = m_cVertices ;
  53.         return S_OK ;
  54.     }
  55.     else
  56.     {
  57.         ASSERT(0) ;
  58.         return E_INVALIDARG ;
  59.     }
  60. }
  61.  
  62. ///////////////////////////////////////////////////////////
  63. //
  64. //  GetVertices
  65. //
  66. HRESULT CATLTangramModel::GetVertices(long cVertices, TangramPoint2d* points)
  67. {
  68.     // Preconditions
  69.     if (cVertices < m_cVertices)
  70.     {
  71.         ASSERT(0) ;
  72.         return E_OUTOFMEMORY ;
  73.     }
  74.  
  75.     if (cVertices < 1)
  76.     {
  77.         ASSERT(0) ;
  78.         return E_INVALIDARG ;
  79.     }
  80.  
  81.     if (!IsValidAddress(points, sizeof(TangramPoint2d)*cVertices, TRUE))
  82.     {
  83.         ASSERT(0) ;
  84.         return E_POINTER ;
  85.     }
  86.  
  87.     if (m_pVertices == NULL || m_cVertices < 1)
  88.     {
  89.         ASSERT(0) ;
  90.         return E_FAIL ;
  91.     }
  92.  
  93.     // Now we can do the actual work.
  94.  
  95.     // Apply the transform before returning the vertices.
  96.     applyTransform() ;
  97.     for(long i = 0 ; i < m_cVertices ; i++)
  98.     {
  99.         points[i] = m_pTransformVertices[i] ;
  100.     }
  101.     return S_OK ;
  102. }
  103.  
  104. ///////////////////////////////////////////////////////////
  105. //
  106. // SetVetices
  107. //
  108. HRESULT CATLTangramModel::SetVertices(long cVertices, TangramPoint2d* points)
  109. {
  110.     // Preconditions
  111.     if (cVertices < 1)
  112.     {
  113.         ASSERT(0) ;
  114.         return E_INVALIDARG ;
  115.     }
  116.  
  117.     if (!IsValidAddress(points, sizeof(TangramPoint2d)*cVertices, FALSE))
  118.     {
  119.         ASSERT(0) ;
  120.         return E_POINTER ;
  121.     }
  122.  
  123.     // Delete existing arrays.
  124.     delete [] m_pVertices ;
  125.     delete [] m_pTransformVertices ;
  126.  
  127.     // Create new arrays.
  128.     m_cVertices = cVertices ;
  129.     m_pVertices = new TangramPoint2d[m_cVertices] ;
  130.     m_pTransformVertices = new TangramPoint2d[m_cVertices] ;
  131.  
  132.     // Initialize array.
  133.     for(long i = 0 ; i < m_cVertices ; i++)
  134.     {
  135.         m_pVertices[i] = points[i] ;
  136.     }
  137.  
  138.     // Signal that model has changed.
  139.     Fire_OnModelChange() ;
  140.  
  141.     return S_OK ;
  142. }
  143.  
  144. ///////////////////////////////////////////////////////////
  145. //
  146. //                  ITransform Interface
  147. //
  148. ///////////////////////////////////////////////////////////
  149. //
  150. // Translate
  151. //
  152. HRESULT CATLTangramModel::Translate(double x, double y)
  153. {
  154.     m_ptdTranslate.x = x ;
  155.     m_ptdTranslate.y = y ;
  156.  
  157.     Fire_OnModelChange();
  158.  
  159.     return S_OK ;
  160. }
  161.  
  162. ///////////////////////////////////////////////////////////
  163. //
  164. // GetRotation
  165. //
  166. HRESULT CATLTangramModel::GetRotation(double* pRotation)
  167. {
  168.     // Preconditions.
  169.     if (!IsValidAddress(pRotation, sizeof(double), TRUE))
  170.     {
  171.         ASSERT(0) ;
  172.         return E_POINTER;
  173.     }
  174.  
  175.     // Return value in degrees. May be negative.
  176.     *pRotation = m_dDegrees;
  177.     return S_OK ;
  178. }
  179.  
  180. ///////////////////////////////////////////////////////////
  181. //
  182. // Rotate the model.
  183. //
  184. HRESULT CATLTangramModel::Rotate(double dDegrees)
  185. {
  186.     m_dDegrees = dDegrees ;
  187.  
  188.     double dRads= fmod(dDegrees,360.0)*PI/180.0;
  189.     m_cosDegrees = cos(dRads) ;
  190.     m_sinDegrees = sin(dRads) ;
  191.  
  192.     Fire_OnModelChange() ;
  193.  
  194.     return S_OK ;
  195. }
  196.  
  197. ///////////////////////////////////////////////////////////
  198. //
  199. // GetTranslation
  200. //
  201. HRESULT CATLTangramModel::GetTranslation(TangramPoint2d* ppoint)
  202. {
  203.     // Preconditions.
  204.     if (!IsValidAddress(ppoint, sizeof(TangramPoint2d), TRUE))
  205.     {
  206.         ASSERT(0) ;
  207.         return E_POINTER ;
  208.     }
  209.  
  210.     ppoint->x = m_ptdTranslate.x ;
  211.     ppoint->y = m_ptdTranslate.y ;
  212.  
  213.     return S_OK ;
  214. }
  215.  
  216. ///////////////////////////////////////////////////////////
  217. //
  218. // applyTransform Helper function.
  219. //
  220. void CATLTangramModel::applyTransform()
  221. {
  222.     if (m_dDegrees == 0.0)
  223.     {
  224.         // Optimization for unrotated polygon.
  225.         for(long i = 0 ; i < m_cVertices; i++)
  226.         {
  227.             m_pTransformVertices[i].x = m_pVertices[i].x + m_ptdTranslate.x ;
  228.             m_pTransformVertices[i].y = m_pVertices[i].y + m_ptdTranslate.y ;
  229.         }
  230.     }
  231.     else
  232.     {
  233.         for(long i = 0 ; i < m_cVertices; i++)
  234.         {
  235.             m_pTransformVertices[i].x = m_pVertices[i].x*m_cosDegrees - m_pVertices[i].y*m_sinDegrees + m_ptdTranslate.x ;
  236.             m_pTransformVertices[i].y = m_pVertices[i].x*m_sinDegrees + m_pVertices[i].y*m_cosDegrees + m_ptdTranslate.y ;
  237.         }
  238.     }
  239. }
  240.