Зажимать вектор на минимум и максимум? - PullRequest
1 голос
/ 09 июня 2010

Я наткнулся на это: т = зажим (т / д, 0, 1) но я не уверен, как выполнить эту операцию над вектором. Каковы шаги для фиксации вектора, если каждый писал свою собственную реализацию вектора?

Спасибо

зажим, зажимающий вектор к минимуму и максимуму

например:

pc = # the point you are coloring now
p0 = # start point
p1 = # end point
v = p1 - p0
d = Length(v)
v = Normalize(v) # or Scale(v, 1/d)

v0 = pc - p0

t = Dot(v0, v)
t = Clamp(t/d, 0, 1)

color = (start_color * t) + (end_color * (1 - t))

Ответы [ 4 ]

4 голосов
/ 09 июня 2010

Я думаю, что, как только вы четко заявите, что вы имеете в виду, вы обнаружите, что большая часть работы сделана для вас ...

Я предполагаю, что вы хотите ограничить длину векторной величины (а не структуру векторных данных), чтобы она лежала в пределах указанного диапазона без изменения его направления, нет?

Итак:

if (v.length > max)
   v.setlength(max)
else if (v.length < min)
   v. setlength(min)

, где реализация length() и setlength() зависит от того, как вы сохранили свой вектор.


Если ваш вектор хранится в форме (угол, величина), это почти тривиально. Если хранится в декартовой форме (т. Е. (X, y, z)), вы получаете length из теоремы Пифагора и setlength должны масштабировать каждый компонент с коэффициентом desired_length/current_length.

4 голосов
/ 09 июня 2010
clamp(vec, lb, ub) == min(max(vec, lb), ub)

редактировать

min и max обычно являются примитивными операциями над векторами. Например, если вы используете векторы SSE, есть _mm_min_ps и _mm_max_ps встроенных функций, которые превращаются в инструкции MINPS и MAXPS в x86 .

0 голосов
/ 10 июня 2010

Самый простой ответ - когда вы рассматриваете вектор в сферической системе координат: {R, φ, θ}. φ и θ уже все равно ограничены [-π, + π] и [-½π, + ½π]. Следовательно, вам нужно только зафиксировать расстояние от начала координат R.

0 голосов
/ 09 июня 2010

Ну, я бы предположил, что вы захотите зафиксировать каждую из координат по отдельности.Итак ...

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;
}

Надеюсь, это поможет.

...