定义一个容器数组,往容器里面写n*3的矩阵,通过一个类写入,最后将这个数组里面重复的类删除。
参考博客:
- edition one
#include<stdio.h>
#include<algorithm> //用sort
#include<vector>
#include<iostream>
#include<tgmath.h>
using namespace std;
#define error 1e-8
//定义一个类,包括三个值,分别代表三个坐标;
class Box {
public:
double x; //用于保存这一列元素第一个值
double y;
double z;
bool operator == (const Box& b) //操作符重载 "==" 对类的sort 需要重载“==” 操作符 而且由于是double型所有需要用相减的形式
{
bool i = fabs(this->x - b.x) < error;
i = i && fabs(this->y - b.y) < error;
i = i && fabs(this->z - b.z) < error;
return i;
}
/* 之前是这样定义的,但是由于输入的是浮点数,不能直接用 "==" ,在unique的时候无法对序列归一化
bool operator== (const Box b)
{
return this->a_x==b.a_x&&this->a_y==b.a_y&&this->a_z==b.a_z;
}
*/
};
//自定义的排序规则,先排第一个元素,再排第二个元素,主要参考 “三维排序”,这里同样是由于是浮点型,所以有改动。
bool mySort(Box a, Box b)
{
if (fabs(a.x - b.x) > error)
return a.x < b.x;
else if (fabs(a.y - b.y) > error)
return a.y < b.y;
else
return a.z < b.z;
}
//bool mySort(Box a, Box b) //最初版本
//{
// if (a.x != b.x)
// return a.x < b.x;
// else if (a.y != b.y)
// return a.y < b.y;
// else
// return a.z < b.z;
//}
//函数调用
void coordinate(vector<Box> &vec, double &x, double &y)
{
Box a; //声明a, 类型为Box
double input_a = x;
double input_b = y;
double dis = 0.1;
double i;
//右侧帆板
for (i = -input_a; i < input_a + 0.01; i = i + dis) // 由于修改了比较规则,这里也可以不用更改,小于+0.01 可以控制浮点数引入的误差 小于加的步长(dis)
{
if (abs(i) < error)
a.x = 0;
else
a.x = i;
a.y = input_a;
a.z = 0;
vec.push_back(a);
}
for (i = input_a; i < input_b + 0.01; i = i + dis)
{
a.x = input_a;
if (abs(i) < error)
a.y = 0;
else
a.y = i;
a.z = 0;
vec.push_back(a);
}
for (i = -input_a; i < input_a + 0.01; i = i + dis)
{
if (abs(i) < error)
a.x = 0;
else
a.x = i;
a.y = input_b;
a.z = 0;
vec.push_back(a);
}
for (i = input_a; i < input_b + 0.01; i = i + dis)
{
a.x = -input_a;
if (abs(i) < error)
a.y = 0;
else
a.y = i;
a.z = 0;
vec.push_back(a);
}
//左侧帆板
for (i = -input_a; i < input_a + 0.01; i = i + dis)
{
if (abs(i) < error)
a.x = 0;
else
a.x = i;
a.y = -input_a;
a.z = 0;
vec.push_back(a);
}
for (i = input_a; i < input_b + 0.01; i = i + dis)
{
a.x = input_a;
if (abs(i) < error)
a.y = 0;
else
a.y = -i;
a.z = 0;
vec.push_back(a);
}
for (i = -input_a; i < input_a + 0.01; i = i + dis)
{
if (abs(i) < error)
a.x = 0;
else
a.x = i;
a.y = -input_b;
a.z = 0;
vec.push_back(a);
}
for (i = input_a; i < input_b + 0.01; i = i + dis)
{
a.x = -input_a;
if (abs(i) < error)
a.y = 0;
else
a.y = -i;
a.z = 0;
vec.push_back(a);
}
//腔体底侧
for (i = -input_a; i < input_a + 0.01; i = i + dis)
{
a.x = input_a;
if (abs(i) < error)
a.y = 0;
else
a.y = i;
a.z = -input_a;
vec.push_back(a);
}
for (i = -input_a; i < input_a + 0.01; i = i + dis)
{
if (abs(i) < error)
a.x = 0;
else
a.x = i;
a.y = input_a;
a.z = -input_a;
vec.push_back(a);
}
for (i = -input_a; i < input_a + 0.01; i = i + dis)
{
if (abs(i) < error)
a.x = 0;
else
a.x = i;
a.y = -input_a;
a.z = -input_a;
vec.push_back(a);
}
for (i = -input_a; i < input_a + 0.01; i = i + dis)
{
a.x = -input_a;
if (abs(i) < error)
a.y = 0;
else
a.y = i;
a.z = -input_a;
vec.push_back(a);
}
}
int main()
{
vector <Box> vec; //声明vec 类型为Box;
double x = 1;
double y = 2;
coordinate(vec, x, y);
cout << vec.size() << endl;
sort(vec.begin(), vec.end(), mySort);
vec.erase(unique(vec.begin(), vec.end()), vec.end());
cout << vec.size() << endl;
for (int i = 0; i < vec.size(); ++i)
{
cout << i << ", a.x: " << vec[i].x << ", " << vec[i].y << ", " << vec[i].z << endl;
}
getchar();
return 0;
}