编码实现一个几何线条的类模板,类名为polylineT,要求:1.线条能够包含多个(个数不定)数据坐标点,坐标分量X,Y,Z可以是任意基本数据类型:‘2.在类中实现计算线条的长度的函数,3.在类中实现增加和删除线条结点的函数;“4.不同线条对象之间可以相互赋值;5.重载运算符+,实现不同线条对象之间可以进行首尾相连。6.在main 函数中生成两条线(其坐标点构成见表1和表2),调用、测试上述基本功能,并进行以下操作:·(1)判断这两条线是否相交;如果相交,计算并输出所有相交点的坐标。“(2)将它们进行连接,形成一个新的线条对象,计算合并后线条的长度。
时间: 2024-03-10 16:46:09 浏览: 101
好的,我会根据您的要求来进行编码实现。
```c++
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
template<typename T>
class polylineT{
private:
vector<pair<T,T>> points; //存储坐标点
public:
polylineT(){} //默认构造函数
polylineT(const polylineT& other){ //复制构造函数
points=other.points;
}
polylineT operator+(const polylineT& other){ //重载运算符+
polylineT res(*this);
if(!points.empty()&&!other.points.empty()){
res.points.emplace_back(other.points[0]);
for(int i=1;i<other.points.size();i++){
res.points.emplace_back(other.points[i]);
}
}
return res;
}
polylineT& operator=(const polylineT& other){ //重载运算符=
points=other.points;
return *this;
}
void add_point(const T& x,const T& y){ //增加结点
points.emplace_back(x,y);
}
void delete_point(int index){ //删除结点
if(index>=0&&index<points.size()){
points.erase(points.begin()+index);
}
}
T length() const{ //计算线条长度
T res=0;
for(int i=1;i<points.size();i++){
T dx=points[i].first-points[i-1].first;
T dy=points[i].second-points[i-1].second;
res+=sqrt(dx*dx+dy*dy);
}
return res;
}
bool intersect(const polylineT& other,vector<pair<T,T>>& cross_points) const{ //判断是否相交
for(int i=1;i<points.size();i++){
for(int j=1;j<other.points.size();j++){
T x1=points[i-1].first,y1=points[i-1].second,x2=points[i].first,y2=points[i].second;
T x3=other.points[j-1].first,y3=other.points[j-1].second,x4=other.points[j].first,y4=other.points[j].second;
T d=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1);
if(d==0) continue;
T ua=(x4-x3)*(y1-y3)-(y4-y3)*(x1-x3);
T ub=(x2-x1)*(y1-y3)-(y2-y1)*(x1-x3);
ua/=d;
ub/=d;
if(ua>=0&&ua<=1&&ub>=0&&ub<=1){
cross_points.emplace_back(x1+ua*(x2-x1),y1+ua*(y2-y1));
}
}
}
return !cross_points.empty();
}
};
int main(){
polylineT<double> line1,line2,line3;
line1.add_point(0,0);
line1.add_point(1,1);
line1.add_point(2,2);
line1.add_point(3,3);
line2.add_point(1,0);
line2.add_point(2,1);
line2.add_point(3,2);
line2.add_point(4,3);
cout<<"line1 length="<<line1.length()<<endl;
cout<<"line2 length="<<line2.length()<<endl;
vector<pair<double,double>> cross_points;
if(line1.intersect(line2,cross_points)){
cout<<"These two lines have "<<cross_points.size()<<" cross points:"<<endl;
for(auto& p:cross_points){
cout<<"("<<p.first<<","<<p.second<<")"<<endl;
}
}
else{
cout<<"These two lines do not intersect"<<endl;
}
line3=line1+line2;
cout<<"line3 length="<<line3.length()<<endl;
return 0;
}
```
上述代码实现了一个模板类 `polylineT`,其中存储了一些坐标点,可以进行增加、删除结点、计算线条长度等操作,同时还实现了重载运算符 +,使得不同线条对象之间可以进行首尾相连。在 `main` 函数中,我们生成了两条线 `line1` 和 `line2`,并进行了一些操作,包括计算线条长度、判断是否相交、进行首尾相连等操作。
其中,在判断两条线是否相交时,我们采用的是比较暴力的方法,即对于每条线上的相邻两个点,分别与另一条线上的相邻两个点进行比较,判断是否相交。如果相交,我们将相交点的坐标存储在 `cross_points` 中,并返回 `true`;否则,返回 `false`。在实际应用中,这种方法可能会比较耗时,可以考虑采用更高效的算法。
在最后,我们将 `line1` 和 `line2` 进行首尾相连,生成了一条新的线 `line3`,并计算了它的长度。
阅读全文