teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

詳しく更新

2020/07/21 06:50

投稿

aiouongaku
aiouongaku

スコア1

title CHANGED
File without changes
body CHANGED
@@ -9,12 +9,12 @@
9
9
  ```C++
10
10
  /*Point.h*/
11
11
 
12
- class point{
12
+ class Point{
13
13
  public:
14
14
  double x,y,z;      //点のx,y,z座標値
15
15
  double hori_angle;   //xy平面上でのx軸と点の角度(以下、水平角)
16
16
  double vertical_angle; //xy平面と点のなす角度(以下、垂直角)
17
- point();
17
+ Point();
18
18
  };
19
19
  ```
20
20
  ```C++
@@ -86,6 +86,8 @@
86
86
  [15 ,25 ,0 ,25 ,25 ,20 ,30 ],
87
87
  [20 ,10 ,-10 ,20 ,30 ,0 ,15 ];
88
88
 
89
+
90
+
89
91
  ###1.水平角ソート後
90
92
  a_point[ hori ][ vertical ].hori_angle =
91
93
  [-180,-180,-180,-180,-180,-180,-180],
@@ -147,7 +149,21 @@
147
149
  [-10,0,10,15,20,25,30],
148
150
  [-10,0,10,15,20,25,30];
149
151
 
152
+ ###現状
153
+ 垂直角のソートのみ取り入れているので,以下のような結果が得られています.
150
154
 
155
+ a_point[ hori ][ vertical ].hori_angle =
156
+ [-180,0,-30,-180,0,-30,-180],
157
+ [-30,0,180,-180,-180,0,-30,0],
158
+ [-180,0,-30,(0,180,-180),0],
159
+ [180,180,-30,(180,180),-180,-30]
160
+
161
+ a_point[hori][vertical].vertical_angle =
162
+ [-10,-10,0,10,10,15,30],
163
+ [-10,0,10,15,20,25,30],
164
+ [0,15,20,25,25,25,30],
165
+ [-10,0,10,15,20,20,30];
166
+
151
167
  ### 補足情報
152
168
  a_point[][]はpoint classのことを表しています.
153
169
  垂直角のソートは出来ているのですが,水平角のソート方法がわかりません.

2

詳しく変更

2020/07/21 06:50

投稿

aiouongaku
aiouongaku

スコア1

title CHANGED
File without changes
body CHANGED
@@ -7,12 +7,8 @@
7
7
  ### 該当のソースコード
8
8
 
9
9
  ```C++
10
- using namespace pcl;
10
+ /*Point.h*/
11
- PointCloud<pcl::PointXYZI>::Ptr input(new pal::PointCloud<pcl::PointXYZI>);//入力点群
12
11
 
13
- int hori = 7;   //水平方向データ数
14
- int vertical = 4; //垂直方向データ数
15
-
16
12
  class point{
17
13
  public:
18
14
  double x,y,z;      //点のx,y,z座標値
@@ -20,7 +16,23 @@
20
16
  double vertical_angle; //xy平面と点のなす角度(以下、垂直角)
21
17
  point();
22
18
  };
19
+ ```
20
+ ```C++
21
+ /*Point.cpp*/
23
22
 
