Instantly share code, notes, and snippets.

# dharmatech/pse problem 4.9.cpp Created Dec 6, 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); } double ToAngle() { return atan2(y, x); } }; 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"; } Symbolic CalcInitialVelocityX(Obj& a, Obj& b) { if (HasVal(a.position.x) && HasVal(a.position.y) && HasVal(a.time) && HasVal(b.time) && HasVal(a.acceleration.x)) { auto dt = b.time - a.time; return (b.position.x - a.position.x - a.acceleration.x * dt^2 / 2) / dt; } throw "exception"; } auto _g = Point(0, -g); int _tmain(int argc, _TCHAR* argv[]) { // In a local bar, a customer slides an empty beer mug // down the counter for a refill. The bartender is // momentarily distracted and does not see the mug, which slides // off the counter and strikes the floor 1.40 m from the // base of the counter. If the height of the counter is // 0.860 m, (a) with what velocity did the mug leave the // counter and (b) what was the direction of the mug’s // velocity just before it hit the floor? { Obj objA; Obj objB; objA.time = 0; objA.position.x = 0; objA.position.y = 0.86; objA.velocity.y = 0; _g = Point(0, -9.8); objA.acceleration = _g; objB.position.x = 1.4; objB.position.y = 0; objB.acceleration = _g; objB.time = CalcTime(objA, objB, 1); objA.velocity.x = CalcInitialVelocityX(objA, objB); cout << "with what velocity did the mug leave the counter" << endl; objA.velocity.Print(); cout << endl; objB = objA.AtTime(objB.time); cout << "what was the direction of the mug's velocity just before it hit the floor?" << endl; cout << Degrees(objB.velocity.ToAngle())[Pi == 3.14159] << endl; } system("pause"); return 0; }