سؤال

لقد جئت إلى هذا: t = clamp (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)

تعديل

Min و Max عادة ما تكون عمليات بدائية على المتجهات. على سبيل المثال ، إذا كنت تستخدم ناقلات SSE ، فهناك _mm_min_ps و _mm_max_ps الجوهارات التي تتحول إلى minps و 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