Skip to content

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
#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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.