版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012020854/article/details/83752346
1.数字归一算法
2.判断一个点是否在三角形中
转至:https://blog.csdn.net/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;
}
3.复制黏贴多个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中心坐标)