Advertisement
Guest User

Untitled

a guest
Oct 30th, 2014
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define DT 0.1 // timestep
  5.  
  6. typedef struct {
  7. double r;
  8. double px, py, mx, my;
  9. double vpx, vpy, vmx, vmy, theta, alpha, vpr, vpth, vmr, vmth;
  10. } state;
  11.  
  12. void update(state *s, double apx, double apy);
  13. void printState(state *s);
  14.  
  15. int main(void) {
  16. state s;
  17. s.vpx=0;
  18. s.vpy=0;
  19. s.vmx=0;
  20. s.vmy=0;
  21. s.px=0;
  22. s.py=0;
  23. s.r = 10;
  24. s.mx = s.px + s.r;
  25. s.my = 0;
  26. int ii;
  27. printState(&s);
  28. for(ii=0; ii<200; ii++) {
  29. update(&s, 0, 0.5); // accelerate straight up
  30. printState(&s);
  31. }
  32. return 0;
  33. }
  34.  
  35. void update(state *s, double apx, double apy) {
  36. // compute angle of rod:
  37. double dx, dy, v1, v2;
  38. dx = s->mx - s->px;
  39. dy = s->my - s->py;
  40. double theta = atan2(dy, dx);
  41. printf("theta = %.4fn", theta);
  42.  
  43. // update velocity of p:
  44. v1 = s->vpx;
  45. v2 = s->vpx += apx * DT;
  46. s->px += 0.5*(v1 + v2) * DT;
  47. v1 = s->vpy;
  48. v2 = s->vpy += apy * DT;
  49. s->py += 0.5 * (v1+v2) * DT;
  50.  
  51.  
  52.  
  53. // components of velocity along and perpendicular to rod:
  54. s->vpr = s->vpx * cos(theta) + s->vpy * sin(theta);
  55. s->vpth = -s->vpx * sin(theta) + s->vpy * cos(theta);
  56. s->vmr = s->vpr;
  57.  
  58. // update velocities:
  59. s->vmx = s->vmr * cos(theta) - s->vmth * sin(theta);
  60. s->vmy = s->vmr * sin(theta) + s->vmth * cos(theta);
  61. s->vmth = -s->vmx * sin(theta) + s->vmy * cos(theta);
  62.  
  63. // and positions
  64. s->mx += s->vmx * DT;
  65. s->my += s->vmy * DT;
  66.  
  67. // impose constraint of constant rod length...
  68. dx = s->mx - s->px;
  69. dy = s->my - s->py;
  70. theta = atan2(dy, dx);
  71. double stretch = s->r / sqrt(dx*dx + dy * dy);
  72. s->mx = s->px + dx * stretch;
  73. s->my = s->py + dy * stretch;
  74. s->theta = theta;
  75. }
  76.  
  77. void printState(state *s) {
  78. printf("px = %5.2f; py = %5.2f; mx = %5.2f; my = %5.2fn", s->px, s->py, s->mx, s->my);
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement