平面多边形凹凸判断(叉乘法)

参照《计算机图形学》一书中的描述,多边形(polygon)是由三个及以上的顶面坐标位置描述的平面图形,这些顶点由多边形的边顺序连接。多边形的一个内角由两个相邻边形成的边界之内的角。如果所有内角均小于180度则称为凸(convex)多边形,否则为凹(concave)多边形。

百度多边形凹凸的判断,主要方法有:凸包法、叉乘法(大于和小于180度的符号相反)、辛普森面积法。这里主要学习下叉乘的运用,并配上 C++ Qt 示例代码。

判断方法:为每一条边建立一个向量,使用相邻边的叉积来测试凹凸性。凸多边形的所有相邻边向量叉积同号。如果出现一些正一些负则为凹多边形。

(网上找的图,可以 ABC 分别看作 xyz。食指指向 x ,手心朝向 y 轴,大拇指向上的方向恰好是 z 的方向)

示例:

void Widget::paintEvent(QPaintEvent *)
{
    //顶点,第一个为凸,第二个为凹
    /*QVector<QPointF> points = QVector<QPointF>()
    <<QPointF(50,50)<<QPointF(150,50)<<QPointF(150,100)
     <<QPointF(100,150)<<QPointF(50,100);*/
    QVector<QPointF> points = QVector<QPointF>()
            <<QPointF(50,50)<<QPointF(150,50)<<QPointF(150,150)
           <<QPointF(100,100)<<QPointF(50,150);
    //第一个点加到尾便于计算
    points.append(points.first());
    //凹标记
    bool concave = false;
    //边向量
    for(int i = 0; i < points.size() - 2; i++)
    {
        const QPointF &p1 = points.at(i);
        const QPointF &p2 = points.at(i + 1);
        const QPointF &p3 = points.at(i + 2);

        int cross_k = (p2.x() - p1.x()) * (p3.y() - p2.y()) -
                (p2.y() - p1.y()) * (p3.x() - p2.x());
        if(cross_k < 0){ //大于还是小于和边向量取的方向有关
            concave = true;
            break;
        }
    }
    //叉乘判断凹凸
    //绘制,红色凹绿色凸
    QPainter painter(this);
    painter.setBrush(concave ? Qt::red : Qt::green);
    painter.drawPolygon(points);
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚建波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值