3DSHAPES.CPP
上传用户:abcdshs
上传日期:2007-01-07
资源大小:1858k
文件大小:4k
源码类别:

游戏

开发平台:

Visual C++

  1. // (C) Copyright 1996 by Anthony J. Carin.  All Rights Reserved.
  2. #include <stdafx.h>
  3. #include "3dshapes.h"
  4. #include "launch.h"
  5. #include "bmpsurf.h"
  6. void coordinate::stepto(coordinate& to, float step, char stop)
  7. {
  8.     coordinate o = to;
  9. #ifdef EDITOR
  10.     stop = FALSE;
  11. #endif
  12.     if (stop)
  13.     {
  14.         bmpsurf *bsurf;
  15.         bsurf = Game->Bmpsurfs()->First();
  16.         while (bsurf)
  17.         {
  18.             if (bsurf->intersects(*this, o))
  19.                 return;
  20.             bsurf = Game->Bmpsurfs()->Next();
  21.         }
  22.     }
  23.     if (m_x < o.x())
  24.     {
  25.         m_x += step;
  26.         if (m_x > o.x())
  27.             m_x = o.x();
  28.     }
  29.     else if (m_x > o.x())
  30.     {
  31.         m_x -= step;
  32.         if (m_x < o.x())
  33.             m_x = o.x();
  34.     }
  35.     if (m_y < o.y())
  36.     {
  37.         m_y += step;
  38.         if (m_y > o.y())
  39.             m_y = o.y();
  40.     }
  41.     else if (m_y > o.y())
  42.     {
  43.         m_y -= step;
  44.         if (m_y < o.y())
  45.             m_y = o.y();
  46.     }
  47.     if (m_z < o.z())
  48.     {
  49.         m_z += step;
  50.         if (m_z > o.z())
  51.             m_z = o.z();
  52.     }
  53.     else if (m_z > o.z())
  54.     {
  55.         m_z -= step;
  56.         if (m_z < o.z())
  57.             m_z = o.z();
  58.     }
  59. }
  60. coordinate& operator+(coordinate& a, coordinate& b)
  61. {
  62.    static coordinate r;
  63.    r.m_x = a.m_x + b.m_x;
  64.    r.m_y = a.m_y + b.m_y;
  65.    r.m_z = a.m_z + b.m_z;
  66.    return r;
  67. }
  68. coordinate& operator-(coordinate& a, coordinate& b)
  69. {
  70.    static coordinate r;
  71.    r.m_x = a.m_x - b.m_x;
  72.    r.m_y = a.m_y - b.m_y;
  73.    r.m_z = a.m_z - b.m_z;
  74.    return r;
  75. }
  76. void point::xrotate(direction& d)
  77. {
  78.     register float tmp;
  79.     tmp = tccos(d, m_y) - tcsin(d, m_z);
  80.     m_z = tcsin(d, m_y) + tccos(d, m_z);
  81.     m_y = tmp;
  82. }
  83. void point::yrotate(direction& d)
  84. {
  85.     register float tmp;
  86.     tmp = tccos(d, m_z) - tcsin(d, m_x);
  87.     m_x = tcsin(d, m_z) + tccos(d, m_x);
  88.     m_z = tmp;
  89. }
  90. void point::zrotate(direction& d)
  91. {
  92.     register float tmp;
  93.     tmp = tccos(d, m_x) - tcsin(d, m_y);
  94.     m_y = tccos(d, m_y) + tcsin(d, m_x);
  95.     m_x = tmp;
  96. }
  97. void coordinate::operator +=(coordinate& c)
  98. {
  99.     m_x += c.m_x;
  100.     m_y += c.m_y;
  101.     m_z += c.m_z;
  102. }
  103. void coordinate::operator -=(coordinate& c)
  104. {
  105.     m_x -= c.m_x;
  106.     m_y -= c.m_y;
  107.     m_z -= c.m_z;
  108. }
  109. char operator==(coordinate& a, coordinate& b)
  110. {
  111.     if (a.m_x != b.m_x)
  112.         return FALSE;
  113.     if (a.m_y != b.m_y)
  114.         return FALSE;
  115.     if (a.m_z != b.m_z)
  116.         return FALSE;
  117.     return TRUE;
  118. }
  119. const long FOCAL3  = 3000;
  120. const long WIDE    = 10;
  121. const long FLAT    = 8;
  122. const long TALL    = 9;
  123. polygon::polygon(polygon& p)
  124. {
  125.    m_linenum = p.m_linenum;
  126.    m_a = p.m_a;
  127.    m_b = p.m_b;
  128.    m_c = p.m_c;
  129.    m_d = p.m_d;
  130.    m_color = p.m_color;
  131. }
  132. coordinate& polygon::getcenter()
  133. {
  134.     static coordinate v;
  135.     float acm = 0.0f, bdm = 0.0f;
  136.     float acb = 0.0f, bdb = 0.0f;
  137.     float x;
  138.     char  acv = FALSE,
  139.           bdv = FALSE;
  140.     x = (m_c.x()-m_a.x());
  141.     if (x == 0)
  142.         acv = TRUE;
  143.     else
  144.         acm = (m_c.z()-m_a.z()) / x;            // get slope
  145.     x = (m_d.x()-m_b.x());
  146.     if (x == 0)
  147.         bdv = TRUE;
  148.     else
  149.         bdm = (m_d.z()-m_b.z()) / x;            // get slope
  150.     if (acv == FALSE)
  151.         acb = m_a.z() - acm * m_a.x();        // get z intersect
  152.     if (bdv == FALSE)
  153.         bdb = m_b.z() - bdm * m_b.x();        // get z intersect
  154.     if (acv || bdv)
  155.     {
  156.         if (acv)
  157.         {
  158.             v.setx(m_a.x());
  159.             v.setz(bdm*m_a.x()+bdb);
  160.         }
  161.         else {
  162.             v.setx(m_b.x());
  163.             v.setz(acm*m_b.x()+acb);
  164.         }
  165.         return v;
  166.     }
  167.     x = (bdm-acm);
  168.     if (x == 0.0f)
  169.     {
  170.         v.setx((m_a.x() + m_c.x()) / 2);
  171.         v.setz((m_a.z() + m_c.z()) / 2);
  172.     }
  173.     else
  174.     {
  175.         x = (acb-bdb)/x;
  176.         v.setx(x);
  177.         v.setz(acm*x+acb);
  178.     }
  179.     v.sety((m_a.y() + m_c.y()) / 2);
  180.     return v;
  181. }
  182. void polygon::setto(coordinate& a, coordinate& b, coordinate& c)
  183. {
  184.    m_a.setto(a);
  185.    m_b.setto(b);
  186.    m_c.setto(c);
  187.    m_d.setto(c);
  188.    m_linenum = 3;
  189. }
  190. void polygon::setto(coordinate& a, coordinate& b, coordinate& c, coordinate& d)
  191. {
  192.    m_a.setto(a);
  193.    m_b.setto(b);
  194.    m_c.setto(c);
  195.    m_d.setto(d);
  196.    m_linenum = 4;
  197. }
  198. view::view(view& c) : coordinate(c)
  199. {
  200.     m_xdirection = c.m_xdirection;
  201.     m_ydirection = c.m_ydirection;
  202.     m_zdirection = c.m_zdirection;
  203. }