Polygon * ppoly1 = ▭ Polygon * ppoly2 = &trgl; Polygon * ppoly3 = &poly; ppoly1->set_values(5, 8); ppoly2->set_values(5, 8); ppoly3->set_values(5, 8); cout << ppoly1->area() <<" "<<rect.area()<< endl; cout << ppoly2->area() <<" "<<trgl.area()<< endl; cout << ppoly3->area() <<" "<<poly.area()<< endl;
时间: 2024-04-25 09:26:03 浏览: 53
这段代码是关于多态的示例。其中,rect、trgl和poly都是Polygon类的派生类。ppoly1、ppoly2和ppoly3是指向Polygon对象的指针,但是它们实际上指向的是rect、trgl和poly对象。当调用ppoly1、ppoly2和ppoly3的area()函数时,由于这些指针是指向不同的对象的,因此它们会调用不同的派生类的area()函数,从而产生不同的结果。这就是多态的实现方式。
需要注意的是,set_values()函数是在Polygon类中定义的,但是由于rect、trgl和poly都是Polygon类的派生类,它们都继承了set_values()函数。因此,当使用ppoly1、ppoly2和ppoly3指针调用set_values()函数时,它们会分别调用rect、trgl和poly对象的set_values()函数。
相关问题
Rectangle rect; Triangle trgl; Polygon poly; Polygon * ppoly1 = ▭ Polygon * ppoly2 = &trgl; Polygon * ppoly3 = &poly; ppoly1->set_values(5, 8); ppoly2->set_values(5, 8); ppoly3->set_values(5, 8); cout << ppoly1->area() <<" "<<rect.area()<< endl; cout << ppoly2->area() <<" "<<trgl.area()<< endl; cout << ppoly3->area() <<" "<<poly.area()<< endl; return 0;
这段代码也是关于多态的示例。其中,rect、trgl和poly都是Polygon类的派生类。ppoly1、ppoly2和ppoly3是指向Polygon对象的指针,但是它们实际上指向的是rect、trgl和poly对象。当调用ppoly1、ppoly2和ppoly3的area()函数时,由于这些指针是指向不同的对象的,因此它们会调用不同的派生类的area()函数,从而产生不同的结果。这就是多态的实现方式。
与上面的代码不同的是,这里没有给出set_values()函数的实现,因此无法确定rect、trgl和poly对象的属性值。但是,由于ppoly1、ppoly2和ppoly3是指向这些对象的指针,它们仍然可以调用派生类的area()函数,从而计算出这些对象的面积。
bool isPolygonInside(const std::vector<cv::Point>& polygon1, const std::vector<cv::Point>& polygon2, double& outsideArea) { // Check if all vertices of polygon1 are inside polygon2 for (const auto& vertex : polygon1) { double distance = cv::pointPolygonTest(polygon2, vertex, true); if (distance < 0) { // Vertex is outside polygon2 // Calculate area of polygon1 outside polygon2 cv::Mat polygon1Mat = cv::Mat(polygon1).reshape(1); cv::Mat polygon2Mat = cv::Mat(polygon2).reshape(1); std::vector<cv::Point2f> intersectionPolygon; if (cv::isContourConvex(polygon1) && cv::isContourConvex(polygon2)) { cv::Mat intersectionMat; cv::intersectConvexConvex(polygon1Mat, polygon2Mat, intersectionMat); if (cv::countNonZero(intersectionMat) > 0) { intersectionMat.reshape(2).copyTo(intersectionPolygon); } } else { cv::Rect rect1 = cv::boundingRect(polygon1Mat); cv::Rect rect2 = cv::boundingRect(polygon2Mat); cv::Rect intersectionRect = rect1 & rect2; if (!intersectionRect.empty()) { cv::Mat intersectionMat = cv::Mat::zeros(intersectionRect.size(), CV_8UC1); cv::fillConvexPoly(intersectionMat, polygon1 - rect1.tl(), cv::Scalar(255)); cv::fillConvexPoly(intersectionMat, polygon2 - rect2.tl(), cv::Scalar(0), cv::LINE_AA); std::vector<std::vector<cv::Point>> contours; cv::findContours(intersectionMat, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); if (!contours.empty()) { intersectionPolygon = contours[0]; } } } double intersectionArea = std::abs(cv::contourArea(intersectionPolygon)); double polygon1Area = std::abs(cv::contourArea(polygon1)); outsideArea = polygon1Area - intersectionArea; return false; } } // All vertices of polygon1 are inside polygon2 return true; }
这段代码是用于判断一个多边形是否被另一个多边形包含,并计算出多边形1与多边形2之间的“外部面积”。其中,函数的输入参数是两个多边形的顶点坐标向量,输出参数是外部面积。函数的实现过程是,对于多边形1的每个顶点,计算其到多边形2的距离。如果该距离小于0,则判定该顶点在多边形2外部,需要计算多边形1在多边形2外部的面积。计算面积的方法是,先判断两个多边形是否都是凸多边形,如果是则使用cv::intersectConvexConvex函数计算两个多边形的交集;如果不是,则使用cv::boundingRect函数计算两个多边形的外接矩形,并在该矩形内部构造一个新的二值图像,将多边形1和多边形2分别填充到该二值图像中,并使用cv::findContours函数找到交集多边形的轮廓。最后,使用cv::contourArea函数计算多边形1和交集多边形的面积,相减即为多边形1在多边形2外部的面积。如果多边形1的所有顶点都在多边形2内部,则返回true,否则返回false。
阅读全文