23
+ #include "Point.h"
24
+ Point::Point(){
25
+ }
26
+ ```
27
+ ```C++
28
+ /*main.cpp*/
29
+
30
+ using namespace pcl;
31
+ PointCloud<pcl::PointXYZI>::Ptr input(new pal::PointCloud<pcl::PointXYZI>);//入力点群
32
+
33
+ int hori = 7;   //水平方向データ数
34
+ int vertical = 4; //垂直方向データ数
35
+
24
36
  Void main(void){
25
37
  for(int i = 0; i < hori; i++){
26
38
  for(int j = 0; j < vertical; j++){
@@ -31,7 +43,7 @@
31
43
 
32
44
  /*垂直角・水平角を求める*/
33
45
  a_point[j][i].hori_angle = atan2(a_point[j][i].y,a_point[j][i].x);
34
- a_point[j][I].vertical_angle = /*計算式*/;
46
+ a_point[j][i].vertical_angle = /*計算式*/;
35
47
  //↑↑↑それぞれ[rad]から[deg]に変換,水平角は-180[deg]~180[deg]が,垂直角は-10[deg]~30[deg]が得られる
36
48
  }
37
49
  }
@@ -101,22 +113,22 @@
101
113
  for(int j = 0; j < vertical; j++){
102
114
  for(int k = j+1; k < vertival; k++){
103
115
  temp1 = a_point[j][i].x;
104
- temp2 = a_point[j][I].y;
116
+ temp2 = a_point[j][i].y;
105
- temp3 = a_point[j][I].z;
117
+ temp3 = a_point[j][i].z;
106
- temp4 = a_point[j][I].hori_angle;
118
+ temp4 = a_point[j][i].hori_angle;
107
- temp5 = a_point[j][I].vertical_angle;
119
+ temp5 = a_point[j][i].vertical_angle;
108
120
 
109
121
  a_point[j][i].x = a_point[k][i].x;
110
- a_point[j][I].y = a_point[k][I].y;
122
+ a_point[j][i].y = a_point[k][I].y;
111
- a_point[j][I].z = a_point[k][I].z;
123
+ a_point[j][i].z = a_point[k][I].z;
112
- a_point[j][I].hori_angle = a_point[k][I].hori_angle;
124
+ a_point[j][i].hori_angle = a_point[k][i].hori_angle;
113
- a_point[j][I].vertical_angle = a_point[k][I].vertical_angle;
125
+ a_point[j][i].vertical_angle = a_point[k][i].vertical_angle;
114
126
 
115
127
  a_point[k][i].x = temp1;
116
- a_point[k][I].y = temp2;
128
+ a_point[k][i].y = temp2;
117
- a_point[k][I].z = temp3;
129
+ a_point[k][i].z = temp3;
118
- a_point[k][I].hori_angle = temp4;
130
+ a_point[k][i].hori_angle = temp4;
119
- a_point[k][I].vertical_angle = temp5;
131
+ a_point[k][i].vertical_angle = temp5;
120
132
  }
121
133
    }
122
134
  }

1

詳しく編集し直しました

2020/07/21 06:32

投稿

aiouongaku
aiouongaku

スコア1

title CHANGED
File without changes
body CHANGED
@@ -1,68 +1,143 @@
1
- ### 前提・実現したいこと
1
+ ### 実現したいこと
2
+ C++で作成しています。
2
- C++で作成ています。二次元配列で以下のような結果になるように配列をソートしたいです。
3
+ PCD形式の点群データを配列に格納,class内のデータ(二次元配列)でソートしたいです。(伝え方が難しい)
4
+ 垂直角のソートは出来ているのですが,水平角のソート方法がわかりません.
5
+ 解決策がありましたら教えていただきたいです.
3
6
 
4
- <入力>
5
- [0,0,0,1,2,0,0]
7
+ ### 該当のソースコード
6
- [1,3,2,1,0,4,3]
7
- [0,1,1,4,1,1,4]
8
- [2,2,4,3,2,3,2]
9
- [2,3,4,4,3,3,4]
10
8
 
