计算几何类型题

经典问题一:求n个点围成的多边形的面积

对于凸多边形,很容易计算,如下图,以多边形的某一点为顶点,将其划分成几个三角形,计算这些三角形的面积,然后加起来即可。已知三角形顶点坐标,三角形面积可以利用向量的叉乘来计算。

对于凹多边形,如果还是按照上述方法划分成三角形,如下图,多边形的面积 = S_ABC + S_ACD + S_ADE, 这个面积明显超过多边形的面积。

我们根据二维向量叉乘求三角形ABC面积时,利用的是

这样求出来的面积都是正数,但是向量叉乘是有方向的,即 是有正负的,如果把上面第三个公式中的绝对值符号去掉,即 ,那么面积也是有正负的。反应在上面第二个图中,S = S_ABC + S_ACD + S_ADE,如果S_ABC和S_ADE是正的,那么S_ACD是负的,这样加起来刚好就是多边形的面积。对于凸多边形,所有三角形的面积都是同正或者同负。

如果我们不以多边形的某一点为顶点来划分三角形而是以任意一点,如下图,这个方法也是成立的:S = S_OAB + S_OBC + S_OCD + S_ODE + S_OEA。计算的时候,当我们取O点为原点时,可以简化计算。                        本文地址

当O点为原点时,根据向量的叉积计算公式,各个三角形的面积计算如下:

S_OAB = 0.5*(A_x*B_y - A_y*B_x)   【(A_x,A_y)为A点的坐标】

S_OBC = 0.5*(B_x*C_y - B_y*C_x)

S_OCD = 0.5*(C_x*D_y - C_y*D_x)

S_ODE = 0.5*(D_x*E_y - D_y*E_x)

S_OEA = 0.5*(E_x*A_y - E_y*A_x)

代码如下

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

struct Point2d

{

    double x;

    double y;

    Point2d(double xx, double yy): x(xx), y(yy){}

};

//计算任意多边形的面积,顶点按照顺时针或者逆时针方向排列

double ComputePolygonArea(const vector<Point2d> &points)

{

    int point_num = points.size();

    if(point_num < 3)return 0.0;

    double s = 0;

    for(int i = 0; i < point_num; ++i)

        s += points[i].x * points[(i+1)%point_num].y - points[i].y * points[(i+1)%point_num].x;

    return fabs(s/2.0);

}

该算法还可以优化一下,对上面的式子合并一下同类项

S = S_OAB + S_OBC + S_OCD + S_ODE + S_OEA =

0.5*(A_y*(E_x-B_x) + B_y*(A_x-C_x) + C_y*(B_x-D_x) + D_y*(C_x-E_x) + E_y*(D_x-A_x))

这样减少了乘法的次数,代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

struct Point2d

{

    double x;

    double y;

    Point2d(double xx, double yy): x(xx), y(yy){}

};

//计算任意多边形的面积,顶点按照顺时针或者逆时针方向排列

double ComputePolygonArea(const vector<Point2d> &points)

{

    int point_num = points.size();

    if(point_num < 3)return 0.0;

    double s = points[0].y * (points[point_num-1].x - points[1].x);

    for(int i = 1; i < point_num; ++i)

        s += points[i].y * (points[i-1].x - points[(i+1)%point_num].x);

    return fabs(s/2.0);

}

【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/4047211.html

时间: 2024-10-24 22:32:06

计算几何类型题的相关文章

hdu 1086(计算几何入门题——计算线段交点个数)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7167    Accepted Submission(s): 3480 Problem Description Ma

POJ 2405 Beavergnaw (计算几何-简单题)

Beavergnaw Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6203   Accepted: 4089 Description When chomping a tree the beaver cuts a very specific shape out of the tree trunk. What is left in the tree trunk looks like two frustums of a co

hdu 2987最大权闭合图模板类型题

/* 最大权闭合图模板类型的题,考验对知识概念的理解. 题意:现在要辞退一部分员工,辞退每一个员工可以的到一部分利益(可以是负的),并且辞退员工,必须辞退他的下属,求最大利益和辞退的最小人数. 最大权闭合图模板类型. 求出最大权后沿着源点s,dfs到的点就为最小的人数. 证明/* 转载:利用一个经典的trick:多关键字 > 建图前,对所有b[i],执行变换b[i]=b[i]*10000-1,然后,会惊异地发现, > 此时最大流所对应的方案就是满足辞退最少人数的了. > 为什么?显然,变

字符串类型题

1,Vaild Palindrome 1 bool isPalindrome(string& s) { 2 transform(s.begin(), s.end(), s.begin(), tolower); // 把字符全部转换成小写 3 int left = 0; 4 int right = s.length()-1; 5 while (left < right) { 6 if (!isalnum(s[left])) ++left; 7 else if (!isalnum(s[right

字符串截图类型题

//第1题 请判断images中存储的图片格式(例如,第X个为png图片) NSArray *images = @[@"A4E6E10BC0752623.png",@"2DE2C314665048CC.jpg",@"068E12268478787.gif",@"30A030B7C6.jpg"]; for (int i = 0 ; i < [images count]; i++) { NSString *str = ima

斐波那契数和数小方块的类型题分析方法

一般一眼看不出规律的数或后面的数与前面的数有相应的关系(一般为几个数相加)的题可以用递归的思想做.用f(1).f(2).f(3).f(4)代表第n层或第n个数,写出它们的通用规律(如f(n)=f(n-1)+f(n-2)).对这些代表数(如f(n).f(n-1).f(n-2)等)赋给相应的变量,然后写出n的下一组或上一组的表达式(如f(n+1)=f(n)+f(n-1)),写出相应的变量(不能从新赋新的变量,用刚才赋的变量).这样可以看出这些变量的变化,一般是变量间的赋值.如果不能找出变量的变化,那

【Leet Code】String to Integer (atoi) ——常考类型题

String to Integer (atoi) Total Accepted: 15482 Total Submissions: 106043My Submissions Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yours

leetcode 动态规划类型题

1,Triangle 1 int mininumTotal(vector<vector<int>>& triangle) { 2 for (int i = triangle.size() - 2; i >= 0; --i) { 3 for (int j = 0; j < i + 1; ++j) { 4 // 从下往上依次保存当前路径的最小值,上层只会用到下层的最小值 5 triangle[i][j] += min(triangle[i + 1][j], tria

floyd类型题UVa-10099-The Tourist Guide +Frogger POJ - 2253

The Tourist Guide Mr. G. works as a tourist guide. His current assignment is to take some tourists from one city to another. Some two-way roads connect the cities. For each pair of neighboring cities there is a bus service that runs only between thos