//------------------------------------------------------------------------ /// Renders the collide model triangle soup. void TerrainCollisionShape::visualize(Details::OgreOpcodeDebugger* activeDebugger) { mActiveDebugger = activeDebugger; assert(mVertexBuf); // render the triangle soup int i, k; k = 0; for (i = 0; i < mVerticesPerRow * mVerticesPerRow * 3; i += 9) { float v0 = mVertexBuf[i + 0]; float v1 = mVertexBuf[i + 1]; float v2 = mVertexBuf[i + 2]; float v3 = mVertexBuf[i + 3]; float v4 = mVertexBuf[i + 4]; float v5 = mVertexBuf[i + 5]; float v6 = mVertexBuf[i + 6]; float v7 = mVertexBuf[i + 7]; float v8 = mVertexBuf[i + 8]; const Matrix4 &m = getFullTransform(); Vector3 vect0(v0, v1, v2); Vector3 vect1(v3, v4, v5); Vector3 vect2(v6, v7, v8); vect0 = m * vect0; vect1 = m * vect1; vect2 = m * vect2; mActiveDebugger->addShapeLine(vect0.x, vect0.y, vect0.z, vect1.x, vect1.y, vect1.z); mActiveDebugger->addShapeLine(vect1.x, vect1.y, vect1.z, vect2.x, vect2.y, vect2.z); mActiveDebugger->addShapeLine(vect2.x, vect2.y, vect2.z, vect0.x, vect0.y, vect0.z); } }
void BigIntegerStrassen::FastFourierTransform(vcomp &vect, bool invert){ //static long double PI = 3.14159265358979323846; static long double PI = 3.14159265358979323846264338327950288419716939937510L; ll n = (ll)vect.size(); if (n == 1) return; vcomp vect0(n / 2), vect1(n / 2); for (ll i = 0, j = 0; i<n; i += 2, ++j){ vect0[j] = vect[i]; vect1[j] = vect[i + 1]; } FastFourierTransform(vect0, invert); FastFourierTransform(vect1, invert); long double ang = 2 * PI / n * (invert ? -1 : 1); std::complex<long double> w(1), wn(cos(ang), sin(ang)); for (ll i = 0; i < n / 2; ++i) { vect[i] = vect0[i] + w * vect1[i]; vect[i + n / 2] = vect0[i] - w * vect1[i]; if (invert){ vect[i] /= 2; vect[i + n / 2] /= 2; } w *= wn; } }
const float TripleProduct( const Vertex& v0, const Vertex& v1, const Vertex& v2 ) { Vect vect0( v0.x, v0.y, v0.z ); Vect vect1( v1.x, v1.y, v1.z ); Vect vect2( v2.x, v2.y, v2.z ); Vect a = vect2 - vect0; Vect b = vect1 - vect0; Vect normal( v0.nx, v0.ny, v0.nz ); return a.cross( b ).dot( normal ); }