用C++; 我试图用C++计算两个任意大小和旋转矩形的相交面积。我发现了一些关于非旋转矩形的信息,但关于旋转矩形和不同大小矩形的信息很少。我想创建一个C/C++程序来实现这一点

用C++; 我试图用C++计算两个任意大小和旋转矩形的相交面积。我发现了一些关于非旋转矩形的信息,但关于旋转矩形和不同大小矩形的信息很少。我想创建一个C/C++程序来实现这一点,c++,computational-geometry,intersection,rectangles,area,C++,Computational Geometry,Intersection,Rectangles,Area,有没有人有任何信息/提示,或者更好的是,有一些简单的代码可以帮助你 提前感谢您的帮助。我认为最简单的方法是使用Sutherland-Hodgman算法将一个矩形剪裁到另一个矩形上: 然后使用鞋带公式找到生成多边形的面积: 利用矩形的特性对您有利。矩形是矩形的!这使得使用三角学或积分来计算它们变得很容易 在你的例子中,使用三角学可能更容易。关于这一点已经有了一个答案(有六个答案),但是OP对交叉点的大致面积感兴趣 如果您需要精确的解决方案,则必须考虑许多角点情况,这使得几何问题很难在数据精度有限的

有没有人有任何信息/提示,或者更好的是,有一些简单的代码可以帮助你


提前感谢您的帮助。

我认为最简单的方法是使用Sutherland-Hodgman算法将一个矩形剪裁到另一个矩形上:

然后使用鞋带公式找到生成多边形的面积:

利用矩形的特性对您有利。矩形是矩形的!这使得使用三角学或积分来计算它们变得很容易

在你的例子中,使用三角学可能更容易。

关于这一点已经有了一个答案(有六个答案),但是OP对交叉点的大致面积感兴趣

如果您需要精确的解决方案,则必须考虑许多角点情况,这使得几何问题很难在数据精度有限的真实计算机上正确解决,例如,请参阅

幸运的是,已经有许多高质量的计算几何库,它们可以使用精确数字的精确计算来解决这类问题。其中之一是,这是许多大学的一个联合项目,经过良好的开发和测试。但是,该库不支持将旋转矩形作为单独的实体-您需要使用常规多边形。因此,您的代码将如下所示:

#include <iostream>
#include <vector>

#include <CGAL/Boolean_set_operations_2.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/Polygon_with_holes_2.h>

using Kernel = CGAL::Exact_predicates_exact_constructions_kernel;
using Polygon = CGAL::Polygon_2<Kernel>;
using PolygonWithHoles = CGAL::Polygon_with_holes_2<Kernel>;
using Point = Polygon::Point_2;

int main()
{
  // ------ define polygon #1
  const std::vector<Point> pts1{/* ... polygon #1 vertices ... */};
  const Polygon p1(pts1.cbegin(), pts1.cend());
  // ------ define polygon #2
  const std::vector<Point> pts2{/* ... polygon #2 vertices ... */};
  const Polygon p2(pts2.cbegin(), pts2.cend());
  // ------ compute intersection - you'll get a single polygon without holes!!!
  std::vector<PolygonWithHoles> res;
  CGAL::intersection(p1, p2, std::back_inserter(res));
  // ------ output area of intersection
  std::cout << res[0].outer_boundary().area() << std::endl;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用Kernel=CGAL::Exact\u谓词\u Exact\u构造\u内核;
使用Polygon=CGAL::Polygon_2;
使用PolygonWithHoles=CGAL::Polygon_with_holes_2;
使用点=多边形::点2;
int main()
{
//----定义多边形#1
常数std::向量pts1{/*…多边形#1顶点…*/};
常量多边形p1(pts1.cbegin(),pts1.cend());
//----定义多边形#2
常数std::向量pts2{/*…多边形#2个顶点…*/};
常量多边形p2(pts2.cbegin(),pts2.cend());
//------计算交点-您将得到一个没有孔的多边形!!!
std::向量res;
CGAL::交叉点(p1、p2、std::背面插入器(res));
//----交叉口的输出面积

std::cout一个完整的工作示例,基于@HEKTO答案:

#包括
#包括
#包括
#包括
使用Kernel=CGAL::Exact\u谓词\u Exact\u构造\u内核;
使用Polygon=CGAL::Polygon_2;
使用Point=CGAL::Point_2;
使用PolygonWithHoles=CGAL::Polygon_with_holes_2;
int main(){
常数std::数组点1{点(1.3,2.5),点(2.7,2.5),点(2.7,5.5),点(1.3,5.5)};
常量多边形多边形多边形1(points1.cbegin(),points1.cend());
常数std::数组点s2({点(1.47,2.65),点(2.63,2.34),点(3.3,4.85),点(2.14,5.16)});
常量多边形多边形多边形2(points2.cbegin(),points2.cend());
向量交点;
CGAL::交叉点(多边形1、多边形2、标准::背面插入器(交叉点));

假设矩形的顶点是x,y坐标,你可以在一个矩形和另一个矩形中寻找由相邻顶点形成的线的交点:查阅数学书,搜索积分和/或三角。我不同意,OP谈到了矩形。矩形有这个例子ny矩形的属性。利用这一点是个好主意。我想如果你试图制定一个比“使用三角法”更具体的答案,你会有不同的感觉。答案很好。它对我有效。我还根据你的答案添加了一个完整的工作示例,作为另一个答案。