数字归一算法
判断一个点是否在三角形中
转至:https://blog.youkuaiyun.com/luoyayun361/article/details/75452667
/** 判断一个点是否在三角形内部
* @brief pointInTriangle
* @param A 三角形交点
* @param B 三角形交点
* @param C 三角形交点
* @param P 点
* @return
*/
bool 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) // if u out of range, return directly{
return false;
}
float v = (dot00 * dot12 - dot01 * dot02) * inverDeno ;
if (v < 0 || v > 1) // if v out of range, return directly{
return false;
}
return u + v <= 1;
}
复制黏贴多个QGraphicsItem坐标算法
首先要统一坐标系,笔者统一用的场景坐标系 item->scenePos()
//根据多个点坐标求 它们的中心点
QPointF getCenterPointFromListOfCoordinates(const QList<QPointF>& p)
{
// 抄网上的,忘记了链接
//以下为简化方法(400km以内)
double total = p.size();
double lat = 0, lon = 0;
foreach (auto g, p){
lat += g.x() * M_PI / 180.0;
lon += g.y() * M_PI / 180.0;
}
lat /= total;
lon /= total;
return QPointF(lat * 180.0 / M_PI, lon * 180.0 / M_PI);
}
黏贴后单个item中心坐标 = 复制前的中心坐标 + (场景中鼠标坐标 - 复制前求的item中心坐标)
根据多个坐标,找出它们的中心点
在网上看的转载贴,不知道原作者是谁。。。
/** 根据多个坐标,找出它们的中心点
* @brief RobomapHelper::getCenterPointFromListOfCoordinates
* @param p
* @return
*/
QPointF RobomapHelper::getCenterPointFromListOfCoordinates(const QList<QPointF>& p)
{
double total = p.size();
double lat = 0, lon = 0;
foreach (auto g, p){
lat += g.x() * M_PI / 180.0;
lon += g.y() * M_PI / 180.0;
}
lat /= total;
lon /= total;
return QPointF(lat * 180.0 / M_PI, lon * 180.0 / M_PI);
}
根据圆上任意3点求圆心坐标和半径
/** 根据圆上任意3点求圆心坐标和半径
* @brief RouteCommon::arcRoundCenterPoint
* @param p1 圆上点1
* @param p2 圆上点2
* @param p3 圆上点3
* @param centerPos 返回圆心点
* @param r 返回半径
* @return
*/
bool RouteCommon::arcRoundCenterPoint(const QPointF &p1, const QPointF &p2, const QPointF &p3, QPointF ¢erPos, qreal &r)
{
qreal a = p1.x()*(p2.y() - p3.y())
- p1.y()*(p2.x() - p3.x())
+ p2.x() * p3.y()
- p3.x()*p2.y();
qreal b = (p1.x()*p1.x()+p1.y()*p1.y()) * (p3.y()-p2.y())
+ (p2.x()*p2.x() + p2.y()*p2.y()) * (p1.y()-p3.y())
+ (p3.x()*p3.x() + p3.y()*p3.y()) * (p2.y()-p1.y());
qreal c = (p1.x()*p1.x()+p1.y()*p1.y()) * (p2.x()-p3.x())
+ (p2.x()*p2.x() + p2.y()*p2.y()) * (p3.x()-p1.x())
+ (p3.x()*p3.x() + p3.y()*p3.y()) * (p1.x()-p2.x());
qreal d = (p1.x()*p1.x()+p1.y()*p1.y()) * (p3.x()*p2.y() - p2.x()*p3.y())
+ (p2.x()*p2.x() + p2.y()*p2.y()) * (p1.x()*p3.y() - p3.x()*p1.y())
+ (p3.x()*p3.x() + p3.y()*p3.y()) * (p2.x()*p1.y() - p1.x()*p2.y());
qreal x = -b/(2.0 *a);
qreal y = -c/(2.0*a);
r = qSqrt((b*b+c*c-4.0*a*d)/(4.0*a*a));
centerPos.setX(x);
centerPos.setY(y);
return true;
}
求2点位置距离
还有一种用QLineF.length()
/** 求2点位置距离
* @brief RouteCommon::posDistance
* @param p1
* @param p2
* @return
*/
qreal RouteCommon::posDistance(QPointF p1, QPointF p2)
{
QPointF tp = p1-p2;
return qSqrt(tp.x()*tp.x()+tp.y()*tp.y());
}
根据3点算o点夹角
/** 根据3点算o点夹角
* @brief RobomapHelper::angleByPoints
* @param o 夹角点坐标
* @param first
* @param second
* @param 返回 angle
* @return
*/
bool RobomapHelper::angleByPoints(const QPointF &o, const QPointF &first, const QPointF &second, qreal &angle)
{
qreal dsx, dsy, dex, dey;
dsx = first.x() - o.x();
dsy = first.y() - o.y();
dex = second.x() - o.x();
dey = second.y() - o.y();
qreal c = qSqrt(dsx * dsx + dsy * dsy) * qSqrt(dex * dex + dey * dey);
if (0 == c) return false;
angle = qAcos((dsx * dex + dsy * dey) / c);
angle = qRadiansToDegrees(angle);
return true;
}