Instantly share code, notes, and snippets.

dharmatech/pse example 4.7 the end of the ski jump.cpp Created Dec 3, 2012

What would you like to do?
 #include "stdafx.h" #include "..\..\include\symbolicc++.h" Symbolic Pi = "Pi"; Symbolic g = "g"; Symbolic Radians(Symbolic n) { return n * Pi / 180; } Symbolic Degrees(Symbolic n) { return 180 * n / Pi; } class Point { public: Symbolic x; Symbolic y; Point() { x = "NOTSET" ; y = "NOTSET"; } Point(Symbolic x_val, Symbolic y_val) { x = x_val; y = y_val; } void Print() { cout << "Point(" << x << ", " << y << ")"; } static Point FromAngle(Symbolic angle, Symbolic mag) { return Point(cos(angle) * mag, sin(angle) * mag); } Point operator+(Point p) { return Point(x + p.x, y + p.y); } Point operator*(Symbolic sym) { return Point(x * sym, y * sym); } Point operator/(Symbolic sym) { return Point(x / sym, y / sym); } Symbolic Norm() { return sqrt(x*x + y*y); } }; void Unset(Symbolic &sym) { sym = "NOTSET"; } bool IsSet(Symbolic sym) { if (sym == "NOTSET") return false; else return true; } bool HasVal(Symbolic sym) { if (sym == "NOTSET") return false; else return true; } class Obj { public: Point position, velocity, acceleration; Symbolic time; void Print() { // cout << "Obj:" << endl; cout << "time: " << time << endl; cout << "position.x: " << position.x << endl; cout << "position.y: " << position.y << endl; cout << "velocity.x: " << velocity.x << endl; cout << "velocity.y: " << velocity.y << endl; cout << "acceleration.x: " << acceleration.x << endl; cout << "acceleration.y: " << acceleration.y << endl; } Obj AtTime(Symbolic t) { Obj obj; obj.time = t; auto dt = t - time; obj.acceleration = acceleration; obj.velocity = velocity + acceleration * dt; obj.position = position + velocity * dt + acceleration * dt * dt / 2; return obj; } }; Symbolic CalcTime(Obj& a, Obj& b, int flag=0) { if (HasVal(b.velocity.x) && HasVal(a.velocity.x) && HasVal(a.acceleration.x) && a.acceleration.x != 0.0 && a.acceleration.x != 0) return (b.velocity.x - a.velocity.x) / a.acceleration.x; if (HasVal(b.velocity.y) && HasVal(a.velocity.y) && HasVal(a.acceleration.y) && a.acceleration.y != 0.0 && a.acceleration.y != 0) return (b.velocity.y - a.velocity.y) / a.acceleration.y; if (HasVal(a.position.x) && HasVal(b.position.x) && HasVal(a.velocity.x) && a.velocity.x != 0 && a.velocity.x != 0.0) return (b.position.x - a.position.x) / a.velocity.x; if (HasVal(b.position.x) && HasVal(a.position.x) && HasVal(a.velocity.x) && HasVal(a.acceleration.x) && a.acceleration.x != 0 && a.acceleration.x != 0.0) { if (flag == 0) return (-a.velocity.x + sqrt(pow(a.velocity.x, Symbolic(2)) - 2 * a.acceleration.x * (a.position.x - b.position.x))) / a.acceleration.x; else return (-a.velocity.x - sqrt(pow(a.velocity.x, Symbolic(2)) - 2 * a.acceleration.x * (a.position.x - b.position.x))) / a.acceleration.x; } if (HasVal(a.position.y) && HasVal(b.position.y) && HasVal(a.velocity.y) && HasVal(a.acceleration.y) && a.acceleration.y != 0 && a.acceleration.y != 0.0) { if (flag == 0) return (-a.velocity.y + sqrt(pow(a.velocity.y, Symbolic(2)) - 2 * a.acceleration.y * (a.position.y - b.position.y))) / a.acceleration.y; else return (-a.velocity.y - sqrt(pow(a.velocity.y, Symbolic(2)) - 2 * a.acceleration.y * (a.position.y - b.position.y))) / a.acceleration.y; } throw "exception"; } auto _g = Point(0, -g); int _tmain(int argc, _TCHAR* argv[]) { // A ski jumper leaves the ski track moving in the horizontal direction // with a speed of 25.0 m/s, as shown in Figure 4.14. // The landing incline below him falls off with a slope of 35.0°. // Where does he land on the incline? { Obj objA; Obj objB; auto xB = Symbolic("xB"); auto yB = Symbolic("yB"); auto th = Radians(35)[Pi == 3.14159]; objA.time = 0; objA.position.x = 0; objA.position.y = 0; objA.velocity.x = 25; objA.velocity.y = 0; _g = Point(0, -9.8); objA.acceleration = _g; /* tan(th) = (yA - yB) / xB yA = 0 tan(th) = (0 - yB) / xB tan(th) = - yB / xB yB = - xB tan(th) */ objB.position.y = - xB * tan(th); objB.velocity.x = objA.velocity.x; objB.acceleration = _g; auto timeB = CalcTime(objA, objB, 1); cout << "time at B: " << timeB << endl; objB = objA.AtTime(timeB); cout << "xB = " << objB.position.x << " (1)" << endl; cout << "yB = " << objB.position.y << " (2)" << endl; cout << endl; /* xB = 9.45051 xB^(1/2) xB^2 = 9.45051^2 xB xB = 9.45051^2 */ cout << "solve (1) for xB:" << endl; objB.position.x = (objB.position.x^2) / xB; cout << "xB = " << objB.position.x << " (1.1)" << endl; cout << "replace in yB using (1.1)" << endl; objB.position.y = objB.position.y[xB == objB.position.x]; cout << "yB = " << objB.position.y << endl; cout << "Determine how long the jumper is airborne" << endl; timeB = timeB[xB == objB.position.x]; cout << timeB << endl; cout << "vertical component of velocity just before he lands:" << endl; cout << objA.AtTime(timeB).velocity.y << endl; } system("pause"); return 0; }