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.

  • 相关阅读:
    eclipse的优化 gc.log
    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
    JVM系列三:JVM参数设置、分析
    热加载
    彻底理解JAVA动态代理
    Linux下查看Web服务器当前的并发连接数和TCP连接状态
    个人博客 V0.0.3 版本 ...
    HTML5本地存储——IndexedDB(一:基本使用)
    如何在Blog中加入Google Analytics
    webpack中实现按需加载
  • 原文地址:https://www.cnblogs.com/Torstan/p/2580569.html
Copyright © 2011-2022 走看看