把点云(点集)里面的点全部标准化到-1到1区间内

为了在OpenGL中便于显示,把待显示的模型的点坐标压缩到-1到1之间。

//寻找点集中最大和最小的x,y,z
vector<Point> Util::findMaxAndMin(vector<Point> v)
{
    vector<Point> vector;
    Point max, min;
    max.x = v[0].x;
    max.y = v[0].y;
    max.z = v[0].z;
    min.x = v[0].x;
    min.y = v[0].y;
    min.z = v[0].z;
    for each (Point var in v)
    {
        if (var.x > max.x)
        {
            max.x = var.x;
        }
        if (var.y > max.y)
        {
            max.y = var.y;
        }
        if (var.z > max.z)
        {
            max.z = var.z;
        }

        if (var.x < min.x)
        {
            min.x = var.x;
        }
        if (var.y < min.y)
        {
            min.y = var.y;
        }
        if (var.z < min.z)
        {
            min.z = var.z;
        }
    }
    vector.push_back(max);
    vector.push_back(min);
    return vector;
}
//进行标准化
vector<Point> Util::normalize1(vector<Point> p)
{
    vector<Point>  point_set = p;
    vector<Point> mm = findMaxAndMin(point_set);
    struct Point max_bound = mm[0];
    struct Point min_bound = mm[1];
    double middlex, middley, middlez;
    middlex = (max_bound.x + min_bound.x) / 2;
    middley = (max_bound.y + min_bound.y) / 2;
    middlez = (max_bound.z + min_bound.z) / 2;
    for (int i = 0; i < point_set.size(); i++) {
        point_set[i].x = point_set[i].x - middlex;
        point_set[i].y = point_set[i].y - middley;
        point_set[i].z = point_set[i].z - middlez;
    }
    //scale based on x range
    double scalecoe = (max_bound.x - min_bound.x) / 2;
    for (int i = 0; i < point_set.size(); i++) {
        point_set[i].x = point_set[i].x / scalecoe;
        point_set[i].y = point_set[i].y / scalecoe;
        point_set[i].z = point_set[i].z / scalecoe;
    }
    return point_set;
}
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值