fork(1) download
  1. /*
  2. 984 :デフォルトの名無しさん:2013/10/16(水) 13:06:20.87
  3. 1 授業単元 プログラミング
  4. 2 問題 高さh、質量m、初速度vを入力して、物体の軌跡を計算し、グラフを描画(SVGファイルを出力)する。
  5. 例:
  6. 高さ30mの位置から質量1.0kgの球を鉛直下向きに4.9m/sで投げ下ろした。
  7.  
  8. 高さ=30
  9. 質量=1
  10. 初速度=4.9
  11. グラフをSVGファイルに出力
  12.  
  13. 3 windows8
  14. 4期限 10月21日まで
  15. 誰かお願いします。
  16. */
  17.  
  18. #include <iostream>
  19. #include <fstream>
  20. #include <cmath>
  21.  
  22. // 出力ファイル
  23. static const char* outFileName = "output.svg";
  24.  
  25. // 重力加速度
  26. static const double g = 9.8;
  27.  
  28. // 一秒間あたりに打つ点の数
  29. static const int samplesPerSec = 8;
  30.  
  31. // 描画幅
  32. static const int graphWidth = 2000;
  33. static const int graphHeight = 1200;
  34.  
  35. class CalcPoint {
  36. public:
  37. double h0;
  38. double m;
  39. double v0;
  40.  
  41. void inputFromConsole(){
  42. using std::cout;
  43. using std::cin;
  44.  
  45. cout << "高さ(m)="; cin >> h0;
  46. cout << "質量(kg)="; cin >> m;
  47. cout << "初速度(m/s)="; cin >> v0;
  48. }
  49.  
  50. // 下向きを正、h0を0とする時のy
  51. double getY(double t){
  52. return ((v0 * t) + ((double)1/2)*g*t*t);
  53. }
  54.  
  55. // 落下までの時間
  56. double getTimeToFall(){
  57. return ( std::sqrt(v0*v0 + 2*g*h0) - v0 ) / g;
  58. }
  59. };
  60.  
  61. class SVGOutput {
  62. private:
  63. std::ofstream out;
  64. public:
  65. SVGOutput(const char* filename): out(filename) {}
  66.  
  67. void putHeader(){
  68. out <<
  69. "<?xml version='1.0' standalone='no'?>\n"
  70. "<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN'\n"
  71. " 'http://w...content-available-to-author-only...3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>\n"
  72. "<svg xmlns='http://w...content-available-to-author-only...3.org/2000/svg' version='1.1'>\n"
  73. "<svg width='90%' height='90%' x='5%' y='5%'>\n";
  74. }
  75.  
  76. void circleStart() { out << "<g fill='black'>\n"; }
  77.  
  78. void circlePut(int x, int y, int r){
  79. out << "<circle cx='" << x << "' cy='" << y << "' r='" << r << "' />\n";
  80. }
  81.  
  82. void circleEnd(){ out << "</g>\n"; }
  83. void putFooter(){ out << "</svg>\n</svg>\n"; }
  84. };
  85.  
  86. // double値 -> int座標 変換
  87. class ToDot {
  88. public:
  89. double factor;
  90. ToDot( int dots, double max ){
  91. factor = dots / std::ceil(max);
  92. }
  93. int operator() (double actual){ return factor * actual; }
  94. };
  95.  
  96. int main(){
  97. CalcPoint calc;
  98.  
  99. // 入力
  100. calc.inputFromConsole();
  101.  
  102. // 変換
  103. double timeFall = calc.getTimeToFall();
  104. ToDot toDotX( graphWidth, timeFall);
  105. ToDot toDotY( graphHeight, calc.h0);
  106.  
  107. {
  108. // SVG出力
  109. SVGOutput svg(outFileName);
  110.  
  111. double ps = (double)1/samplesPerSec;
  112. int last = ((double)samplesPerSec) * timeFall;
  113.  
  114. int r = 5;
  115.  
  116. svg.putHeader();
  117. svg.circleStart();
  118.  
  119. // 座標の計算と出力
  120. for( int i = 0; i <= last; i++ ){
  121. double t = ((double)i)*ps;
  122. svg.circlePut( toDotX(t), toDotY( calc.getY(t) ), r );
  123. }
  124.  
  125. svg.circlePut( toDotX(timeFall), toDotY( calc.getY(timeFall) ), r );
  126.  
  127. svg.circleEnd();
  128. svg.putFooter();
  129. }
  130.  
  131. return 0;
  132. }
  133.  
Success #stdin #stdout 0s 2868KB
stdin
30
1
4.9
stdout
高さ(m)=質量(kg)=初速度(m/s)=