我想在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/

10-11 22:46
查看更多