3DSHAPES.CPP
资源名称:tc3d.zip [点击查看]
上传用户:abcdshs
上传日期:2007-01-07
资源大小:1858k
文件大小:4k
源码类别:
游戏
开发平台:
Visual C++
- // (C) Copyright 1996 by Anthony J. Carin. All Rights Reserved.
- #include <stdafx.h>
- #include "3dshapes.h"
- #include "launch.h"
- #include "bmpsurf.h"
- void coordinate::stepto(coordinate& to, float step, char stop)
- {
- coordinate o = to;
- #ifdef EDITOR
- stop = FALSE;
- #endif
- if (stop)
- {
- bmpsurf *bsurf;
- bsurf = Game->Bmpsurfs()->First();
- while (bsurf)
- {
- if (bsurf->intersects(*this, o))
- return;
- bsurf = Game->Bmpsurfs()->Next();
- }
- }
- if (m_x < o.x())
- {
- m_x += step;
- if (m_x > o.x())
- m_x = o.x();
- }
- else if (m_x > o.x())
- {
- m_x -= step;
- if (m_x < o.x())
- m_x = o.x();
- }
- if (m_y < o.y())
- {
- m_y += step;
- if (m_y > o.y())
- m_y = o.y();
- }
- else if (m_y > o.y())
- {
- m_y -= step;
- if (m_y < o.y())
- m_y = o.y();
- }
- if (m_z < o.z())
- {
- m_z += step;
- if (m_z > o.z())
- m_z = o.z();
- }
- else if (m_z > o.z())
- {
- m_z -= step;
- if (m_z < o.z())
- m_z = o.z();
- }
- }
- coordinate& operator+(coordinate& a, coordinate& b)
- {
- static coordinate r;
- r.m_x = a.m_x + b.m_x;
- r.m_y = a.m_y + b.m_y;
- r.m_z = a.m_z + b.m_z;
- return r;
- }
- coordinate& operator-(coordinate& a, coordinate& b)
- {
- static coordinate r;
- r.m_x = a.m_x - b.m_x;
- r.m_y = a.m_y - b.m_y;
- r.m_z = a.m_z - b.m_z;
- return r;
- }
- void point::xrotate(direction& d)
- {
- register float tmp;
- tmp = tccos(d, m_y) - tcsin(d, m_z);
- m_z = tcsin(d, m_y) + tccos(d, m_z);
- m_y = tmp;
- }
- void point::yrotate(direction& d)
- {
- register float tmp;
- tmp = tccos(d, m_z) - tcsin(d, m_x);
- m_x = tcsin(d, m_z) + tccos(d, m_x);
- m_z = tmp;
- }
- void point::zrotate(direction& d)
- {
- register float tmp;
- tmp = tccos(d, m_x) - tcsin(d, m_y);
- m_y = tccos(d, m_y) + tcsin(d, m_x);
- m_x = tmp;
- }
- void coordinate::operator +=(coordinate& c)
- {
- m_x += c.m_x;
- m_y += c.m_y;
- m_z += c.m_z;
- }
- void coordinate::operator -=(coordinate& c)
- {
- m_x -= c.m_x;
- m_y -= c.m_y;
- m_z -= c.m_z;
- }
- char operator==(coordinate& a, coordinate& b)
- {
- if (a.m_x != b.m_x)
- return FALSE;
- if (a.m_y != b.m_y)
- return FALSE;
- if (a.m_z != b.m_z)
- return FALSE;
- return TRUE;
- }
- const long FOCAL3 = 3000;
- const long WIDE = 10;
- const long FLAT = 8;
- const long TALL = 9;
- polygon::polygon(polygon& p)
- {
- m_linenum = p.m_linenum;
- m_a = p.m_a;
- m_b = p.m_b;
- m_c = p.m_c;
- m_d = p.m_d;
- m_color = p.m_color;
- }
- coordinate& polygon::getcenter()
- {
- static coordinate v;
- float acm = 0.0f, bdm = 0.0f;
- float acb = 0.0f, bdb = 0.0f;
- float x;
- char acv = FALSE,
- bdv = FALSE;
- x = (m_c.x()-m_a.x());
- if (x == 0)
- acv = TRUE;
- else
- acm = (m_c.z()-m_a.z()) / x; // get slope
- x = (m_d.x()-m_b.x());
- if (x == 0)
- bdv = TRUE;
- else
- bdm = (m_d.z()-m_b.z()) / x; // get slope
- if (acv == FALSE)
- acb = m_a.z() - acm * m_a.x(); // get z intersect
- if (bdv == FALSE)
- bdb = m_b.z() - bdm * m_b.x(); // get z intersect
- if (acv || bdv)
- {
- if (acv)
- {
- v.setx(m_a.x());
- v.setz(bdm*m_a.x()+bdb);
- }
- else {
- v.setx(m_b.x());
- v.setz(acm*m_b.x()+acb);
- }
- return v;
- }
- x = (bdm-acm);
- if (x == 0.0f)
- {
- v.setx((m_a.x() + m_c.x()) / 2);
- v.setz((m_a.z() + m_c.z()) / 2);
- }
- else
- {
- x = (acb-bdb)/x;
- v.setx(x);
- v.setz(acm*x+acb);
- }
- v.sety((m_a.y() + m_c.y()) / 2);
- return v;
- }
- void polygon::setto(coordinate& a, coordinate& b, coordinate& c)
- {
- m_a.setto(a);
- m_b.setto(b);
- m_c.setto(c);
- m_d.setto(c);
- m_linenum = 3;
- }
- void polygon::setto(coordinate& a, coordinate& b, coordinate& c, coordinate& d)
- {
- m_a.setto(a);
- m_b.setto(b);
- m_c.setto(c);
- m_d.setto(d);
- m_linenum = 4;
- }
- view::view(view& c) : coordinate(c)
- {
- m_xdirection = c.m_xdirection;
- m_ydirection = c.m_ydirection;
- m_zdirection = c.m_zdirection;
- }