类中:
#pragma once
#include
#include
#include
using namespace std;
class Point
{
private:
double _x, _y, _z;
public:
Point(double a = 0, double b = 0, double c = 0):_x(a),_y(b),_z© {}
Point(const Point& a) :_x(a._x), _y(a._y), _z(a._z) {}
~Point(){}
double getx() {
return _x;
}
double gety() {
return _y;
}
double getz() {
return _z;
}
void setx(double a) {
_x = a;
}
void sety(double a) {
_y = a;
}
void setz(double a) {
_z = a;
}
void showpoint() {
cout << “x=” << _x << " " << “y=” << _y << " " << “z=” <<_z<<" " << endl;
}
bool operator ==(const Point a) {
if (a._x == this->_x && a._y == this->_y && a._z == this->_z) {
return 1;
}
else
return 0;
}
};
class Segment :public Point {
protected:
Point _p1, _p2;
public:
Segment(Point a=0, Point b=0) :_p1(a), _p2(b) {};//
Segment(const Segment& a) :_p1(a._p1), _p2(a._p2) {}
~Segment(){}
};
class Polygons :public Segment {
protected:
Point* _ptr;
int _n;
public:
Polygons( Point *a ,int j=0):_ptr(a),_n(j){}
~Polygons(){}
double getS( Point a, Point b) {
double Sx = sqrt((a.getx() - b.getx()) * (a.getx() - b.getx()));
double Sy = sqrt((a.gety() - b.gety()) * (a.gety() - b.gety()));
double Sz = sqrt((a.getz() - b.getz()) * (a.getz() - b.getz()));
return Sx + Sy + Sz;
}
double getmeter() {
double perimeter = 0;
for (int i = 0; i < _n - 1; i++) {
perimeter = perimeter + getS(_ptr[i], _ptr[i + 1]);
}
perimeter = perimeter + getS(_ptr[0], _ptr[_n - 1]);
return perimeter;
}
double getN() {
return _n;
}
void printS() {
cout << "线段数为:" << _n<<endl;
for (int i = 0; i < _n-1; i++) {
cout << "线段长度为:" << getS(_ptr[i], _ptr[i + 1]) << endl;
}
cout << "线段长度为:" << getS(_ptr[0], _ptr[_n - 1]) << endl;
}
};
CPP文件:
#include<iostream
#include<fstream
#include"Point.h"
#include<vector
using namespace std;
void compare(Point a[],int i) {
for (int j = 0; j < i; j++) {
if (a[j] == a[i]) {
int p = 1;
throw p;
}
}
}
void myputin(Point* a, Point b, int p, int n) {//插入点的函数,输入插入的位置,如第十个节点,p=10,num为数组大小
Point temp(b);
if (p <= 0 || p > n) {
cout << "insert wrong place" << endl;
}
else {
for (; p <= n + 1; p++) {
Point temp2(a[p - 1]);
a[p - 1].setx(temp.getx());
a[p - 1].sety(temp.gety());
a[p - 1].setz(temp.getz());
temp = temp2;
}
}
}
void swap(double& a, double& b) {
double temp3 = 0;
temp3 = a;
a = b;
b = temp3;
}
void sort(vector &a) {
for (int i = 0; i <a.size() ; i++) {
for (int j = 0; j < a.size() - i-1; j++) {//a.size() - i-1防止下标越界;
if (a[j] > a[j+1]) {
swap(a[j], a[j + 1]);
}
}
}
}
int main() {
Point a[125]{ 0 };
double _temp;
int i = 1;
int num = 0;
ifstream put_f(“points.txt”);
while (i) {
try {
put_f >> _temp;
a[i - 1].setx(_temp);
put_f >> _temp;
a[i - 1].sety(_temp);
put_f >> _temp;
a[i - 1].setz(_temp);
if (i >= 2) {
compare(a, i - 1);
}
if (a[i - 1].getx() != 0 && a[i - 1].gety() != 0 && a[i - 1].getz() != 0) {
num++;
}
}
catch (int) {
cout << "number crush" << endl;
i = i - 1;
}
if (_temp == 0) {
put_f.close();
cout << "size:" << i - 1 << endl;
}
i++;
if (i == 100) {
put_f.close();
break;
}
}
for (int j = 0; j < num; j++) {
a[j].showpoint();
}
cout << "after insert:" << endl;
Point sqe(101, 102, 103);
myputin(a, sqe, 10, num);
for (int j = 0; j < num+1; j++) {
a[j].showpoint();
}
Polygons pol(a, num+1);
cout << "the perimeter after insert is:" << pol.getmeter() << endl;
pol.printS();//打印多边形各线段的长度;
vector<double> vol;
for (int i = 0; i < pol.getN()-1; i++) {
vol.push_back(pol.getS(a[i],a[i+1]));
}
vol.push_back(pol.getS(a[0], a[num]));//这里的num是插入之前的,插入后是num+1个点;
cout << "排序前的线段:" << endl;
for (int i = 0; i < vol.size(); i++) {
cout << vol[i] << endl;
}
sort(vol);
cout << "排序后的线段长度为:" << endl;
for (int i = 0; i < vol.size(); i++) {
cout << vol[i] << endl;
}
ofstream output_f("points.txt");
for (int i = 0; i < vol.size(); i++) {
output_f << vol[i];
output_f << endl;
}
output_f.close();
return 0;
}