Вопрос

Я пришел Accross это: t = clamm (t / d, 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))
Это было полезно?

Решение

clamp(vec, lb, ub) == min(max(vec, lb), ub)

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

Мин и Макс, как правило, примитивные операции на векторах. Например, если вы используете векторы SSE, есть _mm_min_ps. а также _mm_max_ps. Внутрисины, которые превращаются в Минпс а также Maxps. Инструкции на X86.

Другие советы

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

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

Так:

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.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top