質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.33%

ポアソンディスクサンプリングのプログラムについてまたエラーinvalid declarator before 'poi'

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 490

langhtorn

score 87

実現したいこと

ポアソンディスクサンプリングのプログラムを作りたい
std::vector<Point> 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<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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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と既に得られた各生成点との距離の最小値を計算するの部分があっているかどうか自信がありません。

合っていません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/03 21:57

    エラーをちゃんと英語として読みます。ありがとうございます。

    キャンセル

-1

double dis[n],min;
Point p[n];

こんなこと(引数値nを用いた配列の定義)はできない.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/01 13:07

    それでは間違いであるとわかるように低評価を依頼致す所存.

    キャンセル

  • 2020/08/01 13:12

    「誤チェストにごわす」

    キャンセル

  • 2020/08/01 13:17

    感謝.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • C++に関する質問
  • ポアソンディスクサンプリングのプログラムについてまたエラーinvalid declarator before 'poi'