QT-判断鼠标落在三角形区域里面还是外边

在平面上如何判断鼠标是否落在固定的三角形区域内:

#ifndef JUDGETRIANGLEIN_H
#define JUDGETRIANGLEIN_H

#include <QWidget>
#include <QMouseEvent>
#include <QDebug>
#include <QPainter>
#include <QPaintEvent>
#include <QPolygon>
#include <QVector2D>
namespace Ui {
class JudgeTriangleIn;
}

class JudgeTriangleIn : public QWidget
{
    Q_OBJECT
protected:
    void mouseMoveEvent(QMouseEvent *event);
    bool pointInTriangle(QVector2D A,QVector2D B,QVector2D C,QVector2D P);
    void drawTriangle(QPainter *painter);
    void paintEvent(QPaintEvent *event);
public:
    void memberInt();
private:
    int A_X;
    int A_Y;
    int B_X;
    int B_Y;
    int C_X;
    int C_Y;
public:
    explicit JudgeTriangleIn(QWidget *parent = 0);
    ~JudgeTriangleIn();

private:
    Ui::JudgeTriangleIn *ui;
};

#endif // JUDGETRIANGLEIN_H
#include "judgetrianglein.h"
#include "ui_judgetrianglein.h"
void JudgeTriangleIn::mouseMoveEvent(QMouseEvent *event)
{
    //qDebug()<<"X="<<event->x()<<"y="<<event->y();
    float P_X = event->x();
    float P_Y = event->y();
    if(pointInTriangle(QVector2D(A_X,A_Y),\
            QVector2D(B_X,B_Y),QVector2D(C_X,C_Y),QVector2D(P_X,P_Y)))
    {
        qDebug()<<"mouseInside";
    }
    else
    {
        qDebug()<<"mouseOutside";
    }
}

bool JudgeTriangleIn::pointInTriangle(QVector2D A, QVector2D B, QVector2D C, QVector2D P)
{
    QVector2D v0 = C - A;
    QVector2D v1 = B - A;
    QVector2D v2 = P - A;
    float dot00 = QVector2D::dotProduct(v0, v0);
    float dot01 = QVector2D::dotProduct(v0, v1);
    float dot02 = QVector2D::dotProduct(v0, v2);
    float dot11 = QVector2D::dotProduct(v1, v1);
    float dot12 = QVector2D::dotProduct(v1, v2);
    float inverDeno = 1 / (dot00 * dot11 - dot01 * dot01);
    float u = (dot11 * dot02 - dot01 * dot12) * inverDeno ;
    if (u < 0 || u > 1)
    {
        return false;
    }
    float v = (dot00 * dot12 - dot01 * dot02) * inverDeno ;
    if (v < 0 || v > 1)
    {
        return false;
    }
    return u + v <= 1;
}

void JudgeTriangleIn::drawTriangle(QPainter *painter)
{
#if 0
    painter->setPen(Qt::red);
    painter->drawLine(A_X,A_Y,B_X,B_Y);
    painter->drawLine(A_X,A_Y,C_X,C_Y);
    painter->drawLine(C_X,C_Y,B_X,B_Y);
#endif
    QPolygon pts;
    pts.setPoints(3,A_X,A_Y,B_X,B_Y,C_X,C_Y);
    painter->drawConvexPolygon(pts);
}

void JudgeTriangleIn::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    drawTriangle(&painter);
}

void JudgeTriangleIn::memberInt()
{
     A_X = 0;
     A_Y = 0;
     B_X = 300;
     B_Y = 0;
     C_X = 0;
     C_Y = 400;
}

JudgeTriangleIn::JudgeTriangleIn(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::JudgeTriangleIn)
{
    ui->setupUi(this);   
    memberInt();
    this->setMouseTracking(true);
}

JudgeTriangleIn::~JudgeTriangleIn()
{
    delete ui;
}

效果如下:
在这里插入图片描述
在这里插入图片描述
当鼠标在三角形区域外时打印:mouseOutside
当鼠标在三角形区域内时打印:mouseInside

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值