你好我知道有一些類似的問題,但我一直無法解決我的問題。 我需要在笛卡爾座標上生成一個球體上唯一的一組點,即從球面到笛卡爾的轉換。當我這樣做時,我將這些點存儲在向量中。然而,一些重複被創建並刪除它們我嘗試過使用排序擦除和獨特的功能。問題是這種排序看不到排序我的整個向量,我不明白爲什麼?它可以很好地處理向量,我只是將數字推回,而不是由我的笛卡爾函數生成的向量向量。我知道這很簡單,我已經堅持了3天,我確信它正在凝視我的臉!代碼和輸出均低於排序和刪除重複從載體<矢量< double>>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stdio.h>
int main(int argc, const char * argv[]){
std::vector<double> locations; //center of the bubble
locations.push_back(1.0);
locations.push_back(1.0);
locations.push_back(1.0);
std::vector<std::vector<double> > points; //set of points to be created around the bubble
double PI=atan(1)*4;
for(int dr=1; dr<2; dr++){
for (int phi=0; phi<180; phi+=90){
for (int theta=0; theta<360; theta+=90){
std::vector<double> row;
double x=locations[0]+(dr*sin(theta*(PI/180))*cos(phi*(PI/180)));
double y=locations[1]+(dr*cos(theta*(PI/180)));
double z=locations[2]+(dr*sin(theta*(PI/180))*sin(phi*(PI/180)));
row.push_back(x);
row.push_back(y);
row.push_back(z);
points.push_back(row);
}
}
}
std::sort(points.begin(), points.end()); //sort points
std::cout<<"sorted points \n";
for (int i =0; i<points.size(); i++){
std::cout<<points[i][0]<<" "<<points[i][1]<<" "<<points[i][2]<<"\n";
}
points.erase(std::unique(points.begin(), points.end()), points.end()); //erase duplicates
std::cout<<"duplicates removed \n";
for (int i =0; i<points.size(); i++){
std::cout<< points[i][0]<<" "<<points[i][1]<<" "<<points[i][2]<<"\n";
}
}
輸出
sorted points
0 1 1
1 1 0
1 0 1 THIS HASN'T BEEN SORTED CORRECTLY
1 1 2
1 2 1
1 2 1
1 0 1 THIS HASN'T BEEN SORTED CORRECTLY
2 1 1
duplicates removed
0 1 1
1 1 0
1 0 1
1 1 2
1 2 1
1 0 1
2 1 1
是的,浮點比較是一種痛苦。 – chris
'for(int dr = 1; dr <2; dr ++)'你不需要循環。你只需要'const int dr = 1;'。 – timrau
我會建議做一個類/結構封裝點的方面。然後你可以重載操作符來進行排序和比較。這會讓你更容易看到你正在嘗試做什麼。 –