11
- <結果>
9
+ ```C++
12
- [0,0,0,0,0,0,0]
10
+ using namespace pcl;
13
- [1,1,1,1,1,1,1]
14
- [2,2,2,2,2,2,2]
11
+ PointCloud<pcl::PointXYZI>::Ptr input(new pal::PointCloud<pcl::PointXYZI>);//入力点群
15
- [3,3,3,3,3,3,3]
16
- [4,4,4,4,4,4,4]
17
12
 
18
- ### 発生している問題
19
- 自分でやってみましたが、以下のような結果になりました。
13
+ int hori = 7;   //水平方向データ数
14
+ int vertical = 4; //垂直方向データ数
20
15
 
21
- <自分でやった結果>
22
- [0,0,0,0,0,1,2]
23
- [0,1,1,2,3,3,4]
24
- [0,1,1,1,1,4,4]
25
- [2,2,2,2,3,3,4]
26
- [2,3,3,3,4,4,4]
27
-
28
-
29
- ### 該当のソースコード
30
-
31
- ```C++
32
16
  class point{
33
17
  public:
18
+ double x,y,z;      //点のx,y,z座標値
19
+ double hori_angle;   //xy平面上でのx軸と点の角度(以下、水平角)
34
- int angle;
20
+ double vertical_angle; //xy平面と点のなす角度(以下、垂直角)
35
21
  point();
36
22
  };
37
23
 
