質問: ### 実現したいこと ポアソンディスクサンプリングのプログラムを作りたい `std::vector poisson_disk_sampling(int n,double r,std::mt19937& random)`関数の中で 1. 単位正方形の中に、ランダムに1点pを発生させる 2. pと既に得られた各生成点との距離の最小値を計算する 3. 最小距離が2r未満なら、ステップ1に戻ってやり直す。最小距離が2r以上なら、pを新たに生成点として加える という過程を踏んで作りたです。 ### 問題点 下記のようなエラーがでてきました。 `invalid declarator before 'poi'`を検索してみたのですが出てこずこのエラーの意味がわかりません。 また、pと既に得られた各生成点との距離の最小値を計算するの部分があっているかどうか自信がありません。 **エラー** ``` kadai36.cpp: In function 'std::vector poisson_disk_sampling(int, double, std::mt19937&)': kadai36.cpp:45:24: error: invalid declarator before 'poi' 45 | std::vector poi; // ^~~ kadai36.cpp:56:35: error: array must be initialized with a brace-enclosed initializer 56 | double dis[j]=distance(p[i],p[j]); | ~~~~~~~~^~~~~~~~~~~ kadai36.cpp:65:9: error: 'poi' was not declared in this scope; did you mean 'pow'? 65 | poi.push_back(p); | ^~~ | pow kadai36.cpp:68:12: error: 'poi' was not declared in this scope; did you mean 'pow'? 68 | return poi; | ^~~ | pow ``` ### コード ``` #include #include #include #include struct Point { double x; //x座標 double y; //y座標 void output() { std::cout<<"("<& points) { int n=points.size(); int i; for(i=0;i poisson_disk_sampling(int n,double r,std::mt19937& random) { int i,j; double dis[n],min; Point p[n]; int std::vector poi; //生成点の集合 for(i=0;idis[j]){ min=dis[j]; } } }while(min<2*r); //最小距離が2r未満なら、ステップ1に戻ってやり直す。 //最小距離が2r以上なら、pを新たに生成点として加える poi.push_back(p); } return poi; } int main(int argc,char* argv[]) { int i; unsigned int seed_val; if(argc>=2){ seed_val=std::atoi(argv[1]); }else{ std::random_device seeder; seed_val=seeder(); } std::mt19937 random; random.seed(seed_val); int n; std::cout<<"何個ですか : "; std::cin>>n; //円の半径を求める double r=sqrt(1/2*sqrt(3)*n)*0.75; std::vector poisson=poisson_disk_sampling(n,r,random); std::cout<<"結果の座標は"; output_points(poisson); return 0; } ```
回答: > > double dis[n],min; > > Point p[n]; > > > こんなこと(引数値nを用いた配列の定義)はできない.