Cruise007
论坛版主
论坛版主
  • 最后登录2020-10-19
  • 发帖数100
  • 金币4145枚
  • 贡献勋章0枚
  • 原创写手
  • 喜欢达人
  • 社区居民
  • 忠实会员
阅读:407回复:1

多点构成轮廓计算轮廓顺时针逆时针方法

楼主#
更多 发布于:2020-03-30 19:52
一、基本原理:shoelace formula

图片:1-2.jpg



结论:去掉上述计算S中的绝对值,让其有正负,判断逆顺:
   点序为顺, 面积为负值。
   点序为逆,面积为正值。
   所以可以根据上述公式计算出来的面积的正负值,来判断多边形是顺时针还是逆时针。

疑问:分析代码中为什么返回值    (area+1) / 2 要多加一个1?(觉得应该是 -1)
    注意上述中点的坐标都是整数,函数的返回值也为整形。
    即如果不+1,当area = -1 时候,函数返回值为 0,即winding = 1 。那么,此时这个多边形就不会被判断为洞了。
    而+1以后,当area = -2 和 -1时候,函数返回值均为 0,即winding = 1 。那么,此时依然不能正确判断多边形。
    而如果是-1 ,当area = -1 的时候,函数返回-1,即winding = -1,能正确判断多边形顺逆。
    既然是这么麻烦,为什么不直接返回 area ? 直接通过area的正负来判断顺逆不是更简单?

二、参考代码

static int calcAreaOfPolygon2D(const int* verts, const int nverts)
{
   int area = 0;
    for (int i = 0, j = nverts-1; i < nverts; j=i++)
    {
        const int* vi = &verts[i*4];    // 后一个点 相当于Pi+1
        const int* vj = &verts[j*4];    // 前一个点 相当于Pi
        // 相当于 (xi+1 * yi - xi * yi+1)  正好是 没有绝对值的公式1 的 相反数 。(xz平面)。
        area += vi[0] * vj[2] - vj[0] * vi[2];// area正为顺时针, 负为逆时针。
    }
    return (area+1) / 2;
}
喜欢4

最新打赏:0人

努力到无能为力,拼搏到感动自己
2279818087
技术员
技术员
  • 最后登录2020-10-18
  • 发帖数141
  • 金币359枚
  • 贡献勋章0枚
  • 社区居民
沙发#
发布于:2020-03-31 09:56
谢谢分享!.......
游客

返回顶部
支付

欢迎打赏,请选择打赏金额

  • 1元
  • 6元
  • 10元
  • 66元
  • 100元

支付即代表同意《本站支付协议》 有疑问请联系客服