【问题标题】:Clamping a vector to a minimum and maximum?将向量钳制到最小值和最大值?
【发布时间】:2013-08-18 16:45:48
【问题描述】:

我遇到了这个: t = 钳位 (t/d, 0, 1) 但我不确定如何对向量执行此操作。如果一个人正在编写自己的向量实现,那么钳位向量的步骤是什么?

谢谢

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

例如:

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))

【问题讨论】:

  • 进一步解释该函数应该做什么。
  • 钳位向量是什么意思?钳制向量的每个条目?将向量本身夹在 R^n 中的球体上?
  • 将向量限制为最小和最大
  • @user146780:最大和最小什么?元素数量?所有元素的值包含在哪里?已分配内存?
  • t 和 d 在这里都是标量。为什么需要钳位向量?只需使用 Chris 在下面发布的代码,在 lb = 0 和 ub = 1 的标量 t/d 上。

标签: c++ c algorithm clamp


【解决方案1】:

我认为,一旦你清楚地说明你的意思,你会发现大部分工作都是为你完成的......

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

所以:

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

length()setlength() 的实现取决于您存储向量的方式。


如果您的矢量以(角度,幅度)形式存储,这几乎是微不足道的。如果以笛卡尔形式存储(即 (x,y,z) ),您会从勾股定理得到lengthsetlength 应该将每个组件缩放desired_length/current_length

【讨论】:

    【解决方案2】:
    clamp(vec, lb, ub) == min(max(vec, lb), ub)
    

    编辑

    min 和 max 通常是向量上的原始操作。例如,如果您使用 SSE 向量,则有 _mm_min_ps_mm_max_ps 内在函数会变成 MINPSMAXPS x86 上的说明。

    【讨论】:

    • 什么是最小值和最大值函数?
    • @user146780:这就是 cmets 中每个人都在问你的问题!
    • min和max在的c++库中定义
    • 他们假设bool operator&lt;(T, T) 存在。通常它们不存在于向量中。是 (-1,0,0)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      好吧,我假设您想要单独钳制每个坐标。所以...

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

      希望对您有所帮助。

      【讨论】:

      • 独立夹紧坐标可能会改变矢量的方向,这不是我解释请求的方式。
      • 我在考虑 3d 图形上下文中的矢量。钳制函数在确保点保留在立方体内时可能很有用。我真的不知道他在问什么。
      • 即使您想确保矢量保持在立方体(或球体)中,仍然存在是否要保持方向的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2020-06-02
      • 2015-10-11
      • 1970-01-01
      • 2012-02-10
      • 2023-04-02
      相关资源
      最近更新 更多