Зажим вектор до минимума и максимума?
Вопрос
Я пришел 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;
}
Надеюсь, это поможет.