###実現したいこと
球と点の交差判定のプログラムを作っています。
入力用の演算子
std::istream& operator>>(std::istream& in,Sphere& s)
を用いて、sphere s
にの中心の座標,球Sの半径,点pの座標の順番で入力したいです。
###問題点
エラーがでました。
kadai22.cpp: In function 'std::istream& operator>>(std::istream&, Sphere&)': kadai22.cpp:45:55: error: 'p' was not declared in this scope 45 | in>>s.center.x>>s.center.y>>s.center.z>>s.radius>>p.x>>p.y>>p.z; | ^ kadai22.cpp: In function 'int main()': kadai22.cpp:55:19: error: 'p' was not declared in this scope 55 | if(s.contains(p)){ |
エラー内容は多分
・45の方はSphereメンバの中でpが定義されていない
・55の方はmain関数内でpが定義されていない
だと思います。
ではこれをどう直すのかと考えると
・sphereメンバの中ではpはbool関数のところで定義されています。→これではいけないのでしょうか?いけない場合どうすればいいのでしょうか?
・入力用の演算子
std::istream& operator>>(std::istream& in,Sphere& s)
によってこの中でpという定義がなされると思ったのですが違うみたいです。pはどこでどう定義すればいいのでしょうか?
###コード
C++
1//球と点の交差判定 2 3#include<iostream> 4#include<cmath> 5 6//3次元空間内の点を表現するクラス 7struct Point3 8{ 9 double x; //x座標 10 double y; //y座標 11 double z; //z座標 12}; 13 14//2点間の距離を求める 15double distance(Point3 a,Point3 b) 16{ 17 double d=std::sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)); 18 return d; 19} 20 21//球を表現するクラス 22struct Sphere 23{ 24 Point3 center; //球の中心 25 double radius; //球の半径 26 27 //点pが球の内部・球面上に含まれるか判定するメンバ関数 28 bool contains(Point3 p) 29 { 30 double d=distance(center,p); 31 if(d<=radius){ 32 return true; 33 }else{ 34 return false; 35 } 36 } 37}; 38 39//sphereに対する入力用の演算子 40std::istream& operator>>(std::istream& in,Sphere& s) 41{ 42 in>>s.center.x>>s.center.y>>s.center.z>>s.radius>>s.p.x>>s.p.y>>s.p.z; 43 return in; 44} 45 46int main() 47{ 48 Sphere s; 49 std::cout<<"球Sの中心座標,球Sの半径,点pの座標を入力してください\n "; 50 std::cin>>s; 51 52 if(s.contains(p)){ 53 std::cout<<"点pは球の内部または球面にある\n"; 54 }else{ 55 std::cout<<"点pは球の外部にある\n"; 56 } 57 58 return 0; 59}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。