38
24
  Void main(void){
39
- for(int i=0;i<7;i++){
25
+ for(int i = 0; i < hori; i++){
40
- for(int j=0;j<4;j++){
26
+ for(int j = 0; j < vertical; j++){
27
+ /*点群データを配列に格納*/
28
+    a_point[j][i].x = input->points[i*4+j].x;
29
+ a_point[j][i].y = input->points[i*4+j].y;
30
+ a_point[j][i].z = input->points[i*4+j].z;
31
+
32
+ /*垂直角・水平角を求める*/
33
+ a_point[j][i].hori_angle = atan2(a_point[j][i].y,a_point[j][i].x);
41
- point[j][i].angle = /*上記<入力>の配列*/;
34
+ a_point[j][I].vertical_angle = /*計算式*/;
35
+ //↑↑↑それぞれ[rad]から[deg]に変換,水平角は-180[deg]~180[deg]が,垂直角は-10[deg]~30[deg]が得られる
42
36
  }
43
37
  }
44
-
38
+ /*並べ替える*/
45
39
  Sort();
46
40
  }
47
41
 
48
42
  Void Sort(void){
43
+
44
+    /*水平角を-180[deg]から 昇順に並べた後 ,同じ水平角内で垂直角を-10[deg]から昇順に並べたい.
45
+ 理想形は以下のようになる.(このような表し方が正しいのかは多目に見て欲しいです)
46
+
47
+     a_point[hori][vertical].hori_angle
48
+ = [-180,-180,-180,-180,-180,-180,-180],
49
+ [-30 ,-30 ,-30 ,-30 ,-30 ,-30 ,-30 ],
50
+ [0 ,0 ,0 ,0 ,0 ,0 ,0 ],
51
+ [180 ,180 ,180 ,180 ,180 ,180 ,180 ];
52
+
53
+ a_point[hori][vertical].vertical_angle
54
+ = [-10,0,10,15,20,25,30],
55
+ [-10,0,10,15,20,25,30],
56
+ [-10,0,10,15,20,25,30],
57
+ [-10,0,10,15,20,25,30];
58
+
49
- int temp;
59
+ */
60
+ }
61
+ ```
62
+
63
+ ###入力(ソート前)データ
64
+
65
+ a_point[ hori ][ vertical ].hori_angle =
66
+ [-180,-180,0 ,-30 ,-30 ,0 ,-180],
67
+ [-30 ,0 ,0 ,-30 ,-180,180 ,0 ],
68
+ [0 ,0 ,-180,180 ,-180,-30 ,180 ],
69
+ [-180,-30 ,180 ,180 ,-30 ,180 ,180 ];
70
+
71
+ a_point[ hori ][ vertical ].vertical_angle =
72
+ [-10 ,10 ,-10 ,0 ,15 ,10 ,30 ],
73
+ [-10 ,30 ,20 ,25 ,15 ,10 ,0 ],
74
+ [15 ,25 ,0 ,25 ,25 ,20 ,30 ],
75
+ [20 ,10 ,-10 ,20 ,30 ,0 ,15 ];
76
+
77
+ ###1.水平角ソート後
78
+ a_point[ hori ][ vertical ].hori_angle =
79
+ [-180,-180,-180,-180,-180,-180,-180],
80
+ [-30 ,-30 ,-30 ,-30 ,-30 ,-30 ,-30 ],
81
+ [0 ,0 ,0 ,0 ,0 ,0 ,0 ],
82
+ [180 ,180 ,180 ,180 ,180 ,180 ,180 ];
83
+
84
+
85
+ ↓↓↓こんな感じなのかな?と予想↓↓↓
86
+ a_point[ hori ][ vertical ].vertical_angle =
87
+ [(-10 ,20 ),10 ,0 ,(15 ,25 ),30 ],
88
+ [-10 ,10 ,0 ,(25 ,15 ),30 ,20 ],
89
+ [15 ,(30 ,25 ),(-10,20 ),10 ,0 ],
90
+ [-10 ,(25 ,20 ),(10 ,0 ),(30 ,15 )];
91
+
92
+ ()内は順不同.あくまで予想です.
93
+
50
- //昇順ソート
94
+ ###2.垂直角ソート
95
+ ```C++
96
+ /*垂直角ソートプログラム(Sort関数内に存在)*/
97
+
98
+ double temp1, temp2, temp3, temp4, temp5;
99
+
51
- for(int i=0;i<7;i++){
100
+ for(int i = 0; i < hori; i++){
52
- for(int j=0;j<4;j++){
101
+ for(int j = 0; j < vertical; j++){
53
- for(int k=i+1;i<7;i++){
102
+ for(int k = j+1; k < vertival; k++){
103
+ temp1 = a_point[j][i].x;
54
- if(point[j][k].angle<point[j][I].angle){
104
+ temp2 = a_point[j][I].y;
105
+ temp3 = a_point[j][I].z;
55
- temp = point[j][i].angle;
106
+ temp4 = a_point[j][I].hori_angle;
107
+ temp5 = a_point[j][I].vertical_angle;
108
+
109
+ a_point[j][i].x = a_point[k][i].x;
110
+ a_point[j][I].y = a_point[k][I].y;
111
+ a_point[j][I].z = a_point[k][I].z;
56
- point[j][I].angle = point[k][I].angle;
112
+ a_point[j][I].hori_angle = a_point[k][I].hori_angle;
113
+ a_point[j][I].vertical_angle = a_point[k][I].vertical_angle;
114
+
115
+ a_point[k][i].x = temp1;
116
+ a_point[k][I].y = temp2;
117
+ a_point[k][I].z = temp3;
57
- point[k][I].angle = temp
118
+ a_point[k][I].hori_angle = temp4;
119
+ a_point[k][I].vertical_angle = temp5;
58
120
  }
59
- }
121
+   }
60
- }
61
- }
62
122
  }
123
+
63
124
  ```
125
+ <結果>
126
+ a_point[ hori ][ vertical ].hori_angle =
127
+ [-180,-180,-180,-180,-180,-180,-180],
128
+ [-30 ,-30 ,-30 ,-30 ,-30 ,-30 ,-30 ],
129
+ [0 ,0 ,0 ,0 ,0 ,0 ,0 ],
130
+ [180 ,180 ,180 ,180 ,180 ,180 ,180 ];
64
131
 
132
+ a_point[hori][vertical].vertical_angle =
133
+ [-10,0,10,15,20,25,30],
134
+ [-10,0,10,15,20,25,30],
135
+ [-10,0,10,15,20,25,30],
136
+ [-10,0,10,15,20,25,30];
65
137
 
138
+
66
- ### 補足情報(FW/ツールのバージョンなど)
139
+ ### 補足情報
67
- 本当はもっと長いソースコードです。必要かなと判断した部分のみ記載したので辻褄が合わない部分もあるかもしれません。
68
- 上記<結果>が得られれば嬉しいです。よろしくお願いいたします
140
+ a_point[][]はpoint classのことを表います
141
+ 垂直角のソートは出来ているのですが,水平角のソート方法がわかりません.
142
+
143
+ 更に詳しく編集し直しました.