计算两个多边形的重叠面积(C++)

计算两个多边形的重叠面积(C++)

法一

#include 
#include 
#include using namespace std;const int maxn = 300;//maxn表示多边形的最大顶点数量,设为300,即多边形最多有300个顶点
const double eps = 1e-6;//eps表示一个极小的数值,设为1e-6,即0.000001,通常用于判断两个浮点数是否相等。
//位置标识
int dcmp(double x)
{if(x > eps) return 1;return x < -eps ? -1 : 0;
}
// 定义二维点的结构体
struct Point
{double x, y;
};
// 计算向量(p1, p2)和(p1, p3)的叉积
double cross(Point a, Point b, Point c)  
{return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);  //叉积公式
}//计算线段ab和cd的交点坐标
Point intersection(Point a, Point b, Point c, Point d)
{Point p = a;// 计算交点坐标,公式为二维向量叉积的结果double t =((a.x-c.x)*(c.y-d.y)-(a.y-c.y)*(c.x-d.x))/((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x)); p.x +=(b.x-a.x)*t; p.y +=(b.y-a.y)*t;cout << "intersection p.x=" << p.x << ", p.y=" << p.y << endl;return p;
}//计算多边形面积,将多边形拆解成连续三个顶点组合成的多个三角形进行计算,这个循环计算一次其实是计算两次多边形的面积。
double PolygonArea(Point p[], int n)
{if(n < 3) return 0.0;double s = p[0].y * (p[n - 1].x - p[1].x);for(int i = 1; i < n - 1; ++ i) {s += p[i].y * (p[i - 1].x - p[i + 1].x);// cout << "p[i-1].x =" << p[i-1].x << ", p[i-1].y=" << p[i-1].y << endl;// cout << "p[i].x =" << p[i].x << ", p[i].y=" << p[i].y << endl;// cout << "p[i+1].x =" << p[i+1].x << ", p[i+1].y=" << p[i+1].y << endl;}s += p[n - 1].y * (p[n - 2].x - p[0].x);cout << "s =" << s << endl;return fabs(s * 0.5);
}
// 计算两个凸多边形的交集面积
double CPIA(Point a[], Point b[], int na, int nb)  //ConvexPolygonIntersectArea
{Point p[20], tmp[20];//定义两个点集数组,p存储b数组中的所有点,tmp存储在计算交集时得到的新点集int tn, sflag, eflag;//定义临时变量:新点集中的点数,起点和终点在连续点之间的位置标志memcpy(p,b,sizeof(Point)*(nb));// 把点集b的所有点复制到p中,初始化p数组for(int i = 0; i < na && nb > 2; i++)// 遍历a数组中的所有点,如果b中的点数小于等于2,则交集面积为0{// 计算连续两个点组成的矢量线段在p数组中的位置if (i == na - 1) {//对于a中的最后一个点,计算a[0]和a[na-1]组成的矢量线段在p数组中的位置sflag = dcmp(cross(a[0], p[0],a[i]));//计算a[0], a[na-1]所在矢量线段和p[0]的位置关系} else {//计算a[i], a[i+1]所在矢量线段和p[0]的位置关系sflag = dcmp(cross(a[i + 1], p[0],a[i]));}for(int j = tn = 0; j < nb; j++, sflag = eflag)//遍历p数组中的所有点,计算在两个矢量线段之间的点,并存储到新的tmp数组中{if(sflag>=0) {tmp[tn++] = p[j];}if (i == na - 1) {//计算下一个连续点在矢量线段的位置if (j == nb -1) {//如果已经到达p数组中的最后一个点,则计算a[0], a[na-1]所在矢量线段和p[0]的位置关系eflag = dcmp(cross(a[0], p[0], a[i]));} else {//计算a[0], a[na-1]所在矢量线段和p[j], p[j+1]的位置关系eflag = dcmp(cross(a[0], p[j + 1], a[i])); //计算下一个连续点在矢量线段的位置}} else {if (j == nb -1) {//计算a[i], a[i+1]所在矢量线段和p[0]的位置关系eflag = dcmp(cross(a[i + 1], p[0], a[i]));} else {//计算a[i], a[i+1]所在矢量线段和p[j], p[j+1]的位置关系eflag = dcmp(cross(a[i + 1], p[j + 1], a[i]));}}if((sflag ^ eflag) == -2) {  //1和-1的异或为-2,也就是两个点分别在矢量线段的两侧if (i == na - 1) {if (j == nb -1) {tmp[tn++] = intersection(a[i], a[0], p[j], p[0]); //求交点} else {tmp[tn++] = intersection(a[i], a[0], p[j], p[j + 1]);}} else {if (j == nb -1) {tmp[tn++] = intersection(a[i], a[i + 1], p[j], p[0]);} else {tmp[tn++] = intersection(a[i], a[i + 1], p[j], p[j + 1]);}}}}memcpy(p, tmp, sizeof(Point) * tn);nb = tn, p[nb] = p[0];}if(nb < 3) return 0.0;return PolygonArea(p, nb);
}double SPIA(Point a[], Point b[], int na, int nb)    //SimplePolygonIntersectArea 调用此函数// 计算两个简单多边形的交集面积
{int i, j;Point t1[na], t2[nb];// 临时存储点集的数组double res = 0, num1, num2;// res为两个多边形交集的面积t1[0] = a[0], t2[0] = b[0];// 将两个点集的起点存入数组中for(i = 2; i < na; i++)// 遍历第一个点集的所有点{t1[1] = a[i-1], t1[2] = a[i];// 取连续三个点组成矢量线段num1 = dcmp(cross(t1[1], t1[2],t1[0]));  //根据差积公式来计算t1[2]在矢量线段(t1[0], t1[1])的左侧还是右侧,//值为负数在矢量线段左侧,值为正数在矢量线段右侧if(num1 < 0) swap(t1[1], t1[2]);  // 按逆时针进行排序for(j = 2; j < nb; j++)// 遍历第二个点集的所有点{t2[1] = b[j - 1], t2[2] = b[j];// 取连续三个点组成矢量线段num2 = dcmp(cross(t2[1], t2[2],t2[0]));// 根据差积公式计算t2[2]在矢量线段(t2[0], t2[1])的左侧还是右侧// 值为负数在矢量线段左侧,值为正数在矢量线段右侧if(num2 < 0) swap(t2[1], t2[2]);  // 按逆时针方向排序res += CPIA(t1, t2, 3, 3) * num1 * num2; // 计算两个矢量线段之间的交集面积,并乘上两个点所在矢量线段的左右关系}}cout << "Sum::res=" <<res << endl;// 打印交集面积return res;// 返回交集面积
}Point p1[maxn], p2[maxn];// 定义两个多边形的点集
int n1, n2;
int main()
{while(cin>>n1>>n2)// 输入多组测试数据,每组数据为两个简单多边形的顶点个数{for(int i = 0; i < n1; i++) scanf("%lf%lf", &p1[i].x, &p1[i].y);// 输入第一个多边形的顶点坐标for(int i = 0; i < n2; i++) scanf("%lf%lf", &p2[i].x, &p2[i].y);// 输入第二个多边形的顶点坐标double Area = SPIA(p1, p2, n1, n2);// 计算两个多边形的相交面积cout << "Area=" << Area << endl;// 输出相交面积double A1 = PolygonArea(p1, n1);// 计算第一个多边形的面积double A2 = PolygonArea(p2, n2);// 计算第二个多边形的面积cout << "A1 =" << A1 << ", A2=" << A2 << endl;// 输出两个多边形的面积}return 0;
}

提供的代码用于计算两个凸多边形的相交面积。
它获取表示两个多边形顶点的两个点阵列,每个多边形的顶点数,并返回它们的相交面积。
这里使用的算法是扫线算法。其工作原理如下:
在多边形a的所有边上迭代。
对于每条边,计算该边与多边形b的所有边的交点,并将这些点存储在临时阵列中。
遍历临时阵列并识别两个多边形内的点。这些点形成一个新的多边形,即a和b的相交多边形。计算相交多边形的面积并返回。
该算法使用函数cross()来计算两个向量的叉积,使用函数dcmp()来比较两个二重并返回一个指示它们关系的值。
该算法还使用函数PolygonArea()来计算给定顶点的多边形的面积。
请注意,此实现假设输入多边形是凸的。如果输入多边形不是凸的,则算法将无法正常工作。


法二

#include 
#include 
using namespace std;class Polygon {
public:Polygon(float* polygon, int vertex) : polygon(polygon), vertex(vertex) {};int getVertex() const { return vertex; }float* getPolygon() const { return polygon; }
private:float* polygon; // 坐标形式为 [x, y, x, y, ...., ]int vertex; // 顶点数量
};const int maxn = 300;
const double eps = 1e-6;int dcmp(double x);// 创建二维数组
double** CreateDoubleDimensionalArray(int i, int j);
void DeleteDoubleDimensionalArray(double**& _DoubleDimensionalArray, int width);// 叉积
double cross(double ax, double ay, double bx, double by, double cx, double cy);// 交点
void intersectionPoint(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy, double& retx, double& rety);//计算多边形面积
double PolygonArea(double* p, int n);// 凸多边形相交区域
double ConvexPolygonIntersectArea(double* aaa, double* bbb, int na, int nb);float intersection(const Polygon& A, const Polygon& B);int main()
{// float coordsA[8]{ 10, 20, 10, 30, 30, 50, 40, 20 };// float coordsB[8]{ 15, 25, 15, 35, 35, 55, 45, 25 };// Polygon a(coordsA, 4);// Polygon b(coordsB, 4);// // intersection(a, b) 应当返回 366.666// // std::cout << "----------------" << endl;// std::cout << "两个多边形的重叠面积为:" <<  intersection(a, b)<// return 0;int n;cout << "请输入多边形A的顶点数量:";cin >> n;float* coordsA = new float[n * 2];// 创建一个长度为n*2的float数组,用于存储多边形A的顶点坐标cout << "请输入多边形A的顶点坐标(按顺序输入,每个顶点的x和y坐标用空格隔开):" << endl;for (int i = 0; i < n; i++) {cin >> coordsA[i * 2] >> coordsA[i * 2 + 1];// 依次读入多边形B的每个顶点坐标}Polygon a(coordsA, n);cout << "请输入多边形A的顶点坐标(按顺序输入,每个顶点的x和y坐标用空格隔开):" << endl;int m;cout << "请输入多边形B的顶点数量:";cin >> m;float* coordsB = new float[m * 2];cout << "请输入多边形B的顶点坐标(按顺序输入,每个顶点的x和y坐标用空格隔开):" << endl;for (int i = 0; i < m; i++) {cin >> coordsB[i * 2] >> coordsB[i * 2 + 1];}Polygon b(coordsB, m);// 创建一个Polygon对象b,用多边形B的顶点坐标来初始化cout << "两个多边形的重叠面积为:" << intersection(a, b) << endl;// 调用intersection函数计算两个多边形的重叠面积,并输出结果delete[] coordsA;// 释放数组内存delete[] coordsB;return 0;
}
//判断一个双精度浮点数x是否为0,如果小于一个极小的值eps,则认为x是0
int dcmp(double x)
{if (x > eps) return 1;return x < -eps ? -1 : 0;
}
// 参数:width - 数组的宽度,height - 数组的高度
double** CreateDoubleDimensionalArray(int width, int height)
{// 创建一个指向指针的数组double** NewDoubleDimensionalArray = new double* [width];// 遍历每个指针,分配指向 double 的内存for (int i = 0; i < width; i++){NewDoubleDimensionalArray[i] = new double[height];}// 遍历每个数组元素,初始化为 0for (int i = 0; i < width; i++){for (int j = 0; j < height; j++){NewDoubleDimensionalArray[i][j] = 0;}}// 返回指向创建的二维数组的指针return NewDoubleDimensionalArray;
}//删除动态分配的二维数组
void DeleteDoubleDimensionalArray(double**& _DoubleDimensionalArray, int width)
{//_DoubleDimensionalArray:要删除的二维数组的地址,是一个指向指针的引用//width:二维数组的宽度//如果传入的指针为空指针或者 width 为0,直接返回。if (_DoubleDimensionalArray == nullptr|| width==0)return;//循环 width 次,释放每一行所指向的动态内存。for (int i = 0; i < width; i++){delete[] _DoubleDimensionalArray[i];}delete[] _DoubleDimensionalArray;//释放一维动态内存。_DoubleDimensionalArray = nullptr;//将指针指向空指针
}// 叉积
double cross(double ax, double ay, double bx, double by, double cx, double cy)
{return (ax - cx) * (by - cy) - (bx - cx) * (ay - cy);
}/*计算两条直线的交点坐标ax, ay, bx, by: 直线1的两个端点坐标cx, cy, dx, dy: 直线2的两个端点坐标retx, rety: 交点的坐标*/
void intersectionPoint(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy, double& retx, double& rety)
{// 先假设直线1的起点为交点坐标double px = ax;double py = ay;// 计算直线1和直线2的交点在直线1上的位置,即参数tdouble t = ((ax - cx) * (cy - dy) - (ay - cy) * (cx - dx)) / ((ax - bx) * (cy - dy) - (ay - by) * (cx - dx));// 根据参数t计算交点坐标px += (bx - ax) * t;py += (by - ay) * t;// cout << "intersection p.x=" << px << ", p.y=" << py << endl;查看交点坐标的计算结果// return p;// 返回交点坐标retx = px;rety = py;
}double PolygonArea(double* p, int n)
{// 如果多边形点数小于 3,面积为0if (n < 3)return 0.0;// 创建一个 n 行 2 列的二维动态数组,存储点坐标double** temp = CreateDoubleDimensionalArray(n, 2);// 将多边形的点坐标复制到动态数组 temp 中for (int i = 0; i < n; i++){temp[i][0] = p[i * 2];// 第 i 个点的横坐标temp[i][1] = p[i * 2 + 1];// 第 i 个点的纵坐标}// 计算多边形的面积double s = temp[0][1] * (temp[n - 1][0] - temp[1][0]);for (int i = 1; i < n - 1; i++) {s += temp[i][1] * (temp[i - 1][0] - temp[i + 1][0]);}s += temp[n - 1][1] * (temp[n - 2][0] - temp[0][0]);// cout << "s =" << s << endl;//输出多边形的有向面积// 释放动态数组 temp 占用的内存DeleteDoubleDimensionalArray(temp, n);// 返回多边形的面积(取绝对值)return fabs(s * 0.5);
}double ConvexPolygonIntersectArea(double* aaa, double* bbb, int na, int nb)
{// 创建大小为na x 2的double类型二维数组adouble** a = CreateDoubleDimensionalArray(na, 2);// 创建大小为nb x 2的double类型二维数组bdouble** b = CreateDoubleDimensionalArray(nb, 2);// 初始化变量asize和bsizeint asize = na;int bsize = nb;// 将aaa数组中的值复制到数组a中for (int i = 0; i < na; i++){a[i][0] = aaa[i * 2];a[i][1] = aaa[i * 2 + 1];}// 将bbb数组中的值复制到数组b中for (int i = 0; i < nb; i++){b[i][0] = bbb[i * 2];b[i][1] = bbb[i * 2 + 1];}/*Point p[20], tmp[20];int tn, sflag, eflag;memcpy(p, b, sizeof(Point) * (nb));*/// 创建大小为20 x 2的double类型二维数组p和tmpdouble** p = CreateDoubleDimensionalArray(20, 2);double** tmp = CreateDoubleDimensionalArray(20, 2);// 初始化变量tn, sflag, eflagint tn = 0, sflag = 0, eflag = 0;// 将数组b中的值复制到数组p中for (int i = 0; i < nb; i++){p[i][0] = b[i][0];p[i][1] = b[i][1];}/*for (int i = 0; i < nb; i++){printf("%lf %lf", p[i][0], p[i][1]);}*/// 遍历a数组for (int i = 0; i < na && nb > 2; i++){// 计算sflag值if (i == na - 1) {sflag = dcmp(cross(a[0][0], a[0][1], p[0][0], p[0][1], a[i][0], a[i][1]));}else {sflag = dcmp(cross(a[i + 1][0], a[i + 1][1], p[0][0], p[0][1], a[i][0], a[i][1]));}// 遍历p数组,计算tn和eflag值for (int j = tn = 0; j < nb; j++, sflag = eflag){if (sflag >= 0) {// tmp[tn++] = p[j];// 将p[j]的值复制到tmp[tn]中,并将tn加1tmp[tn][0] = p[j][0];tmp[tn][1] = p[j][1];tn++;}// 计算eflag值if (i == na - 1) {// 判断当前边是否为多边形最后一条边if (j == nb - 1) {// 判断当前线段是否为目标多边形的最后一条边//判断当前边与目标多边形的最后一条边是否相交eflag = dcmp(cross(a[0][0], a[0][1], p[0][0], p[0][1], a[i][0], a[i][1]));}else {// 判断当前边与目标多边形的下一条边是否相交eflag = dcmp(cross(a[0][0], a[0][1], p[j + 1][0], p[j + 1][1], a[i][0], a[i][1]));}}else {if (j == nb - 1) {// 判断当前边的下一条边与目标多边形的最后一条边是否相交eflag = dcmp(cross(a[i + 1][0], a[i + 1][1], p[0][0], p[0][1], a[i][0], a[i][1]));}else {// 判断当前边的下一条边与目标多边形的下一条边是否相交eflag = dcmp(cross(a[i + 1][0], a[i + 1][1], p[j + 1][0], p[j + 1][1], a[i][0], a[i][1]));}}if ((sflag ^ eflag) == -2) {// 判断当前边是否与目标多边形的边有唯一的交点// 将当前边与目标多边形的边的交点加入到tmp数组中if (i == na - 1) {if (j == nb - 1) {// tmp[tn++] = intersection(a[i], a[0], p[j], p[0]); //求交点intersectionPoint(a[i][0], a[i][1], a[0][0], a[0][1], p[j][0], p[j][1], p[0][0], p[0][1], tmp[tn][0], tmp[tn][1]);tn++;}else {// tmp[tn++] = intersection(a[i], a[0], p[j], p[j + 1]);intersectionPoint(a[i][0], a[i][1], a[0][0], a[0][1], p[j][0], p[j][1], p[j + 1][0], p[j + 1][1], tmp[tn][0], tmp[tn][1]);tn++;}}else {if (j == nb - 1) {// tmp[tn++] = intersection(a[i], a[i + 1], p[j], p[0]);intersectionPoint(a[i][0], a[i][1], a[i+1][0], a[i+1][1], p[j][0], p[j][1], p[0][0], p[0][1], tmp[tn][0], tmp[tn][1]);tn++;}else {// tmp[tn++] = intersection(a[i], a[i + 1], p[j], p[j + 1]);intersectionPoint(a[i][0], a[i][1], a[i + 1][0], a[i + 1][1], p[j][0], p[j][1], p[j + 1][0], p[j + 1][1], tmp[tn][0], tmp[tn][1]);tn++;}}}}// memcpy(p, tmp, sizeof(Point) * tn);for (int i = 0; i < tn; i++){p[i][0] = tmp[i][0];p[i][1] = tmp[i][1];}nb = tn;p[nb][0] = p[0][0];p[nb][1] = p[0][1];}DeleteDoubleDimensionalArray(a, asize);DeleteDoubleDimensionalArray(b, bsize);double* tempp = new double[nb * 2];for (int i = 0; i < nb; i++){tempp[i * 2] = p[i][0];tempp[i * 2 + 1] = p[i][1];}DeleteDoubleDimensionalArray(p, 20);DeleteDoubleDimensionalArray(tmp, 20);// return PolygonArea(tempp, nb);// for (int i = 0; i < nb * 2; i++)// {// 	printf("%lf ", tempp[i]);// }// printf("\n");double S = PolygonArea(tempp, nb);delete[] tempp;return S;	
}float intersection(const Polygon& A, const Polygon& B)
{// 为 A 和 B 分别创建一个二维数组 a 和 b,分别存储 A 和 B 的顶点坐标double** a = CreateDoubleDimensionalArray(A.getVertex(), 2);double** b = CreateDoubleDimensionalArray(B.getVertex(), 2);// 将 A 和 B 的顶点坐标存储到 a 和 b 数组中for (int i = 0; i < A.getVertex(); i++){a[i][0] = A.getPolygon()[i * 2];a[i][1] = A.getPolygon()[i * 2 + 1];}for (int i = 0; i < B.getVertex(); i++){b[i][0] = B.getPolygon()[i * 2];b[i][1] = B.getPolygon()[i * 2 + 1];}int i = 0, j = 0;// Point* t1 = new Point[na];// Point* t2 = new Point[nb];// memset(t1, 0, sizeof(Point) * na);// memset(t2, 0, sizeof(Point) * nb);// 为 A 和 B 分别创建一个二维数组 t1 和 t2,分别存储 A 和 B 的三角形顶点坐标double** t1 = CreateDoubleDimensionalArray(A.getVertex(), 2);double** t2 = CreateDoubleDimensionalArray(B.getVertex(), 2);double res = 0, num1 = 0, num2 = 0;// t1[0] = a[0], t2[0] = b[0];// 初始化 t1 和 t2 数组的第一个元素t1[0][0] = a[0][0];t1[0][1] = a[0][1];t2[0][0] = b[0][0];t2[0][1] = b[0][1];// 对于 A 的每个三角形,以及 B 的每个三角形,计算它们的交集面积for (i = 2; i < A.getVertex(); i++){// t1[1] = a[i - 1], t1[2] = a[i];t1[1][0] = a[i - 1][0];t1[1][1] = a[i - 1][1];t1[2][0] = a[i][0];t1[2][1] = a[i][1];num1 = dcmp(cross(t1[1][0], t1[1][1], t1[2][0], t1[2][1], t1[0][0], t1[0][1]));if (num1 < 0){// swap(t1[1], t1[2]);// 交换 t1 数组的第二个和第三个元素double tx = t1[1][0];double ty = t1[1][1];t1[1][0] = t1[2][0];t1[1][1] = t1[2][1];t1[2][0] = tx;t1[2][1] = ty;}for (j = 2; j < B.getVertex(); j++)// 从2开始循环B的所有顶点{// t2[1] = b[j - 1], t2[2] = b[j];// 将b[j-1]和b[j]保存到t2数组中t2[1][0] = b[j - 1][0];t2[1][1] = b[j - 1][1];t2[2][0] = b[j][0];t2[2][1] = b[j][1];// 计算三角形t2的有向面积并判断是否需要交换t2的两个顶点num2 = dcmp(cross(t2[1][0], t2[1][1], t2[2][0], t2[2][1], t2[0][0], t2[0][1]));if (num2 < 0){// swap(t2[1], t2[2]);// 如果t2的两个顶点需要交换,则交换它们double tx = t2[1][0];double ty = t2[1][1];t2[1][0] = t2[2][0];t2[1][1] = t2[2][1];t2[2][0] = tx;t2[2][1] = ty;}// res += CPIA(t1, t2, 3, 3) * num1 * num2; // 计算两个三角形的交集面积并加到结果res中double* tempp1 = new double[6];double* tempp2 = new double[6];for (int i = 0; i < 3; i++){// 将A和t1的顶点坐标保存到tempp1数组中tempp1[i * 2] = t1[i][0];tempp1[i * 2 + 1] = t1[i][1];// 将B和t2的顶点坐标保存到tempp2数组中tempp2[i * 2] = t2[i][0];tempp2[i * 2 + 1] = t2[i][1];}res += ConvexPolygonIntersectArea(tempp1, tempp2, 3, 3) * num1 * num2;// 调用ConvexPolygonIntersectArea函数计算两个三角形的交集面积并乘上权值num1和num2,再累加到结果res中delete[] tempp1;delete[] tempp2;}}// 释放动态分配的二维数组空间DeleteDoubleDimensionalArray(a, A.getVertex());DeleteDoubleDimensionalArray(b, B.getVertex());DeleteDoubleDimensionalArray(t1, A.getVertex());DeleteDoubleDimensionalArray(t2, B.getVertex());// std::cout << "Sum::res=" << res << endl;// 返回结果return res;
}```cpp
这个代码是用来计算两个凸多边形的重叠面积的。程序首先定义了一个 Polygon 类,它包含了一个多边形的坐标和顶点数,然后定义了一个全局常量 eps,用于表示浮点数的精度,和一个 CreateDoubleDimensionalArray() 函数,用于创建一个二维数组。这个函数会在计算凸多边形的交点时用到。
接下来是一些计算几何的函数。dcmp() 函数用于判断浮点数的大小关系,返回值为 1 表示大于,0 表示等于,-1 表示小于;cross() 函数用于计算向量的叉积,intersectionPoint() 函数用于计算两条线段的交点,PolygonArea() 函数用于计算一个多边形的面积。
最后是主函数。主函数首先读取两个多边形的顶点坐标,并分别创建一个 Polygon 类的实例。然后调用 intersection() 函数计算两个多边形的重叠面积,并输出结果。
intersection() 函数先判断两个多边形是否相交,如果不相交就直接返回重叠面积为 0。如果相交了,就先求出两个多边形的所有交点,然后计算重叠面积。具体做法是把交点和原始多边形的顶点按顺序连接起来,得到一个新的多边形,然后计算这个多边形的面积即可。
它定义了一个Polygon类,该类存储多边形顶点的坐标及其顶点数。交集函数以两个多边形对象为参数,并以浮点形式返回两个多边形的交集区域。
该程序使用Shoelace公式计算多边形的面积,使用线相交法计算两个多边形的相交面积。PolygonArea函数计算多边形的面积,ConvexPolygonIntersectArea函数计算两个凸多边形的相交面积。
dcmp函数用于比较eps公差较小的双精度浮点数。CreateDoubleDimensionalArray和DeleteDoubleDimensional array函数用于创建和销毁双精度的二维数组。
大体上,使用两个凸多边形的坐标创建两个多边形对象。使用这两个对象作为参数调用交集函数,并将交集区域打印到控制台。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部