###質問内容&考察
エラー内容を教えてください。
まず、58行目ですがPoint
クラスでvoid qij_rotate(double theta)
を作っているのにそんなのないと言われる。
76行目も58行目と同じです。
88行目はri
はすぐ上で定義しているのにそんなのないと言われる。
いずれもRectangle bounding_rectangle(std::vector<Point>& points)
関数内です。
###問題点
エラー
kadai31.cpp: In function 'Rectangle bounding_rectangle(std::vector<Point>&)': kadai31.cpp:58:20: error: 'class std::vector<Point>' has no member named 'qij_rotate' 58 | points.qij_rotate(-qij); //pij ^~~~~~~~~~ kadai31.cpp:76:20: error: 'class std::vector<Point>' has no member named 'qij_rotate' 76 | points.qij_rotate(qij); //rijij ^~~~~~~~~~ kadai31.cpp:88:14: error: 'ri' was not declared in this scope; did you mean 'r'? 88 | return r[ri]; | ^~ |
###コード
C++
1//最小包囲長方形 2 3#include<iostream> 4#include<cmath> 5#include<vector> 6 7//x座標,y座標を表すクラス 8struct Point 9{ 10 double x; 11 double y; 12 13 //原点を中心に反時計回りにθだけ回転させるメンバ関数 14 void qij_rotate(double theta){ 15 double dx=x; //x座標が変わらないように置いておく 16 x=dx*cos(theta)-y*sin(theta); 17 y=dx*sin(theta)+y*cos(theta); //点(x,y)を原点を中心にθだけ回転させると(xcosθ-ysinθ,xsinθ+ycosθ)となる 18 } 19}; 20 21//長方形を表現するクラス 22struct Rectangle 23{ 24 Point lower_left_corner; //長方形の左下の頂点を表す 25 double width; //長方形の幅を表す 26 double height; //長方形の高さを表す 27 double angle; //長方形の傾いている角度を表す 28 29 //長方形を原点を中心に反時計回りにθだけ回転させるメンバ関数 30 void rotate(double theta) 31 { 32 Point d; 33 d.x=lower_left_corner.x; //x座標が変わらないように置いておく 34 lower_left_corner.x=d.x*cos(theta)-lower_left_corner.y*sin(theta); 35 lower_left_corner.y=d.x*sin(theta)+lower_left_corner.y*cos(theta); 36 angle+=theta; 37 } 38}; 39 40//点集合の包囲長方形を計算する関数 41Rectangle bounding_rectangle(std::vector<Point>& points) 42{ 43 int i,j; 44 int n=points.size(); 45 Point min,max; 46 min.x=points[0].x; 47 max.x=points[0].x; 48 min.y=points[0].y; 49 max.y=points[0].y; 50 std::vector<double> area; //面積の配列 51 std::vector<Rectangle> r; //長方形の配列 52 for(i=0;i<n-1;i++){ 53 for(j=i+1;j<n;j++){ 54 double qij=std::atan2(points[j].y-points[i].y,points[j].x-points[i].x); //x軸の正の方向と線分pipjのなす角度を計算する 55 points.qij_rotate(-qij); //pのすべての点を原点を中心に-qij回転させる 56 //軸平行な最小包囲長方形を求める 57 if(points[i].x<min.x){ 58 min.x=points[i].x; 59 } 60 if(points[i].x<max.x){ 61 max.x=points[i].x; 62 } 63 if(points[i].y<min.y){ 64 min.y=points[i].y; 65 } 66 if(points[i].y>max.y){ 67 max.y=points[i].y; 68 } 69 Rectangle rij; 70 rij.height=max.y-min.y; //高さ 71 rij.width=max.x-min.x; //幅 72 r.push_back(rij); 73 points.qij_rotate(qij); //rijを原点を中心にqij回転させる 74 double areas=rij.height*rij.width; //rijの面積 75 area.push_back(areas); 76 } 77 } 78 double min_area=area[0]; 79 for(i=0;i<n;i++){ 80 if(min_area>area[i]){ 81 min_area=area[i]; 82 int ri=i; 83 } 84 } 85 return r[ri]; 86 87} 88 89int main() 90{ 91 int n; //個数 92 int i; 93 std::cout<<"点の個数を入力してください(n>=3)\n"; 94 std::cin>>n; 95 96 std::vector<Point> pts; 97 pts.resize(n); 98 std::cout<<"点の座標を入力してください\n"; 99 for(Point& p:pts){ 100 std::cin>>p.x>>p.y; 101 } 102 103 Rectangle rij=bounding_rectangle(pts); 104 std::cout<<"最小包囲長方形の幅は"<<rij.width<<"高さは"<<rij.height; 105 106 return 0; 107 108 109}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/10 10:39