zoukankan      html  css  js  c++  java
  • a fast algorithm to compute the area of a polygon

    Assume there is a polygon (v1, v2,...vn), where vi, (1<=i<=n) are its vertices. What is the area of this polygon?

    We have learnt cross product, which can be used to calculate the area of a triangle. We can also use this to calculate the area of a polygon by dividing the polygon with n segments into triangles. So the question is how to divide the polygon into triangles. We can choose a vertex A, and connect this vertex, A, to the vertices of the polygon. 

    There are various ways to achieve this which need proving. One way is use one vertex of the polygon as vertex A. Another way is to choose origin (0, 0) as vertex A. We can connect A(0, 0) with vi (1<=i<=n) to form triangles, A-v1-v2, A-v2-v3, A-v3-v4,...A-vn-1-vn, A-vn-v1. We can sum all the areas of these triangle, and the sum is 2 times the size of the area of polygon, labled as S.

    2*S = |S(A-v1-v2) + S(A-v2-v3)+...+S(A-vn-1-vn)+S(A-vn-v1)|

          = |x1y2-x2y1 + x2y3-x3y2 +...+ x(n-1)yn-xny(n-1)+xny1-x1yn|

    which needs 2*n multiplications of double type.

    We can reduce the calling of mulplications of double type to n by an observation, x2y2-x1y1 + x3y3-x2y2 + ... + ynxn - x(n-1)y(n-1) + x1y1 - xnyn = 0.

    So  2*S = |x1y2-x2y1 + x2y3-x3y2 +...+ x(n-1)yn-xny(n-1)+xny1-x1yn     +   x2y2-x1y1 + x3y3-x2y2 + ... + ynxn - x(n-1)y(n-1) + x1y1 - xnyn |

                = |(x1+x2)*(y2-y1) + (x2+x3)(y3-y2) +...+(x(n-1)+xn)*(yn-y(n-1)) + (xn+x1)*(y1-yn)|

    which needs n multiplications of double type. This is the fast algorithm I have seen to compute the area of a polygon.

  • 相关阅读:
    《2019年软件工程助教培训计划》
    地铁线路项目-结对编程
    预培训-个人项目(地铁线路规划)
    粗读《构建之法》后的问题
    netapp 修改IP地址
    jump server 2.6.1 安装与配置
    CCNA-实验1-Manage_IOS
    系统结构综合实践期末大作业 第22组
    2017级系统综合实践第7次实践作业 01组
    2017级系统综合实践第6次实践作业 01组
  • 原文地址:https://www.cnblogs.com/Torstan/p/2580569.html
Copyright © 2011-2022 走看看