算法小技巧

版权声明:本文为博主原创文章,未经博主允许不得转载。 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中心坐标)

猜你喜欢

转载自blog.csdn.net/u012020854/article/details/83752346