DOGS-102 Graphic LCD module Example. Based on Igor Skochinsky's "DOGLCDDemo" program.
Dependencies: DOG-S_GraphicLCD mbed
Fork of DOGLCDDemo by
Diff: Graphics/Object3D.cpp
- Revision:
- 1:b7a86d680935
- Parent:
- 0:2a5dccfd318f
--- a/Graphics/Object3D.cpp Thu Jan 14 00:49:39 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -/* - * libmbed-graphics 2D and wireframe 3D graphics library for the MBED - * microcontroller platform - * Copyright (C) <2009> Michael Sheldon <mike@mikeasoft.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "Object3D.h" - -Object3D::Object3D() { - _x = 0; - _y = 0; - _z = 0; - _rx = 0; - _ry = 0; - _rz = 0; - _sx = 1; - _sy = 1; - _sz = 1; - _colour = 0xffffff; -} - -void Object3D::position(int x, int y, int z) { - _x = x; - _y = y; - _z = z; -} - -void Object3D::rotate(float rx, float ry, float rz) { - _rx = rx; - _ry = ry; - _rz = rz; -} - -void Object3D::scale(float sx, float sy, float sz) { - _sx = sx; - _sy = sy; - _sz = sz; -} - -void Object3D::colour(int colour) { - _colour = colour; -} - -#define FASTSINCOS - -#ifdef FASTSINCOS - -// http://www.dspguru.com/dsp/tricks/parabolic-approximation-of-sin-and-cos - -#define M_PI 3.14159265358979323846 -#define M_PI_2 1.57079632679489661923 -#define M_PI_4 0.785398163397448309616 -#define M_C 0.71256755058 - -void sincosf(float angle, float *sinx, float *cosx) -{ - int quarter = int(floor(angle/M_PI_2)); - - float modphase = angle - quarter*M_PI_2; - if ( modphase < 0 ) - modphase += M_PI_2; - - quarter %= 4; - if ( quarter < 0 ) - quarter += 4; - - modphase = modphase/M_PI_2; - - //printf("Angle: %f, q: %d, mod: %f\n", angle, quarter, modphase); - float x, temp; - switch (quarter) - { - case 0: - // First quarter, angle = 0 .. pi/2 - x = modphase - 0.5f; // 1 sub - temp = (2 - 4*M_C)*x*x + M_C; // 2 mul, 1 add - *sinx = temp + x; // 1 add - *cosx = temp - x; // 1 sub - break; - case 1: - // Second quarter, angle = pi/2 .. pi - x = 0.5f - modphase; // 1 sub - temp = (2 - 4*M_C)*x*x + M_C; // 2 mul, 1 add - *sinx = x + temp; // 1 add - *cosx = x - temp; // 1 sub - break; - case 2: - // Third quarter, angle = pi .. 1.5pi - x = modphase - 0.5f; // 1 sub - temp = (4*M_C - 2)*x*x - M_C; // 2 mul, 1 sub - *sinx = temp - x; // 1 sub - *cosx = temp + x; // 1 add - break; - case 3: - // Fourth quarter, angle = 1.5pi..2pi - x = modphase - 0.5f; // 1 sub - temp = (2 - 4*M_C)*x*x + M_C; // 2 mul, 1 add - *sinx = x - temp; // 1 sub - *cosx = x + temp; // 1 add - break; - } -} - -#else // FASTSINCOS - -void sincosf(float angle, float *sinx, float *cosx) -{ - *sinx = sin(angle); - *cosx = cos(angle); -} - -#endif // FASTSINCOS - - -void rotate3d(int *x, int *y, int *z, float anglex, float angley, float anglez, int count) -{ - float sinx, cosx, siny, cosy, sinz, cosz; - sincosf(anglex, &sinx, &cosx); - sincosf(angley, &siny, &cosy); - sincosf(anglez, &sinz, &cosz); - - for ( int i=0; i < count; i++) - { - int x1 = x[i]; - int y1 = y[i]; - int z1 = z[i]; - - int y2 = cosx * y1 - sinx * z1; - int z2 = sinx * y1 + cosx * z1; - - int x2 = cosy * x1 + siny * z2; - int z3 = -siny * x1 + cosy * z2; - - int x3 = cosz * x2 - sinz * y2; - int y3 = sinz * x2 + cosz * y2; - - x[i] = x3; - y[i] = y3; - z[i] = z3; - } -}