00001 /* 00002 * Physically Based Simulation, SS 2005 00003 * 00004 * Markus Liechti (liechtim@student.ethz.ch) 00005 * Yoshimi Takano (yoshi@student.ethz.ch) 00006 * Stefan Wismer (swismer@student.ethz.ch) 00007 * 00008 * $Id: bridge.h,v 1.23 2005/06/25 20:00:04 ytakano Exp $ 00009 */ 00010 00013 #ifndef __bridge_H__ 00014 #define __bridge_H__ 00015 00016 #include <vector> 00017 #include <cmath> 00018 #include "structures.h" 00019 #include "smoke.h" 00020 #include "puff.h" 00021 00023 #define DAMPING 4000.0 00024 00026 #define DAMPING_SQUARE 3000.0 00027 00029 #define GRAVITY 9.81 00030 00032 #define EDGE_DENSITY 1200.0 00033 00035 #define EDGE_STIFFNESS 10000000.0 00036 00038 #define EDGE_TENSION_THRESHOLD 0.038 00039 00041 #define EDGE_PRESSURE_THRESHOLD -0.050 00042 00043 using namespace std; 00044 00048 class Bridge { 00049 public: 00051 vector<vertex> vertices; 00052 00054 vector<edge> edges; 00055 00057 Puff puff; 00058 00059 /* 00060 * static methods 00061 */ 00062 00070 void optimize(int level); 00071 00078 int getNearestVertex(vector2 &pos); 00079 00085 int getNearestEdge(vector2 &pos); 00086 00092 bool getRoad(); 00093 00102 int addVertex(int x, int y); 00103 00111 int addVertex(vertex v); 00112 00120 int addEdge(int start, int end); 00121 00128 void deleteVertex(int index); 00129 00136 void deleteEdge(int index); 00137 00139 void clear(); 00140 00145 vector2 &getStart(int index); 00146 00151 vector2 &getEnd(int index); 00152 00157 vector<int> road; 00158 00160 int roadStartVertex; 00161 00163 int roadEndVertex; 00164 00165 /* 00166 * dynamic methods 00167 */ 00168 00173 void setExternalForces(vector<vertex> &v); 00174 00183 void addInternalForces(vector<vertex> &v, vector<edge> &e, component stiffness, bool breakableEdges); 00184 00185 public: 00186 00191 void initializePhysics(); 00192 00197 void doPhysics(component timestep); 00198 00199 }; 00200 00201 #endif