我想在Polygon类中执行每个功能的每个人,都可以将double的各个边的大小保存为double的 vector 中。多亏了Point类,我的多边形才得以建立。因此,我成功地知道了多边形中有多少个点,并将多边形的图形打印到屏幕上。但是由于得到点的功能来获得多边形各边的边,我还是没有成功
这是我的课要点:
Point::Point(double x, double y)
{
_x = x;
_y = y;
}
Point::Point(const Point& other)
{
_x = other._x;
_y = other._y;
}
double Point::getX() const
{
return _x;
}
double Point::getY() const
{
return _y;
}
double Point::distance(const Point& other)
{
return sqrt((getX() - other._x) * (getX() - other._x) + (getY() - other._y) *(getY() - other._y));
}
这是我的Polygon类的头:
class Polygon
{
public:
Polygon();
~Polygon();
int numOfPoints() const;
vector<Point> getPoints() const;
vector<double> getSides() const;
protected:
std::vector<Point> _points;
};
和多边形的cpp:
Polygon::Polygon(){}
Polygon::~Polygon(){}
int Polygon::numOfPoints() const
{
return _points.size();
}
vector<Point> Polygon::getPoints() const
{
return _points;
}
vector<double> Polygon::getSides() const
{
vector<double> sides;
}
因此,我不知道由于Point类的出现,我如何能获得每面的大小。我认为这可以通过点的功能距离来实现,但是我不知道如何实现。如果你能帮助我。
谢谢 !
最佳答案
首先要注意一点:以下内容避免了重复计算差异(尽管编译器可能会优化,但最好不要依靠它来这样做...)。
double Point::distance(const Point& other)
{
double dx = _x - other._x;
double dy = _y - other._y;
return sqrt(dx * dx + dy * dy);
}
然后,您必须遍历所有要点;您至少需要两个距离才能有任何距离,但是退化的情况是两个(仅一个距离,所有其他数字n导致n个距离...):
vector<double> Polygon::getSides() const
{
vector<double> sides;
if(points.size() > 2)
{
sides.reserve(points.size());
std::vector<Point>::iterator end = points.end() - 1;
for(std::vector<Point>::iterator i = points.begin(); i != end; ++i)
sides.push_back(i->distance(*(i + 1)));
}
if(points.size() >= 2)
sides.push_back(points.front().distance(points.back()));
return sides;
}
说明:
if(points.size() > 2)
仅当我们有两个以上的点(至少是三角形)时,我们才有真正的多边形。现在我们计算这一距离,例如。 G。对于正方形ABCD,距离AB,BC,CD。请注意,距离DA尚未丢失...
sides.reserve(points.size());
具有n个点的多边形具有n个边。这样可以防止重新分配。
std::vector<Point>::iterator end = points.end() - 1;
end()指向终点。要计算距离i,i + 1,因此必须跳过最后一个元素。
for(std::vector<Point>::iterator i = points.begin(); i != end; ++i)
sides.push_back(i->distance(*(i + 1)));
现在计算距离...
if(points.size() >= 2)
sides.push_back(points.front().distance(points.back()));
这有两种情况:对于真正的多边形,它添加了将其封闭的最后一面(在上面的示例中:DA)。另外,它处理单行的退化情况(i = 2)。
实际上,这也可以放在for循环的前面。我的变体计算出点ABCD AB BC CD DA,备选DA,AB,BC,CD。
您可能已经注意到,仅在真正的多边形的情况下才保留。在简并的情况下,我们只插入一个元素,因此我们是否在via保留之前分配内部数组或在插入元素时都没有关系...
哦,如果要保存一行代码:
for(std::vector<Point>::iterator i = points.begin() + 1; i != points.end(); ++i)
sides.push_back(i->distance(*(i - 1)));
实际上相同,只是还原了点(计算BA而不是AB)。
关于c++ - double vector ,以节省多边形中各边的距离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39242891/