GMVector3D GMViewport::project(const GMVector3D& source, const GMMatrix& projection, const GMMatrix& view, const GMMatrix& world) { GMVector4D result = GMVector4D::Transform(source, world); result = result.transform(view); result = result.transform(projection); result.z = result.z * (maxDepth - minDepth); result /= result.w; GMVector3D finalResult(result.x, result.y, result.z); finalResult.x = x + (1 + finalResult.x) * width / 2; finalResult.y = y + (1 - finalResult.y) * height / 2; finalResult.z = finalResult.z + minDepth; return finalResult; }
double ATCAbstractProfile::mixedInterval(ATCInterpolator2D &interpolator, ATCInterpolator2D &inverseInterpolator, double key, double lvlFrom, double interval) { //Calculate quantity X from initial level using standard interpolator QVector<double> site(1, lvlFrom); QVector<double> result(1); interpolator.interpolate(key, site, result); //Update quantity X for final level using input interval double finalX = interval + result.at(0); //Calculate final level using updated quantity X QVector<double> finalSite(1, finalX); QVector<double> finalResult(1); inverseInterpolator.interpolate(key, finalSite, finalResult); //Return calculated level return finalResult.at(0); }