実現したいこと
C++で作成しています。
PCD形式の点群データを配列に格納し,class内のデータ(二次元配列)でソートしたいです。(伝え方が難しい)
垂直角のソートは出来ているのですが,水平角のソート方法がわかりません.
解決策がありましたら教えていただきたいです.
該当のソースコード
C++
1/*Point.h*/ 2 3class Point{ 4public: 5double x,y,z; //点のx,y,z座標値 6double hori_angle; //xy平面上でのx軸と点の角度(以下、水平角) 7double vertical_angle; //xy平面と点のなす角度(以下、垂直角) 8Point(); 9};
C++
1/*Point.cpp*/ 2 3#include "Point.h" 4Point::Point(){ 5}
C++
1/*main.cpp*/ 2 3using namespace pcl; 4PointCloud<pcl::PointXYZI>::Ptr input(new pal::PointCloud<pcl::PointXYZI>);//入力点群 5 6int hori = 7; //水平方向データ数 7int vertical = 4; //垂直方向データ数 8 9Void main(void){ 10 for(int i = 0; i < hori; i++){ 11 for(int j = 0; j < vertical; j++){ 12 /*点群データを配列に格納*/ 13 a_point[j][i].x = input->points[i*4+j].x; 14 a_point[j][i].y = input->points[i*4+j].y; 15 a_point[j][i].z = input->points[i*4+j].z; 16 17 /*垂直角・水平角を求める*/ 18 a_point[j][i].hori_angle = atan2(a_point[j][i].y,a_point[j][i].x); 19 a_point[j][i].vertical_angle = /*計算式*/; 20 //↑↑↑それぞれ[rad]から[deg]に変換,水平角は-180[deg]~180[deg]が,垂直角は-10[deg]~30[deg]が得られる 21 } 22 } 23 /*並べ替える*/ 24 Sort(); 25} 26 27Void Sort(void){ 28 29 /*水平角を-180[deg]から 昇順に並べた後 ,同じ水平角内で垂直角を-10[deg]から昇順に並べたい. 30 理想形は以下のようになる.(このような表し方が正しいのかは多目に見て欲しいです) 31 32 a_point[hori][vertical].hori_angle 33 = [-180,-180,-180,-180,-180,-180,-180], 34 [-30 ,-30 ,-30 ,-30 ,-30 ,-30 ,-30 ], 35 [0 ,0 ,0 ,0 ,0 ,0 ,0 ], 36 [180 ,180 ,180 ,180 ,180 ,180 ,180 ]; 37 38 a_point[hori][vertical].vertical_angle 39 = [-10,0,10,15,20,25,30], 40 [-10,0,10,15,20,25,30], 41 [-10,0,10,15,20,25,30], 42 [-10,0,10,15,20,25,30]; 43 44*/ 45}
###入力(ソート前)データ
a_point[ hori ][ vertical ].hori_angle =
[-180,-180,0 ,-30 ,-30 ,0 ,-180],
[-30 ,0 ,0 ,-30 ,-180,180 ,0 ],
[0 ,0 ,-180,180 ,-180,-30 ,180 ],
[-180,-30 ,180 ,180 ,-30 ,180 ,180 ];
a_point[ hori ][ vertical ].vertical_angle =
[-10 ,10 ,-10 ,0 ,15 ,10 ,30 ],
[-10 ,30 ,20 ,25 ,15 ,10 ,0 ],
[15 ,25 ,0 ,25 ,25 ,20 ,30 ],
[20 ,10 ,-10 ,20 ,30 ,0 ,15 ];
###1.水平角ソート後
a_point[ hori ][ vertical ].hori_angle =
[-180,-180,-180,-180,-180,-180,-180],
[-30 ,-30 ,-30 ,-30 ,-30 ,-30 ,-30 ],
[0 ,0 ,0 ,0 ,0 ,0 ,0 ],
[180 ,180 ,180 ,180 ,180 ,180 ,180 ];
↓↓↓こんな感じなのかな?と予想↓↓↓
a_point[ hori ][ vertical ].vertical_angle =
[(-10 ,20 ),10 ,0 ,(15 ,25 ),30 ],
[-10 ,10 ,0 ,(25 ,15 ),30 ,20 ],
[15 ,(30 ,25 ),(-10,20 ),10 ,0 ],
[-10 ,(25 ,20 ),(10 ,0 ),(30 ,15 )];
()内は順不同.あくまで予想です.
###2.垂直角ソート後
C++
1/*垂直角ソートプログラム(Sort関数内に存在)*/ 2 3double temp1, temp2, temp3, temp4, temp5; 4 5for(int i = 0; i < hori; i++){ 6 for(int j = 0; j < vertical; j++){ 7 for(int k = j+1; k < vertival; k++){ 8 temp1 = a_point[j][i].x; 9 temp2 = a_point[j][i].y; 10 temp3 = a_point[j][i].z; 11 temp4 = a_point[j][i].hori_angle; 12 temp5 = a_point[j][i].vertical_angle; 13 14 a_point[j][i].x = a_point[k][i].x; 15 a_point[j][i].y = a_point[k][I].y; 16 a_point[j][i].z = a_point[k][I].z; 17 a_point[j][i].hori_angle = a_point[k][i].hori_angle; 18 a_point[j][i].vertical_angle = a_point[k][i].vertical_angle; 19 20 a_point[k][i].x = temp1; 21 a_point[k][i].y = temp2; 22 a_point[k][i].z = temp3; 23 a_point[k][i].hori_angle = temp4; 24 a_point[k][i].vertical_angle = temp5; 25 } 26 } 27} 28
<結果>
a_point[ hori ][ vertical ].hori_angle =
[-180,-180,-180,-180,-180,-180,-180],
[-30 ,-30 ,-30 ,-30 ,-30 ,-30 ,-30 ],
[0 ,0 ,0 ,0 ,0 ,0 ,0 ],
[180 ,180 ,180 ,180 ,180 ,180 ,180 ];
a_point[hori][vertical].vertical_angle =
[-10,0,10,15,20,25,30],
[-10,0,10,15,20,25,30],
[-10,0,10,15,20,25,30],
[-10,0,10,15,20,25,30];
###現状
垂直角のソートのみ取り入れているので,以下のような結果が得られています.
a_point[ hori ][ vertical ].hori_angle =
[-180,0,-30,-180,0,-30,-180],
[-30,0,180,-180,-180,0,-30,0],
[-180,0,-30,(0,180,-180),0],
[180,180,-30,(180,180),-180,-30]
a_point[hori][vertical].vertical_angle =
[-10,-10,0,10,10,15,30],
[-10,0,10,15,20,25,30],
[0,15,20,25,25,25,30],
[-10,0,10,15,20,20,30];
補足情報
a_point[][]はpoint classのことを表しています.
垂直角のソートは出来ているのですが,水平角のソート方法がわかりません.
更に詳しく編集し直しました.