Skip to content

Instantly share code, notes, and snippets.

@dharmatech
Created December 6, 2012 19:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dharmatech/4227594 to your computer and use it in GitHub Desktop.
Save dharmatech/4227594 to your computer and use it in GitHub Desktop.
#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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment