Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将向量钳制到最小值和最大值?_C++_C_Algorithm_Clamp - Fatal编程技术网

C++ 将向量钳制到最小值和最大值?

C++ 将向量钳制到最小值和最大值?,c++,c,algorithm,clamp,C++,C,Algorithm,Clamp,我是这样来的: t=夹具(t/d,0,1) 但我不知道如何在向量上执行这个操作。如果编写自己的向量实现,那么钳制向量的步骤是什么 谢谢 将向量钳制到最小值和最大值 例: 编辑 最小值和最大值通常是向量的基本运算。例如,如果使用SSE向量,x86上会有\u mm\u min\u ps和\u mm\u max\u ps内部函数,它们会变成MINPS和MAXPS指令 编辑 最小值和最大值通常是向量的基本运算。例如,如果您使用SSE向量,在x86上会有\u mm\u min\u ps和\u mm\u m

我是这样来的: t=夹具(t/d,0,1) 但我不知道如何在向量上执行这个操作。如果编写自己的向量实现,那么钳制向量的步骤是什么

谢谢

将向量钳制到最小值和最大值

例:

编辑

最小值和最大值通常是向量的基本运算。例如,如果使用SSE向量,x86上会有\u mm\u min\u ps\u mm\u max\u ps内部函数,它们会变成MINPSMAXPS指令

编辑


最小值和最大值通常是向量的基本运算。例如,如果您使用SSE向量,在x86上会有\u mm\u min\u ps\u mm\u max\u ps内部函数,它们会变成MINPSMAXPS指令。

我认为,一旦您明确说明了您的意思,您会发现大部分工作都为您完成了

我猜你想限制向量数量(而不是向量数据结构)的长度在指定范围内,而不改变其方向,不是吗

因此:

if(v.length>max)
v、 设置长度(最大值)
否则如果(v.长度<最小值)
v设定长度(分钟)
其中
length()
setlength()
的实现取决于向量的存储方式



如果向量以(角度、大小)的形式存储,这几乎是微不足道的。如果以笛卡尔形式(即(x,y,z))存储,则从毕达哥拉斯定理中获得
长度
,并且
设置长度
应按
所需长度/当前长度

的因子缩放每个组件。我认为,一旦你明确说明了你的意思,你会发现大部分工作都为你完成了

我猜你想限制向量数量(而不是向量数据结构)的长度在指定范围内,而不改变其方向,不是吗

因此:

if(v.length>max)
v、 设置长度(最大值)
否则如果(v.长度<最小值)
v设定长度(分钟)
其中
length()
setlength()
的实现取决于向量的存储方式



如果向量以(角度、大小)的形式存储,这几乎是微不足道的。如果以笛卡尔形式(即(x,y,z))存储,则从毕达哥拉斯定理中获得
长度
,并且
setlength
应按
所需长度/当前长度

的因子对每个元素进行缩放。所以

void clamp(const Vector3 &v, const Vector3 &min, const Vector3 &max)
{
    v.x = clamp(v.x, min.x, max.x);
    v.y = clamp(v.y, min.y, max.y);
    v.z = clamp(v.z, min.z, max.z);
}

int clamp(int value, int min, int max)
{
    if (value < min)
    {
        return min;
    }
    else if (value > max)
    {
        return max;
    }

    return value;
}
无效钳位(常数向量3&v、常数向量3&min、常数向量3&max)
{
v、 x=夹具(v.x,最小x,最大x);
v、 y=夹具(v.y,最小y,最大y);
v、 z=夹具(v.z、最小z、最大z);
}
int钳位(int值、int最小值、int最大值)
{
如果(值<最小值)
{
返回最小值;
}
否则如果(值>最大值)
{
返回最大值;
}
返回值;
}

希望这能有所帮助。

好吧,我假设您希望分别钳制每个坐标。所以

void clamp(const Vector3 &v, const Vector3 &min, const Vector3 &max)
{
    v.x = clamp(v.x, min.x, max.x);
    v.y = clamp(v.y, min.y, max.y);
    v.z = clamp(v.z, min.z, max.z);
}

int clamp(int value, int min, int max)
{
    if (value < min)
    {
        return min;
    }
    else if (value > max)
    {
        return max;
    }

    return value;
}
无效钳位(常数向量3&v、常数向量3&min、常数向量3&max)
{
v、 x=夹具(v.x,最小x,最大x);
v、 y=夹具(v.y,最小y,最大y);
v、 z=夹具(v.z、最小z、最大z);
}
int钳位(int值、int最小值、int最大值)
{
如果(值<最小值)
{
返回最小值;
}
否则如果(值>最大值)
{
返回最大值;
}
返回值;
}


最简单的答案是当你考虑一个球坐标系中的向量:{r,ω,th}。φ和θ已经被限制为[-π,+π]和[-½π,+½π]。因此,你只需要夹住距离原点R.

,最简单的答案是当你考虑一个球坐标系中的向量:{r,ω,th}。φ和θ已经被限制为[-π,+π]和[-½π,+½π]。因此,您只需要钳制距离原点R的距离。

进一步解释函数应该做什么。钳制向量是什么意思?钳制向量的每个条目?将向量自身夹持到R^n中的球体?将向量夹持到最小值和maximum@user146780:最大值和最小值是多少?元素的数量?包含的所有元素的值whithin?内存分配?t和d在这里都是标量。为什么需要钳制向量?只需使用Chris在标量t/d上发布的代码lb=0和ub=1。进一步解释函数应该做什么。钳制向量是什么意思?钳制向量的每个条目?将向量自身夹持到R^n中的球体?将向量夹持到最小值和maximum@user146780:最大值和最小值是多少?元素的数量?包含的所有元素的值whithin?内存分配?t和d在这里都是标量。为什么需要钳制向量?只需使用Chris在标量t/d上发布的代码,lb=0和ub=1。最小和最大函数是什么?@user146780:这是每个人在对你的问题的评论中都在问你的问题!min和max是在C++库中定义的,他们假设<代码>布尔操作程序:min和max函数是什么?@ USS1467:这是每个人在你的问题的评论中所要求的!min和max是在C++库中定义的,它们假设“代码>布尔操作符独立地坐标可以改变向量的方向,这不是我如何解释请求。我在3D图形的上下文中考虑向量。钳制函数在确保点保持在立方体内时可能很有用。我真的不知道他在问什么。即使你想确保向量保持在立方体(或球体)中,你是否想保持方向仍然是个问题。单独夹紧坐标可能会改变向量的方向,这不是我对请求的解释。我在考虑3d图形环境中的向量。钳制功能可能导致b
if (v.length > max)
   v.setlength(max)
else if (v.length < min)
   v. setlength(min)
void clamp(const Vector3 &v, const Vector3 &min, const Vector3 &max)
{
    v.x = clamp(v.x, min.x, max.x);
    v.y = clamp(v.y, min.y, max.y);
    v.z = clamp(v.z, min.z, max.z);
}

int clamp(int value, int min, int max)
{
    if (value < min)
    {
        return min;
    }
    else if (value > max)
    {
        return max;
    }

    return value;
}