実現したいこと
ポアソンディスクサンプリングのプログラムを作りたい
std::vector<Point> poisson_disk_sampling(int n,double r,std::mt19937& random)
関数の中で
- 単位正方形の中に、ランダムに1点pを発生させる
- pと既に得られた各生成点との距離の最小値を計算する
- 最小距離が2r未満なら、ステップ1に戻ってやり直す。最小距離が2r以上なら、pを新たに生成点として加える
という過程を踏んで作りたです。
問題点
下記のようなエラーがでてきました。
invalid declarator before 'poi'
を検索してみたのですが出てこずこのエラーの意味がわかりません。
また、pと既に得られた各生成点との距離の最小値を計算するの部分があっているかどうか自信がありません。
エラー
kadai36.cpp: In function 'std::vector<Point> poisson_disk_sampling(int, double, std::mt19937&)':
kadai36.cpp:45:24: error: invalid declarator before 'poi'
45 | std::vector<Point> 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<iostream>
#include<vector>
#include<random>
#include<cmath>
struct Point
{
double x; //x座標
double y; //y座標
void output()
{
std::cout<<"("<<x<<","<<y<<")\n";
}
};
void output_points(std::vector<Point>& points)
{
int n=points.size();
int i;
for(i=0;i<n;i++){
points[i].output();
}
}
//2点間の距離を求める
double distance(Point a,Point b)
{
double d=std::sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
return d;
}
//ポアソンディスサンプリングにより、単位正方形の中にn個の点を生成する関数
std::vector<Point> poisson_disk_sampling(int n,double r,std::mt19937& random)
{
int i,j;
double dis[n],min;
Point p[n];
int
std::vector<Point> poi; //生成点の集合
for(i=0;i<n;i++){
do{
//単正方形の中に、ランダムに1点pを発生させる
p[i].x=i+(n-1-i)*(random()/(random.max()+1.0));
p[i].y=i+(n-1-i)*(random()/(random.max()+1.0));
//pと既に得られた各生成点との距離の最小値を計算する
double min=dis[0];
for(j=1;j<n;j++){
double dis[j]=distance(p[i],p[j]);
if(min>dis[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<Point> poisson=poisson_disk_sampling(n,r,random);
std::cout<<"結果の座標は";
output_points(poisson);
return 0;
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
invalid declarator before 'poi'を検索してみたのですが出てこずこのエラーの意味がわかりません。
検索する前に、エラーメッセージを読んでください。
error: invalid declarator before 'poi'
英語だから読まないのですか?
「'poi' の前の不正な宣言子」
declarator の意味がよく分からなくても宣言(declaration)に関係するエラーだと
分かるでしょう。
45行目だといっているのでそこを見ましょう。
std::vector<Point> poi;
正しい宣言です。
ところがその前の前の行から見ましょう。
int
std::vector<Point> poi; //生成点の集合
宣言は int から始まっています。
int
は型名、std::vector<Point>
も型名、poi
は変数名。
宣言は「型名 変数名;」ですから、間違いですね。
int
を削除しましょう。
array must be initialized with a brace-enclosed initializer
「配列は、ブレイスで囲まれた初期化子で初期化されなければならない」
ブレイスとは、{ と } です。
double dis[j]=distance(p[i],p[j]);
を
double dis[j] = { distance(p[i],p[j]) };
にしなさい
と言っているように取れますが、ソースをよく見てください。
15行前に、double dis[n],min;
という宣言があります。
dis
は既に宣言されていて、それを使えばいいのに、新たに double
の
配列 dis
を宣言しようとしてエラーになっていることが分かります。
修正方法は、double
を削除して、dis[j] = distance(p[i], p[j]);
にする。
また、pと既に得られた各生成点との距離の最小値を計算するの部分があっているかどうか自信がありません。
合っていません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
double dis[n],min;
Point p[n];
こんなこと(引数値nを用いた配列の定義)はできない.
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/08/03 21:57