Igor Skochinsky
/
DOGLCDDemo
A demo program for DOGL-128 LCD module. Based on Mike Sheldon's 3D Tie Fighter demo.
Graphics/Object3D.cpp@0:2a5dccfd318f, 2010-01-14 (annotated)
- Committer:
- igorsk
- Date:
- Thu Jan 14 00:49:39 2010 +0000
- Revision:
- 0:2a5dccfd318f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
igorsk | 0:2a5dccfd318f | 1 | /* |
igorsk | 0:2a5dccfd318f | 2 | * libmbed-graphics 2D and wireframe 3D graphics library for the MBED |
igorsk | 0:2a5dccfd318f | 3 | * microcontroller platform |
igorsk | 0:2a5dccfd318f | 4 | * Copyright (C) <2009> Michael Sheldon <mike@mikeasoft.com> |
igorsk | 0:2a5dccfd318f | 5 | * |
igorsk | 0:2a5dccfd318f | 6 | * This library is free software; you can redistribute it and/or |
igorsk | 0:2a5dccfd318f | 7 | * modify it under the terms of the GNU Library General Public |
igorsk | 0:2a5dccfd318f | 8 | * License as published by the Free Software Foundation; either |
igorsk | 0:2a5dccfd318f | 9 | * version 2 of the License, or (at your option) any later version. |
igorsk | 0:2a5dccfd318f | 10 | * |
igorsk | 0:2a5dccfd318f | 11 | * This library is distributed in the hope that it will be useful, |
igorsk | 0:2a5dccfd318f | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
igorsk | 0:2a5dccfd318f | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
igorsk | 0:2a5dccfd318f | 14 | * Library General Public License for more details. |
igorsk | 0:2a5dccfd318f | 15 | * |
igorsk | 0:2a5dccfd318f | 16 | * You should have received a copy of the GNU Library General Public |
igorsk | 0:2a5dccfd318f | 17 | * License along with this library; if not, write to the |
igorsk | 0:2a5dccfd318f | 18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
igorsk | 0:2a5dccfd318f | 19 | * Boston, MA 02111-1307, USA. |
igorsk | 0:2a5dccfd318f | 20 | */ |
igorsk | 0:2a5dccfd318f | 21 | |
igorsk | 0:2a5dccfd318f | 22 | #include "Object3D.h" |
igorsk | 0:2a5dccfd318f | 23 | |
igorsk | 0:2a5dccfd318f | 24 | Object3D::Object3D() { |
igorsk | 0:2a5dccfd318f | 25 | _x = 0; |
igorsk | 0:2a5dccfd318f | 26 | _y = 0; |
igorsk | 0:2a5dccfd318f | 27 | _z = 0; |
igorsk | 0:2a5dccfd318f | 28 | _rx = 0; |
igorsk | 0:2a5dccfd318f | 29 | _ry = 0; |
igorsk | 0:2a5dccfd318f | 30 | _rz = 0; |
igorsk | 0:2a5dccfd318f | 31 | _sx = 1; |
igorsk | 0:2a5dccfd318f | 32 | _sy = 1; |
igorsk | 0:2a5dccfd318f | 33 | _sz = 1; |
igorsk | 0:2a5dccfd318f | 34 | _colour = 0xffffff; |
igorsk | 0:2a5dccfd318f | 35 | } |
igorsk | 0:2a5dccfd318f | 36 | |
igorsk | 0:2a5dccfd318f | 37 | void Object3D::position(int x, int y, int z) { |
igorsk | 0:2a5dccfd318f | 38 | _x = x; |
igorsk | 0:2a5dccfd318f | 39 | _y = y; |
igorsk | 0:2a5dccfd318f | 40 | _z = z; |
igorsk | 0:2a5dccfd318f | 41 | } |
igorsk | 0:2a5dccfd318f | 42 | |
igorsk | 0:2a5dccfd318f | 43 | void Object3D::rotate(float rx, float ry, float rz) { |
igorsk | 0:2a5dccfd318f | 44 | _rx = rx; |
igorsk | 0:2a5dccfd318f | 45 | _ry = ry; |
igorsk | 0:2a5dccfd318f | 46 | _rz = rz; |
igorsk | 0:2a5dccfd318f | 47 | } |
igorsk | 0:2a5dccfd318f | 48 | |
igorsk | 0:2a5dccfd318f | 49 | void Object3D::scale(float sx, float sy, float sz) { |
igorsk | 0:2a5dccfd318f | 50 | _sx = sx; |
igorsk | 0:2a5dccfd318f | 51 | _sy = sy; |
igorsk | 0:2a5dccfd318f | 52 | _sz = sz; |
igorsk | 0:2a5dccfd318f | 53 | } |
igorsk | 0:2a5dccfd318f | 54 | |
igorsk | 0:2a5dccfd318f | 55 | void Object3D::colour(int colour) { |
igorsk | 0:2a5dccfd318f | 56 | _colour = colour; |
igorsk | 0:2a5dccfd318f | 57 | } |
igorsk | 0:2a5dccfd318f | 58 | |
igorsk | 0:2a5dccfd318f | 59 | #define FASTSINCOS |
igorsk | 0:2a5dccfd318f | 60 | |
igorsk | 0:2a5dccfd318f | 61 | #ifdef FASTSINCOS |
igorsk | 0:2a5dccfd318f | 62 | |
igorsk | 0:2a5dccfd318f | 63 | // http://www.dspguru.com/dsp/tricks/parabolic-approximation-of-sin-and-cos |
igorsk | 0:2a5dccfd318f | 64 | |
igorsk | 0:2a5dccfd318f | 65 | #define M_PI 3.14159265358979323846 |
igorsk | 0:2a5dccfd318f | 66 | #define M_PI_2 1.57079632679489661923 |
igorsk | 0:2a5dccfd318f | 67 | #define M_PI_4 0.785398163397448309616 |
igorsk | 0:2a5dccfd318f | 68 | #define M_C 0.71256755058 |
igorsk | 0:2a5dccfd318f | 69 | |
igorsk | 0:2a5dccfd318f | 70 | void sincosf(float angle, float *sinx, float *cosx) |
igorsk | 0:2a5dccfd318f | 71 | { |
igorsk | 0:2a5dccfd318f | 72 | int quarter = int(floor(angle/M_PI_2)); |
igorsk | 0:2a5dccfd318f | 73 | |
igorsk | 0:2a5dccfd318f | 74 | float modphase = angle - quarter*M_PI_2; |
igorsk | 0:2a5dccfd318f | 75 | if ( modphase < 0 ) |
igorsk | 0:2a5dccfd318f | 76 | modphase += M_PI_2; |
igorsk | 0:2a5dccfd318f | 77 | |
igorsk | 0:2a5dccfd318f | 78 | quarter %= 4; |
igorsk | 0:2a5dccfd318f | 79 | if ( quarter < 0 ) |
igorsk | 0:2a5dccfd318f | 80 | quarter += 4; |
igorsk | 0:2a5dccfd318f | 81 | |
igorsk | 0:2a5dccfd318f | 82 | modphase = modphase/M_PI_2; |
igorsk | 0:2a5dccfd318f | 83 | |
igorsk | 0:2a5dccfd318f | 84 | //printf("Angle: %f, q: %d, mod: %f\n", angle, quarter, modphase); |
igorsk | 0:2a5dccfd318f | 85 | float x, temp; |
igorsk | 0:2a5dccfd318f | 86 | switch (quarter) |
igorsk | 0:2a5dccfd318f | 87 | { |
igorsk | 0:2a5dccfd318f | 88 | case 0: |
igorsk | 0:2a5dccfd318f | 89 | // First quarter, angle = 0 .. pi/2 |
igorsk | 0:2a5dccfd318f | 90 | x = modphase - 0.5f; // 1 sub |
igorsk | 0:2a5dccfd318f | 91 | temp = (2 - 4*M_C)*x*x + M_C; // 2 mul, 1 add |
igorsk | 0:2a5dccfd318f | 92 | *sinx = temp + x; // 1 add |
igorsk | 0:2a5dccfd318f | 93 | *cosx = temp - x; // 1 sub |
igorsk | 0:2a5dccfd318f | 94 | break; |
igorsk | 0:2a5dccfd318f | 95 | case 1: |
igorsk | 0:2a5dccfd318f | 96 | // Second quarter, angle = pi/2 .. pi |
igorsk | 0:2a5dccfd318f | 97 | x = 0.5f - modphase; // 1 sub |
igorsk | 0:2a5dccfd318f | 98 | temp = (2 - 4*M_C)*x*x + M_C; // 2 mul, 1 add |
igorsk | 0:2a5dccfd318f | 99 | *sinx = x + temp; // 1 add |
igorsk | 0:2a5dccfd318f | 100 | *cosx = x - temp; // 1 sub |
igorsk | 0:2a5dccfd318f | 101 | break; |
igorsk | 0:2a5dccfd318f | 102 | case 2: |
igorsk | 0:2a5dccfd318f | 103 | // Third quarter, angle = pi .. 1.5pi |
igorsk | 0:2a5dccfd318f | 104 | x = modphase - 0.5f; // 1 sub |
igorsk | 0:2a5dccfd318f | 105 | temp = (4*M_C - 2)*x*x - M_C; // 2 mul, 1 sub |
igorsk | 0:2a5dccfd318f | 106 | *sinx = temp - x; // 1 sub |
igorsk | 0:2a5dccfd318f | 107 | *cosx = temp + x; // 1 add |
igorsk | 0:2a5dccfd318f | 108 | break; |
igorsk | 0:2a5dccfd318f | 109 | case 3: |
igorsk | 0:2a5dccfd318f | 110 | // Fourth quarter, angle = 1.5pi..2pi |
igorsk | 0:2a5dccfd318f | 111 | x = modphase - 0.5f; // 1 sub |
igorsk | 0:2a5dccfd318f | 112 | temp = (2 - 4*M_C)*x*x + M_C; // 2 mul, 1 add |
igorsk | 0:2a5dccfd318f | 113 | *sinx = x - temp; // 1 sub |
igorsk | 0:2a5dccfd318f | 114 | *cosx = x + temp; // 1 add |
igorsk | 0:2a5dccfd318f | 115 | break; |
igorsk | 0:2a5dccfd318f | 116 | } |
igorsk | 0:2a5dccfd318f | 117 | } |
igorsk | 0:2a5dccfd318f | 118 | |
igorsk | 0:2a5dccfd318f | 119 | #else // FASTSINCOS |
igorsk | 0:2a5dccfd318f | 120 | |
igorsk | 0:2a5dccfd318f | 121 | void sincosf(float angle, float *sinx, float *cosx) |
igorsk | 0:2a5dccfd318f | 122 | { |
igorsk | 0:2a5dccfd318f | 123 | *sinx = sin(angle); |
igorsk | 0:2a5dccfd318f | 124 | *cosx = cos(angle); |
igorsk | 0:2a5dccfd318f | 125 | } |
igorsk | 0:2a5dccfd318f | 126 | |
igorsk | 0:2a5dccfd318f | 127 | #endif // FASTSINCOS |
igorsk | 0:2a5dccfd318f | 128 | |
igorsk | 0:2a5dccfd318f | 129 | |
igorsk | 0:2a5dccfd318f | 130 | void rotate3d(int *x, int *y, int *z, float anglex, float angley, float anglez, int count) |
igorsk | 0:2a5dccfd318f | 131 | { |
igorsk | 0:2a5dccfd318f | 132 | float sinx, cosx, siny, cosy, sinz, cosz; |
igorsk | 0:2a5dccfd318f | 133 | sincosf(anglex, &sinx, &cosx); |
igorsk | 0:2a5dccfd318f | 134 | sincosf(angley, &siny, &cosy); |
igorsk | 0:2a5dccfd318f | 135 | sincosf(anglez, &sinz, &cosz); |
igorsk | 0:2a5dccfd318f | 136 | |
igorsk | 0:2a5dccfd318f | 137 | for ( int i=0; i < count; i++) |
igorsk | 0:2a5dccfd318f | 138 | { |
igorsk | 0:2a5dccfd318f | 139 | int x1 = x[i]; |
igorsk | 0:2a5dccfd318f | 140 | int y1 = y[i]; |
igorsk | 0:2a5dccfd318f | 141 | int z1 = z[i]; |
igorsk | 0:2a5dccfd318f | 142 | |
igorsk | 0:2a5dccfd318f | 143 | int y2 = cosx * y1 - sinx * z1; |
igorsk | 0:2a5dccfd318f | 144 | int z2 = sinx * y1 + cosx * z1; |
igorsk | 0:2a5dccfd318f | 145 | |
igorsk | 0:2a5dccfd318f | 146 | int x2 = cosy * x1 + siny * z2; |
igorsk | 0:2a5dccfd318f | 147 | int z3 = -siny * x1 + cosy * z2; |
igorsk | 0:2a5dccfd318f | 148 | |
igorsk | 0:2a5dccfd318f | 149 | int x3 = cosz * x2 - sinz * y2; |
igorsk | 0:2a5dccfd318f | 150 | int y3 = sinz * x2 + cosz * y2; |
igorsk | 0:2a5dccfd318f | 151 | |
igorsk | 0:2a5dccfd318f | 152 | x[i] = x3; |
igorsk | 0:2a5dccfd318f | 153 | y[i] = y3; |
igorsk | 0:2a5dccfd318f | 154 | z[i] = z3; |
igorsk | 0:2a5dccfd318f | 155 | } |
igorsk | 0:2a5dccfd318f | 156 | } |