|
Scientific Visualization and Animation of Trajectories
|
|
Prof. David Bernstein |
| Computer Science Department |
| bernstdh@jmu.edu |
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "../sva/sva.h" // Must be after windows.h
#include "GL/gl.h"
/**
* An application that displays a trajectory, [x(t), y(t)],
* againts time using a static visualization.
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
// Global Variables
//
// Note: Many variables must be global because the display()
// callback doesn't (and can't easily) have parameters
//
float *x;
float *y;
float *t;
float min[3], max[3];
float deltat, tFirst, tLast;
int steps; // Number of times in [tFirst, tLast)
// Empty Functions Required by the SVA Library
//
void onMouseClick(int button, int state, GLfloat x, GLfloat y){}
void onMouseDrag(GLfloat x, GLfloat y){}
void onMouseMove(GLfloat x, GLfloat y){}
void onTimer(int value){}
/**
* The display callback
*/
void onDisplay()
{
char label[80];
glLineWidth(2);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
{
for (int i=0; i<=steps; i++)
{
glVertex3f(x[i], y[i], t[i]);
}
}
glEnd();
}
/**
* Evaluate [x(t), y(t)] for the specified
* values of t in [tFirst, tLast]
*
* Note: This function changes the global arrays x, y, and z
*/
void evaluate()
{
float temp;
temp = 0.;
for (int i=0; i<=steps; i++)
{
t[i] = temp;
x[i] = cos(3 * t[i]);
y[i] = sin(5 * t[i]);
temp += deltat;
}
}
/**
* Find the maximum and minimum of x, y, and z
*
* Note: This function changes the global arrays min and max
*/
void findExtrema()
{
max[0] = min[0] = x[0];
max[1] = min[1] = y[0];
max[2] = min[2] = t[0];
for (int i=1; i<=steps; i++)
{
if (x[i] > max[0]) max[0] = x[i];
if (y[i] > max[1]) max[1] = y[i];
if (t[i] > max[2]) max[2] = t[i];
if (x[i] < min[0]) min[0] = x[i];
if (y[i] < min[1]) min[1] = y[i];
if (t[i] < min[2]) min[2] = t[i];
}
}
/**
* The entry point of the application.
*
* @param argc The number of command line arguments
* @param argv The array of command line arguments
* @return A status code
*/
int main(int argc, char **argv)
{
// Note: We specify steps rather than deltat because of
// inaccuracies in floating point numbers that cause
// problems with functions like ceil()
tFirst = 0.0;
tLast = 6.28;
steps = 2000;
deltat = (tLast - tFirst) / (float)steps;
x = new float[steps+1];
y = new float[steps+1];
t = new float[steps+1];
// Evaluate the function at all times in the trajectory
evaluate();
findExtrema();
// Create the SVA window
svaCreate(argc, argv, min, max);
svaSetAxesLabels("x", "y", "t");
// Start the visualization
svaStartVisualization();
}
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "../sva/sva.h" // Must be after windows.h
#include "GL/gl.h"
/**
* An application that displays a trajectory, [x(t), y(t), z(t)],
* using a static visualization.
*
* t is represented using both color and symbology
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
// Global Variables
//
// Note: Many variables must be global because the display()
// callback doesn't (and can't easily) have parameters
//
float *x;
float *y;
float *z;
float min[3], max[3];
float deltat, tFirst, tLast;
int steps; // Number of times in [tFirst, tLast)
// Empty Functions Required by the SVA Library
//
void onMouseClick(int button, int state, GLfloat x, GLfloat y){}
void onMouseDrag(GLfloat x, GLfloat y){}
void onMouseMove(GLfloat x, GLfloat y){}
void onTimer(int value){}
/**
* The display callback
*/
void onDisplay()
{
char label[80];
float t = 0.;
glLineWidth(2);
glBegin(GL_POINTS);
{
for (int i=0; i<=steps; i++)
{
// Use color to represent t
glColor3f((float)i/(float)steps, 0.0, 0.0);
glVertex3f(x[i], y[i], z[i]);
t += deltat;
}
}
glEnd();
// Use symbology to represent t
for (int i=0; i<=steps; i++)
{
if ((i % 200) == 0)
{
sprintf(label, "%5.2f", t);
glColor3f((float)i/(float)steps, 0.0, 0.0);
svaDrawString(x[i], y[i], z[i], label);
}
t += deltat;
}
}
/**
* Evaluate [x(t), y(t), z(t)] for the specified
* values of t in [tFirst, tLast]
*
* Note: This function changes the global arrays x, y, and z
*/
void evaluate()
{
float t = 0;
for (int i=0; i<=steps; i++)
{
x[i] = 3 * t;
y[i] = t * t;
z[i] = sin(M_PI * t);
t += deltat;
}
}
/**
* Find the maximum and minimum of x, y, and z
*
* Note: This function changes the global arrays min and max
*/
void findExtrema()
{
max[0] = min[0] = x[0];
max[1] = min[1] = y[0];
max[2] = min[2] = z[0];
for (int i=1; i<=steps; i++)
{
if (x[i] > max[0]) max[0] = x[i];
if (y[i] > max[1]) max[1] = y[i];
if (z[i] > max[2]) max[2] = z[i];
if (x[i] < min[0]) min[0] = x[i];
if (y[i] < min[1]) min[1] = y[i];
if (z[i] < min[2]) min[2] = z[i];
}
}
/**
* The entry point of the application.
*
* @param argc The number of command line arguments
* @param argv The array of command line arguments
* @return A status code
*/
int main(int argc, char **argv)
{
// Note: We specify steps rather than deltat because of
// inaccuracies in floating point numbers that cause
// problems with functions like ceil()
tFirst = 0.0;
tLast = 2.0;
steps = 2000;
deltat = (tLast - tFirst) / (float)steps;
x = new float[steps+1];
y = new float[steps+1];
z = new float[steps+1];
// Evaluate the function at all times in the trajectory
evaluate();
findExtrema();
// Create the SVA window
svaCreate(argc, argv, min, max);
// Start the visualization
svaStartVisualization();
}
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "../sva/sva.h" // Must be after windows.h
#include "GL/gl.h"
/**
* An application that displays a trajectory, [x(t), y(t)],
* using a third-person animation
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
// Global Variables
//
// Note: Many variables must be global because the display()
// callback doesn't (and can't easily) have parameters
//
float currentTime;
float *x;
float *y;
float *t;
float min[3], max[3];
float deltat, tFirst, tLast;
int currentIndex;
int steps; // Number of times in [tFirst, tLast)
// Empty Functions Required by the SVA Library
//
void onMouseClick(int button, int state, GLfloat x, GLfloat y){}
void onMouseDrag(GLfloat x, GLfloat y){}
void onMouseMove(GLfloat x, GLfloat y){}
/**
* The timer callback
*
* @param value The current elapsed animation time (in milliseconds)
*/
void onTimer(int value)
{
if (currentIndex < steps)
{
currentIndex++;
currentTime += deltat;
}
}
/**
* The display callback
*/
void onDisplay()
{
char label[80];
glColor3f(1.0, 0.0, 0.0);
glLineWidth(2);
glBegin(GL_POINTS);
{
for (int i=0; i<=currentIndex; i++)
{
glVertex3f(x[i], y[i], t[i]);
}
}
glEnd();
glColor3f(0.0, 0.0, 1.0);
sprintf(label, "Time: %5.3f", currentTime);
svaDrawLabel(0, 0, label);
}
/**
* Evaluate [x(t), y(t)] for the specified
* values of t in [tFirst, tLast]
*
* Note: This function changes the global arrays x, y, and z
*/
void evaluate()
{
float temp;
temp = 0.;
for (int i=0; i<=steps; i++)
{
t[i] = temp;
x[i] = cos(3 * t[i]);
y[i] = sin(5 * t[i]);
temp += deltat;
}
}
/**
* Find the maximum and minimum of x, y, and t
*
* Note: This function changes the global arrays min and max
*/
void findExtrema()
{
max[0] = min[0] = x[0];
max[1] = min[1] = y[0];
max[2] = min[2] = t[0];
for (int i=1; i<=steps; i++)
{
if (x[i] > max[0]) max[0] = x[i];
if (y[i] > max[1]) max[1] = y[i];
if (t[i] > max[2]) max[2] = t[i];
if (x[i] < min[0]) min[0] = x[i];
if (y[i] < min[1]) min[1] = y[i];
if (t[i] < min[2]) min[2] = t[i];
}
}
/**
* The entry point of the application.
*
* @param argc The number of command line arguments
* @param argv The array of command line arguments
* @return A status code
*/
int main(int argc, char **argv)
{
float animationLength, delayPerStep;
tFirst = 0.0;
tLast = 6.28;
steps = 2000;
deltat = (tLast - tFirst) / (float)steps;
x = new float[steps+1];
y = new float[steps+1];
t = new float[steps+1];
// Evaluate the function at all times in the trajectory
evaluate();
findExtrema();
svaCreate(argc, argv, min, max);
svaSetAxesLabels("x", "y", "t");
animationLength = 10.0; // shortest possible length in seconds
delayPerStep = animationLength / (float)steps;
currentIndex = -1;
currentTime = -deltat;
svaStartAnimation((int)(delayPerStep*1000.)); // in milliseconds
}
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "../sva/sva.h" // Must be after windows.h
#include "GL/gl.h"
/**
* An application that displays a trajectory, [x(t), y(t), z(t)],
* using a third-person animation
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
// Global Variables
//
// Note: Many variables must be global because the display()
// callback doesn't (and can't easily) have parameters
//
float currentTime;
float *x;
float *y;
float *z;
float min[3], max[3];
float deltat, tFirst, tLast;
int currentIndex;
int steps; // Number of times in [tFirst, tLast)
// Empty Functions Required by the SVA Library
//
void onMouseClick(int button, int state, GLfloat x, GLfloat y){}
void onMouseDrag(GLfloat x, GLfloat y){}
void onMouseMove(GLfloat x, GLfloat y){}
/**
* The timer callback
*
* @param value The current elapsed animation time (in milliseconds)
*/
void onTimer(int value)
{
if (currentIndex < steps)
{
currentIndex++;
currentTime += deltat;
}
}
/**
* The display callback
*/
void onDisplay()
{
char label[80];
glColor3f(1.0, 0.0, 0.0);
glLineWidth(2);
glBegin(GL_POINTS);
{
for (int i=0; i<=currentIndex; i++)
{
glVertex3f(x[i], y[i], z[i]);
}
}
glEnd();
glColor3f(0.0, 0.0, 1.0);
sprintf(label, "Time: %5.3f", currentTime);
svaDrawLabel(0, 0, label);
}
/**
* Evaluate [x(t), y(t), z(t)] for the specified
* values of t in [tFirst, tLast]
*
* Note: This function changes the global arrays x, y, and z
*/
void evaluate()
{
float t = 0;
/* Example 1
for (int i=0; i<=steps; i++)
{
x[i] = 3 * t;
y[i] = t * t;
z[i] = sin(M_PI * t);
t += deltat;
}
*/
/* Example 2 */
float a, b, c, d, lambda, mu, theta;
a = 1.0;
b = 0.5;
c = sqrt(4.0*a*b);
d = 0.0;
for (int i=0; i<=steps; i++)
{
theta = 2.0 * M_PI * t;
lambda = 1.0 + d*sin(2*theta);
mu = 1.0 - d*sin(2*theta);
x[i] = lambda*(a*cos(theta + M_PI/4.0) - b*cos(theta + M_PI/4.0));
y[i] = mu* (a*sin(theta + M_PI/4.0) - b*sin(theta + M_PI/4.0));
z[i] = c*sin(2*theta);
t += deltat;
}
}
/**
* Find the maximum and minimum of x, y, and z
*
* Note: This function changes the global arrays min and max
*/
void findExtrema()
{
max[0] = min[0] = x[0];
max[1] = min[1] = y[0];
max[2] = min[2] = z[0];
for (int i=1; i<=steps; i++)
{
if (x[i] > max[0]) max[0] = x[i];
if (y[i] > max[1]) max[1] = y[i];
if (z[i] > max[2]) max[2] = z[i];
if (x[i] < min[0]) min[0] = x[i];
if (y[i] < min[1]) min[1] = y[i];
if (z[i] < min[2]) min[2] = z[i];
}
}
/**
* The entry point of the application.
*
* @param argc The number of command line arguments
* @param argv The array of command line arguments
* @return A status code
*/
int main(int argc, char **argv)
{
float animationLength, delayPerStep;
tFirst = 0.0;
tLast = 2.0;
steps = 2000;
deltat = (tLast - tFirst) / (float)steps;
x = new float[steps+1];
y = new float[steps+1];
z = new float[steps+1];
// Evaluate the function at all times in the trajectory
evaluate();
findExtrema();
svaCreate(argc, argv, min, max);
svaSetAxesLabels("x", "y", "z");
animationLength = 10.0; // shortest possible length in seconds
delayPerStep = animationLength / (float)steps;
currentIndex = -1;
currentTime = -deltat;
svaStartAnimation((int)(delayPerStep*1000.)); // in milliseconds
}