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.

  • 相关阅读:
    开源项目
    获取手机剩余空间工具类
    圆形图片
    gridview添加header
    Eclipse中10个最有用的快捷键组合
    那些年不错的Android开源项目(转)
    Android 获取系统或SDCARD剩余空间信息(转)
    android之 Activity跳转出现闪屏
    解决Activity启动黑屏及设置android:windowIsTranslucent不兼容activity切换动画问题
    Android studio 导入工程 出现错误
  • 原文地址:https://www.cnblogs.com/Torstan/p/2580569.html
Copyright © 2011-2022 走看看