在平面上如何判断鼠标是否落在固定的三角形区域内:
#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