定义一个容器数组,往容器里面写n*3的矩阵,通过一个类写入,最后将这个数组里面重复的类删除。

定义一个容器数组,往容器里面写n*3的矩阵,通过一个类写入,最后将这个数组里面重复的类删除。

参考博客:
  1. 重载操作符
  2. 去掉vector重复元素
  3. 容器排序
  4. 三维排序
  5. 类的定义
  • 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;

	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值