مقالات

6.6: مصفوفة الخريطة الخطية


سنرى الآن أن كل خريطة خطية (T in mathcal {L} (V، W) ) ، مع (V ) و (W ) مسافات متجهة ذات أبعاد محدودة ، يمكن ترميزها بواسطة مصفوفة ، والعكس صحيح ، كل مصفوفة تحدد مثل هذه الخريطة الخطية.

لنفترض أن (V ) و (W ) مسافات متجهة ذات أبعاد محدودة ، واجعل (T: V to W ) خريطة خطية. افترض أن ((v_1، ldots، v_n) ) هو أساس (V ) وأن ((w_1، ldots، w_m) ) هو أساس (W ). لقد رأينا في النظرية 6.1.3 أن (T ) يتم تحديده بشكل فريد من خلال تحديد المتجهات (Tv_1 ، ldots ، Tv_n in W ). نظرًا لأن ((w_1، ldots، w_m) ) هو أساس (W ) ، فهناك مقاييس فريدة (a_ {ij} in mathbb {F} ) مثل
ابدأ {المعادلة} التسمية {eq: Tv}
Tv_j = a_ {1j} w_1 + cdots + a_ {mj} w_m quad text {for (1 le j le n ).} tag {6.6.1}
نهاية {المعادلة}
يمكننا ترتيب هذه المقاييس في مصفوفة (م مرات n ) على النحو التالي:
ابدأ {المعادلة *}
م (T) = تبدأ {bmatrix}
a_ {11} & ldots & a_ {1n}
vdots && vdots
a_ {m1} & ldots & a_ {mn}
نهاية {bmatrix}.
نهاية {المعادلة *}
غالبًا ما تتم كتابة هذا أيضًا كـ (A = (a_ {ij}) _ {1 le i le m، 1 le j le n} ). كما هو الحال في القسم A.1.1 ، يُرمز إلى مجموعة جميع المصفوفات (m times n ) ذات الإدخالات في ( mathbb {F} ) بواسطة ( mathbb {F} ^ {m times n} ).

ملاحظة 6.6.1. من المهم أن تتذكر أن (M (T) ) لا يعتمد فقط على الخريطة الخطية (T ) ولكن أيضًا على اختيار الأساس ((v_1، ldots، v_n) ) لـ (V ) واختيار الأساس ((w_1، ldots، w_m) ) لـ (W ). يحتوي العمود (j ^ { text {th}} ) في (M (T) ) على معاملات متجه الأساس (j ^ { text {th}} ) (v_j ) عندما موسعة من حيث الأساس ((w_1، ldots، w_m) ) ، كما في المعادلة 6.6.1.

مثال 6.6.2. لنفترض أن (T: mathbb {R} ^ 2 to mathbb {R} ^ 2 ) هي الخريطة الخطية التي قدمها (T (x، y) = (ax + by، cx + dy) ) من أجل بعض (أ ، ب ، ج ، د في mathbb {R} ). ثم فيما يتعلق بالأساس الكنسي لـ ( mathbb {R} ^ 2 ) المعطى بواسطة (((1،0)، (0،1)) ) ، فإن المصفوفة المقابلة هي
ابدأ {المعادلة *}
M (T) = start {bmatrix} a & b c & d end {bmatrix}
نهاية {المعادلة *}
بما أن (T (1،0) = (a، c) ) يعطي العمود الأول و (T (0،1) = (b، d) ) يعطي العمود الثاني.

بشكل عام ، افترض أن (V = mathbb {F} ^ n ) و (W = mathbb {F} ^ m ) ، ويشير إلى الأساس القياسي لـ (V ) بواسطة ((e_1، ldots ، e_n) ) والأساس القياسي لـ (W ) بواسطة ((f_1 ، ldots ، f_m) ). هنا ، (e_i ) (resp. (f_i )) هو (n ) - tuple (resp. (m ) - tuple) مع وجود واحد في الموضع (i ) وأصفار في كل مكان آخر . ثم يتم إعطاء المصفوفة (M (T) = (a_ {ij}) ) بواسطة

ابدأ {المعادلة *}
a_ {ij} = (Te_j) _i ،
نهاية {المعادلة *}
حيث يشير ((Te_j) _i ) إلى (i ^ { text {th}} ) المكون المتجه (Te_j ).

مثال 6.6.3. لنفترض أن (T: mathbb {R} ^ 2 to mathbb {R} ^ 3 ) هي الخريطة الخطية المحددة بواسطة (T (x، y) = (y، x + 2y، x + y) ). بعد ذلك ، فيما يتعلق بالأساس القياسي ، لدينا (T (1،0) = (0،1،1) ) و (T (0،1) = (1،2،1) ) بحيث
ابدأ {المعادلة *}
M (T) = start {bmatrix} 0 & 1 1 & 2 1 & 1 end {bmatrix}.
نهاية {المعادلة *}
ومع ذلك ، إذا أخذنا بدلاً من ذلك القواعد (((1،2) ، (0،1)) ) لـ ( mathbb {R} ^ 2 ) و
((1،0،0)، (0،1،0)، (0،0،1)) ) لـ ( mathbb {R} ^ 3 ) ، ثم (T (1،2 ) = (2،5،3) ) و (T (0،1) = (1،2،1) ) بحيث
ابدأ {المعادلة *}
M (T) = start {bmatrix} 2 & 1 5 & 2 3 & 1 end {bmatrix}.
نهاية {المعادلة *}

مثال 6.6.4. لنفترض أن (S: mathbb {R} ^ 2 to mathbb {R} ^ 2 ) هي الخريطة الخطية (S (x، y) = (y، x) ). فيما يتعلق بالأساس (((1،2)، (0،1)) ) لـ ( mathbb {R} ^ 2 ) ، لدينا
ابدأ {المعادلة *}
S (1،2) = (2،1) = 2 (1،2) -3 (0،1) رباعي نص {and} رباعي
ق (0،1) = (1،0) = 1 (1،2) -2 (0،1) ،
نهاية {المعادلة *}
و حينئذ
[M (S) = start {bmatrix} 2 & 1 - 3 & -2 end {bmatrix}. ]

بالنظر إلى مسافات المتجهات (V ) و (W ) من الأبعاد (n ) و (م ) ، على التوالي ، ومع توفير اختيار ثابت للقواعد ، لاحظ أن هناك تطابق واحد لواحد بين الخرائط الخطية في ( mathcal {L} (V، W) ) والمصفوفات في ( mathbb {F} ^ {m times n} ). إذا بدأنا بالخريطة الخطية (T ) ، فسيتم تعريف المصفوفة (M (T) = A = (a_ {ij}) ) عبر المعادلة 6.6.1. بالمقابل ، بالنظر إلى المصفوفة (A = (a_ {ij}) in mathbb {F} ^ {m times n} ) ، يمكننا تحديد خريطة خطية (T: V to W ) عن طريق الإعداد

[Tv_j = sum_ {i = 1} ^ m a_ {ij} w_i. ]

تذكر أن مجموعة الخرائط الخطية ( mathcal {L} (V، W) ) هي مساحة متجهة. نظرًا لوجود تطابق واحد لواحد بين الخرائط والمصفوفات الخطية ، يمكننا أيضًا إنشاء مجموعة المصفوفات ( mathbb {F} ^ {m times n} ) في مساحة متجه. إعطاء مصفوفتين (A = (a_ {ij}) ) و (B = (b_ {ij}) ) في ( mathbb {F} ^ {m times n} ) وإعطائها عددًا ( alpha in mathbb {F} ) ، نحدد الامتداد إضافة مصفوفة و الضرب القياسي المكون الحكيم:

ابدأ {المعادلة *}
ابدأ {تقسيم}
A + B & = (a_ {ij} + b_ {ij}) ،
alpha A & = ( alpha a_ {ij}).
نهاية {تقسيم}
نهاية {المعادلة *}

بعد ذلك ، نظهر أن ملف تكوين من الخرائط الخطية تفرض منتجًا على المصفوفات ، وتسمى أيضًا ضرب المصفوفة. لنفترض أن (U، V، W ) مسافات متجهة فوق ( mathbb {F} ) مع قواعد ((u_1، ldots، u_p) )، ((v_1، ldots، v_n) ) و ((w_1، ldots، w_m) ) على التوالي. لنفترض أن (S: U to V ) و (T: V to W ) خرائط خطية. ثم يكون المنتج خريطة خطية (T circ S: U to W ).

كل خريطة خطية لها المصفوفة المقابلة (M (T) = A ، M (S) = B ) و (M (TS) = C ). السؤال هو ما إذا كان (C ) يتم تحديده بواسطة (A ) و (B ). لدينا ، لكل (j in {1،2 ، ldots p } ) ، هذا

ابدأ {المعادلة *}
ابدأ {تقسيم}
(T circ S) u_j & = T (b_ {1j} v_1 + cdots + b_ {nj} v_n) = b_ {1j} Tv_1 + cdots + b_ {nj} Tv_n
& = sum_ {k = 1} ^ n b_ {kj} Tv_k
= sum_ {k = 1} ^ n b_ {kj} bigl ( sum_ {i = 1} ^ m a_ {ik} w_i bigr)
& = sum_ {i = 1} ^ m bigl ( sum_ {k = 1} ^ n a_ {ik} b_ {kj} bigr) w_i.
نهاية {تقسيم}
نهاية {المعادلة *}

ومن ثم ، يتم إعطاء المصفوفة (C = (c_ {ij}) ) بواسطة
ابدأ {المعادلة} التسمية {eq: c}
c_ {ij} = sum_ {k = 1} ^ n a_ {ik} b_ {kj}. العلامة {6.6.2}
نهاية {المعادلة}

يمكن استخدام المعادلة 6.6.2 لتعريف (m times p ) المصفوفة (C ) على أنها حاصل ضرب (m times n ) مصفوفة (A ) و a (n times ع ) مصفوفة (ب ) ، أي
ابدأ {المعادلة}
C = AB. العلامة {6.6.3}
نهاية {المعادلة}

يشير اشتقاقنا إلى أن المراسلات بين الخرائط والمصفوفات الخطية تحترم بنية المنتج.

مقترح 6.6.5. يترك (S: U إلى V ) و (T: V إلى W ) تكون خرائط خطية. ثم

[M (TS) = M (T) M (S). ]

مثال 6.6.6. باستخدام التدوين كما في الأمثلة 6.6.3 و 6.6.4 ، يجب أن تكون قادرًا على التحقق من ذلك
ابدأ {المعادلة *}
M (TS) = M (T) M (S) = start {bmatrix} 2 & 1 5 & 2 3 & 1 end {bmatrix}
تبدأ {bmatrix} 2 & 1 - 3 & -2 نهاية {bmatrix}
= start {bmatrix} 1 & 0 4 & 1 3 & 1 end {bmatrix}.
نهاية {المعادلة *}

بالنظر إلى المتجه (v in V ) ، يمكننا أيضًا ربط مصفوفة (M (v) ) بـ (v ) على النحو التالي. لنفترض أن ((v_1، ldots، v_n) ) يكون أساسًا لـ (V ). ثم هناك مقاييس فريدة (b_1، ldots، b_n ) مثل ذلك

[v = b_1 v_1 + cdots b_n v_n. ]

يتم بعد ذلك تعريف مصفوفة (v ) لتكون (n مرات 1 ) المصفوفة

[M (v) = start {bmatrix} b_1 vdots b_n end {bmatrix}. ]

مثال 6.6.7 مصفوفة المتجه (x = (x_1، ldots، x_n) in mathbb {F} ^ n ) في الأساس القياسي ((e_1، ldots، e_n) ) هي متجه العمود أو (n times 1 ) مصفوفة
ابدأ {المعادلة *}
M (x) = start {bmatrix} x_1 vdots x_n end {bmatrix}
نهاية {المعادلة *}
منذ (x = (x_1، ldots، x_n) = x_1 e_1 + cdots + x_n e_n ).

توضح النتيجة التالية كيف تتلاءم فكرة مصفوفة الخريطة الخطية (T: V to W ) ومصفوفة المتجه (v in V ) معًا.

اقتراح 6.6.8. يترك (T: V إلى W ) تكون خريطة خطية. ثم ، لكل (v in V ) ،
ابدأ {المعادلة *}
M (Tv) = M (T) M (v).
نهاية {المعادلة *}

دليل - إثبات.

لنفترض أن ((v_1، ldots، v_n) ) يكون أساسًا لـ (V ) و ((w_1، ldots، w_m) ) يكون أساسًا لـ (W ). افترض أنه فيما يتعلق بهذه الأسس ، مصفوفة (T ) هي (M (T) = (a_ {ij}) _ {1 le i le m، 1 le j le n} ). هذا يعني أنه بالنسبة لجميع (j in {1،2 ، ldots ، n } ) ،

[ ابدأ {المعادلة *}
Tv_j = sum_ {k = 1} ^ m a_ {kj} w_k.
نهاية {المعادلة *} ]

يمكن كتابة المتجه (v in V ) بشكل فريد كمجموعة خطية من نواقل الأساس مثل

[v = b_1 v_1 + cdots + b_n v_n. ]

بالتالي،

ابدأ {المعادلة *}
ابدأ {تقسيم}
التلفزيون & = b_1 T v_1 + cdots + b_n T v_n
& = b_1 sum_ {k = 1} ^ m a_ {k1} w_k + cdots + b_n sum_ {k = 1} ^ m a_ {kn} w_k
& = sum_ {k = 1} ^ m (a_ {k1} b_1 + cdots + a_ {kn} b_n) w_k.
نهاية {تقسيم}
نهاية {المعادلة *}

يوضح هذا أن (M (Tv) ) هي مصفوفة (م مرات 1 )

ابدأ {المعادلة *}
M (Tv) = start {bmatrix} a_ {11} b_1 + cdots + a_ {1n} b_n vdots
أ_ {m1} b_1 + cdots + a_ {mn} b_n end {bmatrix}.
نهاية {المعادلة *}

ليس من الصعب التحقق ، باستخدام صيغة ضرب المصفوفة ، من أن (M (T) M (v) ) يعطي نفس النتيجة.

مثال 6.6.9. خذ الخريطة الخطية (S ) من المثال 6.6.4 بأساس (((1،2)، (0،1)) ) لـ ( mathbb {R} ^ 2 ). لتحديد الإجراء على المتجه (v = (1،4) in mathbb {R} ^ 2 ) ، لاحظ أن (v = (1،4) = 1 (1،2) +2 (0 ، 1) ). بالتالي،
ابدأ {المعادلة *}
M (Sv) = M (S) M (v) = start {bmatrix} 2 & 1 - 3 & -2 end {bmatrix}
ابدأ {bmatrix} 1 2 النهاية {bmatrix}
= start {bmatrix} 4 -7 end {bmatrix}.
نهاية {المعادلة *}

هذا يعني ذاك

[Sv = 4 (1،2) -7 (0،1) = (4،1) ، ]

وهو حقًا صحيح.


الدكتور مارك ف. سابير

حيث A عبارة عن مصفوفة معاملات m في n و b عمود الجوانب اليمنى. لكل n -vector v يمكننا الحصول على m -vector Av. هدفنا هو إيجاد جميع المتجهات n-v بحيث يكون هذا المتجه m هو b. وبالتالي لدينا دالة تأخذ أي متجه v من R n إلى المتجه Av من R m وهدفنا هو إيجاد جميع قيم وسيطة هذه الوظيفة التي لها قيمة معينة للدالة.

الوظيفة من R n إلى R m التي تأخذ كل n -vector v إلى m -vector Av حيث A هي a m في n المصفوفة ، تسمى a التحول الخطي. تسمى المصفوفة أ مصفوفة قياسية من هذا التحول. إذا كانت n = m فإن التحويل يسمى a عامل خطي من الفضاء المتجه R n.

لاحظ أنه من خلال التعريف فإن التحويل الخطي بمصفوفة قياسية A يأخذ كل متجه (x1. xن )

من R m حيث A (i، j) هي مدخلات A. على العكس من ذلك ، فإن كل تحويل من R n إلى R m معطى بواسطة صيغة من هذا النوع هو تحويل خطي والمعاملات A (i، j) تشكل المصفوفة القياسية لهذا التحويل.

أمثلة. 1. ضع في اعتبارك تحويل R 2 الذي يأخذ كل متجه (أ ، ب) إلى المتجه المقابل (-a ، -b). هذا عامل خطي مع مصفوفة قياسية

2. بشكل عام ، عامل التمدد هو العامل الخطي من R n إلى R n الذي يأخذ كل متجه

3. إذا أخذنا متجهًا (x ، y) في R 2 وعكسناه حول المحور x ، نحصل على المتجه (x، -y). من الواضح أن هذا الانعكاس عامل خطي. مصفوفتها القياسية هي

4. إذا قمنا بإسقاط متجه (x ، y) على المحور x ، نحصل على المتجه (x ، 0). هذا الإسقاط هو أيضًا عامل خطي. مصفوفتها القياسية هي

5. إذا قمنا بتدوير متجه (س ، ص) خلال 90 درجة عكس اتجاه عقارب الساعة ، نحصل على المتجه (-y ، x). هذا الدوران عامل خطي بمصفوفة قياسية

يجب أن نثبت أن الانعكاسات حول الخطوط التعسفية ، والإسقاطات على المحاور التعسفية ، والدوران من خلال زوايا عشوائية في R 2 هي عوامل تشغيل خطية. للقيام بذلك ، نحتاج إلى التوصيف البسيط التالي للتحولات الخطية من R n إلى R n.

نظرية. الدالة T من R n إلى R m هي تحويل خطي إذا وفقط إذا كانت تفي بالخاصيتين التاليتين:

    لكل متجهين A و B في R n

هذا الدليل يدل على أن تي هو تحول خطي ، V.أنا (أنا= 1. ن) هو المتجه مع أنا- إحداثيات 1 وإحداثيات أخرى 0 ، ثم T (V.أنا) هل أنا- العمود في المصفوفة القياسية لـ تي. يوفر لنا هذا طريقة لإيجاد المصفوفة القياسية للتحول الخطي.
لاحظ أنه في R 3 ، نواقل V1، الخامس2، الخامس3 هي النواقل الأساسية i ، j ، k. لذلك يجب أن نسميه Vأنا ال الأساسي المتجهات في R n. سنقدم تعريفا عاما ل القواعد في R n ومسافات متجهية أخرى لاحقًا.

كنتيجة طبيعية لتوصيف التحولات الخطية من R m إلى R n يمكننا استنتاج العبارة التالية.

اللازمة - النتيجة. كل تحول خطي تي من R m إلى R n يأخذ 0 من R m إلى 0 من R n.

في الواقع ، خذ k = 0 والمتجه التعسفي A ثم

استخدمنا هنا الشرط الثاني للتوصيف.

مثال 1. إسقاط على خط تعسفي في R 2. دع L يكون خطًا عشوائيًا في R 2. دع T.إل يكون تحول R 2 الذي يأخذ كل متجهين إلى إسقاطه على L. من الواضح أن إسقاط مجموع متجهين هو مجموع إسقاطات هذين المتجهين. إذا ضربنا متجهًا في عددي ، فسيتم أيضًا ضرب إسقاطه في هذا العدد القياسي. وهكذا من خلال توصيف التحولات الخطية ، Tإل عامل تشغيل خطي على R 2.

لنجد المصفوفة القياسية للإسقاط على الخط y = kx. هذا الخط له اتجاه المتجه أ = (1 ، ك). لنفترض أن V يكون متجهًا تعسفيًا (x ، y) في R 2. ثم الإسقاط P هو مثل هذا المتجه

  1. P يوازي A ، أي P = tA = (t ، kt)
  2. V-P عمودي على A. هذا يعني أن & lt (V-P) ، A & gt = 0 أو

من هذا يمكننا أن نستنتج ذلك

لذلك فإن المصفوفة القياسية للإسقاط هي

1 / (ك 2 +1) [ 1 ك ]
[ ك ك 2]

لاحظ أن صيغة المتجه P تعطي دليلًا آخر على أن الإسقاط عامل خطي (قارن مع الشكل العام للعوامل الخطية).

مثال 2. التفكير في خط تعسفي.

إذا كان P هو إسقاط المتجه v على الخط L ، فإن V-P عمودي على L و Q = V-2 (V-P) يساوي انعكاس V حول الخط L. هكذا Q = 2P-V. باستخدام صيغة P التي لدينا ، يمكننا استنتاج صيغة Q:

هذا يعطينا المصفوفة القياسية للانعكاس:

1 / (ك 2 +1) [1- ك 2 2 ك]
[2 ك ك 2 -1]

مثال 3. صotation من خلال الزاوية أ

باستخدام توصيف التحويلات الخطية ، من السهل إظهار أن دوران المتجهات في R 2 من خلال أي زاوية أ (عكس اتجاه عقارب الساعة) عامل خطي. من أجل العثور على المصفوفة القياسية الخاصة بها ، يجب أن نستخدم الملاحظة التي تم إجراؤها فورًا بعد إثبات توصيف التحولات الخطية. تشير هذه الملاحظة إلى أن أعمدة المصفوفة القياسية هي صور للمتجهات الأساسية (1،0) و (0،1). من الواضح أن هذه الصور هي (كوس (أ) ، الخطيئة (أ)) و (-sin (أ) ، كوس (أ)). لذلك فإن المصفوفة القياسية للدوران هي:


[كوس (أ) -sin (أ) ]
[خطيئة (أ) كوس (أ) ]

لاحظ أن الدوران في اتجاه عقارب الساعة بزاوية أ يحتوي على المصفوفة التالية:


[كوس (أ) الخطيئة (أ) ]
[-sin (أ) كوس (أ) ]

لأنها تساوي الدوران عكس اتجاه عقارب الساعة من خلال الزاوية -أ.

لنفترض أن تي هو تحويل خطي من R m إلى R n بمصفوفة قياسية A و س هو تحويل خطي من R n إلى R k بمصفوفة قياسية B. إذا نحن نستطيع مؤلف موسيقى أو تتضاعف هذين التحولين وإنشاء تحول جديد ST الذي يأخذ المتجهات من R m إلى R k. ينطبق هذا التحول أولاً تي وثم س. لا يمكن مضاعفة أي تحولين: التحول س يجب أن تبدأ من حيث تي ينتهي. ولكن يمكن مضاعفة أي عاملين خطيين في R n (أي التحويلات الخطية من R n إلى R n).

لاحظ أنه إذا كانت v متجهًا في R n إذن

من خلال تعريف المصفوفة القياسية للتحول الخطي. ثم
ST (V) = S (T (V)) = B (AV) = (BA) V.

وبالتالي فإن المنتج ST هو تحويل خطي والمصفوفة القياسية ST هي نتاج المصفوفات القياسية BA.

مثال 1. لنفترض أن تي و س هي تناوب في R 2 ، تي يدور من خلال الزاوية أ و س يدور من خلال الزاوية ب (كل الدورات تكون عكس اتجاه عقارب الساعة). ثم ST هي بالطبع الدوران من خلال الزاوية أ + ب. المصفوفة القياسية لـ تي يكون

[كوس (أ) -sin (أ)]
[خطيئة (أ) كوس (أ)]

المصفوفة القياسية لـ س يكون

[كوس (ب) -sin (ب)]
[الخطيئة (ب) كوس (ب)]

وبالتالي ، يجب أن تكون المصفوفة القياسية لـ ST هي نتاج هذه المصفوفات:

[cos (a) cos (b) -sin (a) sin (b) -cos (a) sin (b) -sin (a) cos (b)]
[cos (a) sin (b) + sin (a) cos (b) cos (a) cos (b) -sin (a) sin (b)]

من ناحية أخرى ، هذه هي المصفوفة القياسية للدوران عبر الزاوية أ + ب ، لذا يجب أن تكون مصفوفتها القياسية مساوية لـ

[كوس (أ + ب) -sin (أ + ب)]
[الخطيئة (أ + ب) كوس (أ + ب)]

هذا يعطينا الصيغ المثلثية المعروفة:

cos (a + b) = cos (a) cos (b) -sin (a) sin (b)
الخطيئة (أ + ب) = الخطيئة (أ) كوس (ب) + كوس (أ) الخطيئة (ب)

  1. الدوران من خلال أ في اتجاه عقارب الساعة.
  2. انعكاس المحور السيني.
  3. الدوران من خلال أ عكس عقارب الساعه.

وهكذا يمكننا إيجاد المصفوفة القياسية للانعكاس حول الخط L بضرب المصفوفات القياسية لهذه التحولات الثلاثة.

  1. الدوران من خلال أ في اتجاه عقارب الساعة.
  2. الإسقاط على المحور السيني.
  3. الدوران من خلال أ عكس عقارب الساعه.

إذا كانت A و B هي المصفوفات القياسية لـ تي و س على التوالي ، إذن

وبالتالي ، فإن مجموع التحويلات الخطية من R m إلى R n هو مرة أخرى تحويل خطي والمصفوفة القياسية لمجموع التحويلات الخطية هي مجموع المصفوفات القياسية لهذه التحولات.

يمكننا أيضًا ضرب تحويل خطي في عدد. إذا كان k هو رقم و تي هو تحويل خطي من R m إلى R n ثم kT هي دالة من R m إلى R n تأخذ كل متجه V من R m إلى kT (V). من السهل ملاحظة أن المصفوفة القياسية لـ kT هي kA.

بتلخيص خصائص التحويلات الخطية من R m إلى R n التي حصلنا عليها حتى الآن ، يمكننا صياغة النظرية التالية.

نظرية. 1. المنتج شارع من التحول الخطي تي من R m إلى R n وتحويل خطي س من R n إلى R k هو تحويل خطي من R m إلى R k والمصفوفة القياسية لـ ST تساوي حاصل ضرب المصفوفات القياسية لـ س و تي.

2. إذا تي و س هي تحويلات خطية من R m إلى R n ثم T + S. هو مرة أخرى تحول خطي من R m إلى R n والمصفوفة القياسية لهذا التحويل تساوي مجموع المصفوفات القياسية لـ تي و س.

3. إذا تي هو تحول خطي من R m إلى R n و k هو عددي إذن كيلو ت هو مرة أخرى تحول خطي من R m إلى R n والمصفوفة القياسية لهذا التحويل تساوي k ضرب المصفوفة القياسية لـ تي.

بحكم التعريف ، فإن هوية الوظيفة من R n إلى R n هي الوظيفة التي تأخذ كل متجه إلى نفسها. من الواضح أن دالة الهوية هي عامل خطي مصفوفته المعيارية هي مصفوفة الهوية. دعونا نشير إلى مشغل الهوية بواسطة Id.

عامل تشغيل خطي تي في R n يسمى غير قابل للعكس إذا كان هناك عامل خطي آخر س في R n بحيث TS = ST = Id. في هذه الحالة س يسمى معكوس من تي. حسب التعريف س يفسد ما تي لا ، هذا إذا تي ثم يأخذ V إلى W س يجب أن تأخذ W إلى V (وإلا فإن ST لن تكون مشغل الهوية). إذا كانت A هي المصفوفة القياسية لـ تي و B هي المصفوفة القياسية لـ س من ثم شارع لديها مصفوفة قياسية BA. حتى إذا س هو معكوس تي ثم BA =أنا. على العكس من ذلك ، إذا كانت BA =أنا ثم العامل الخطي س مع المصفوفة القياسية B هو معكوس تي لأن ST هي المشغل الخطي الذي تكون مصفوفته القياسية أنا. وبالتالي يمكننا أن نستنتج أن العبارة التالية صحيحة.

نظرية. عامل تشغيل خطي تي في R n يكون معكوسًا إذا وفقط إذا كانت مصفوفته القياسية قابلة للانعكاس. إذا كانت A هي المصفوفة القياسية لـ تي ثم A -1 هي المصفوفة القياسية لـ تي -1 .


مثال 1. الانعكاس حول خط في R 2 يكون معكوسًا وعكس الانعكاس هو الانعكاس نفسه (في الواقع ، إذا طبقنا الانعكاس على متجه مرتين ، فإننا لا نغير المتجه).


مثال 2. الدوران من خلال الزاوية أ غير قابل للعكس والعكس هو الدوران من خلال الزاوية -أ.

مثال 3. الإسقاط على خط في R 2 غير قابل للعكس نظرًا لوجود العديد من المتجهات التي يلتقطها الإسقاط إلى نفس المتجه ، لذلك لا يمكننا إعادة بناء متجه بشكل فريد من خلال صورته تحت الإسقاط.

هدفنا التالي هو النظر في خصائص العوامل الخطية العكسية.

أولاً ، دعونا نتذكر بعض خصائص الخرائط العكسية (الوظائف). يترك تي تكون خريطة من المجموعة X إلى المجموعة Y. نقول ذلك تي يكون عن طريق الحقن أو واحد لواحد لو تي تعيين عناصر مختلفة لعناصر مختلفة ، هذا إذا كان T (u) = T (v) ثم بالضرورة u = v. نحن نتصل تي طائش أو على إذا كان كل عنصر في Y عبارة عن صورة لعنصر ما في X ، فهذا يعني أنه لكل y في Y ، يوجد x في X بحيث يكون T (x) = y.

وظيفة تي من X إلى X يسمى غير قابل للعكس إذا كانت هناك وظيفة أخرى س من X إلى X بحيث يكون TS = ST = المعرف ، وظيفة الهوية (هذا إذا تي يأخذ x إلى y ثم س يجب أن تأخذ y إلى x). من السهل رؤية ذلك تي قابل للعكس فقط إذا كان حقنيًا وخاطئيًا.

توجد وظائف غير حُقنية وغير خاطفة (الوظيفة T (x) = x 2 من R إلى R) ، غير حَقَنِيّة وجذابة (على سبيل المثال ، T (x) = x 3 -x من R إلى R) ، عن طريق الحقن وغير المفاجئ (على سبيل المثال ، T (x) = arctan (x) من R إلى R) ، عن طريق الحقن والخطأ (أي وظيفة عكسية ، على سبيل المثال T (x) = x 3 من ر ل ر).

وبالتالي فإن النظرية التالية حول العوامل الخطية مدهشة للغاية.

نظرية. لكل عامل تشغيل خطي T في R n بمصفوفة قياسية A ، تكون الشروط التالية متكافئة:

دع V و W مسافات متجهة عشوائية. خريطة تي من V إلى W يسمى أ التحول الخطي لو

    لكل متجهين A و B في V.

في الحالة الخاصة عندما يكون V = W ، تي يسمى أ عامل خطي في V.

لقد رأينا (انظر توصيف التحولات الخطية من R m إلى ر ن) أن التحويلات الخطية من R m إلى R n هي بالضبط الخرائط التي تفي بهذه الشروط. لذلك في حالة الفراغات المتجهية للمتجهات n ، يكون هذا التعريف مكافئًا للتعريف الأصلي. تعطينا المساحات المتجهة الأخرى المزيد من الأمثلة على التحولات الخطية الطبيعية.

أمثلة إيجابية.1. لنفترض أن V هي مجموعة كل كثيرات الحدود في متغير واحد. سنرى لاحقًا أن V عبارة عن فضاء متجه مع الإضافة الطبيعية والضرب القياسي (ليس من الصعب إظهاره مباشرة). الخريطة التي تأخذ كل كثير حدود إلى مشتقها هي عامل تشغيل خطي في V كما يلي بسهولة من خصائص المشتق:

2. لنفترض أن C [0،1] هي فضاء متجه لجميع الوظائف المستمرة في الفترة [0،1]. ثم الخريطة التي تأخذ كل دالة S (x) من C [0،1] إلى الدالة h (x) التي تساوي التكامل من 0 إلى x لـ S (t) هي عامل تشغيل خطي في C [0،1] ] على النحو التالي من خصائص التكاملات.

int (T (t) + S (t)) dt = int T (t) dt + int S (t) dt
int kS (t) dt = k int S (t) dt.

3. الخريطة من C [0،1] إلى R والتي تأخذ كل دالة S (x) إلى الرقم S (1/3) عبارة عن تحويل خطي (يمكن استبدال 1/3 بأي رقم بين 0 و 1):

4. الخريطة من فضاء المتجه لجميع الأعداد المركبة ج إلى نفسها التي تأخذ كل رقم مركب a + b أنا إلى الجزء التخيلي ب أنا هو عامل تشغيل خطي (تحقق!).

5. الخريطة من فضاء المتجه لجميع المصفوفات n بواسطة n (تم إصلاح n) إلى R التي تأخذ كل مصفوفة A إلى (1،1) - المدخل A (1،1) عبارة عن تحويل خطي (تحقق!).

6. الخريطة من فضاء متجه للجميع ن بواسطة ن المصفوفات إلى R التي تأخذ كل مصفوفة A إلى أثرها (A) هو تحويل خطي (تحقق!).

7. الخريطة من فضاء متجه اعتباطي V إلى فضاء متجه عشوائي W الذي يأخذ كل متجه v من V إلى 0 هو تحويل خطي (تحقق!). هذا التحول يسمى تحول باطل

8. الخريطة من فضاء متجه اعتباطي V إلى V والتي تأخذ كل متجه إلى نفسها (خريطة الهوية) هي عامل تشغيل خطي (تحقق!). يطلق عليه عامل الهوية، يعني أنا.

أمثلة سلبية. 1. الخريطة تي الذي يأخذ منه كل وظيفة S (x) من ج [0،1] للدالة S (x) +1 ليس تحويلًا خطيًا لأننا إذا أخذنا k = 0 ، S (x) = x فإن صورة kT (x) (= 0) هي الدالة الثابتة 1 و k ضرب صورة T (x) هي الدالة الثابتة 0. لذا فإن الخاصية الثانية للتحولات الخطية لا تصمد.

2. الخريطة تي من فضاء متجه للأعداد المركبة ج إلى R الذي يأخذ كل رقم مركب a + bi إلى معياره sqrt (a 2 + b 2) ليس تحويلًا خطيًا لأننا إذا أخذنا A = 3 و B = 4i ، فإن T (A + B) = || 3 + 4i || = 5 و T (A) + T (B) = 3 + 4 = 7 ، لذا فإن T (A + B) لا يساوي T (A) + T (B) ، لذا فإن الخاصية الأولى للتحويلات الخطية لا تساوي لا عقد.

تحتوي النظرية التالية على بعض الخصائص المهمة للتحولات الخطية (قارن مع النتيجة الطبيعية من التوصيف تي التحويلات الخطية من R m إلى R n والنظرية حول المنتجات والمجاميع والمضاعفات العددية للتحولات الخطية).

نظرية. 1. إذا تي هو تحول خطي من V إلى W. تي(0)=0.

2. إذا تي هو تحول خطي من V إلى W و س هو تحويل خطي من W إلى Y (V ، W ، Y هي مسافات متجهة) ثم المنتج (التركيب) شارع هو تحول خطي من V إلى Y.

3. إذا تي و س هي تحويلات خطية من V إلى W (V و W مسافات متجهة) ثم المجموع T + S. الذي يأخذ كل متجه A في V إلى مجموع T (A) + S (A) في W هو مرة أخرى تحول خطي من V إلى W.

4. إذا تي هو تحويل خطي من V إلى W و k هو عدد قياسي ، فإن الخريطة kT التي تأخذ كل متجه A في V إلى k مرة T (A) هي مرة أخرى تحول خطي من V إلى W.

ترك برهان باعتبارها ممارسة.

بعض خصائص التحويلات الخطية ، التي تحمل للتحولات الخطية من R m إلى R n ، لا تنطبق على مسافات المتجهات التعسفية.

على سبيل المثال ، لنفترض أن P هي مساحة المتجه لجميع كثيرات الحدود. يترك تي يكون العامل الخطي الذي يأخذ كل كثير الحدود إلى مشتقها. ثم تي هو خاطيء لأن كل كثير الحدود هو مشتق من بعض كثيرات الحدود الأخرى (المشتقات المضادة من كثير الحدود هي كثيرة الحدود). ولكن تي ليس عن طريق الحقن لأن الصور x 2 و x 2 +1 متطابقة (2 x). تذكر أنه بالنسبة للتحولات الخطية من R m إلى R n ، فإن الحقن والتخوف متكافئان.

لاحظ أنه منذ عامل التشغيل تي ليس عن طريق الحقن ، لا يمكن أن يكون له معكوس. ولكن اسمحوا س يكون العامل على نفس المساحة التي تأخذ كل كثير الحدود إلى مضاد مشتقها int (p (t) ، t = 0..x). ثم لكل كثير حدود p لدينا: TS (p) = p (مشتق مضاد مشتق التابع هو الوظيفة نفسها). وهكذا TS = أنا. من ناحية أخرى ، ST لا يساوي أنا، على سبيل المثال ، إذا كان p = x +1 ثم T (p) = 1 ، ST (p) = x ، لذا فإن ST (p) لا تساوي p.

بالنسبة للمشغلين الخطيين في R m ، لا يمكن أن يحدث هذا. في الواقع ، إذا كان TS = I ثم حاصل ضرب المصفوفات القياسية تي و س يكون أنا. لذا فإن المصفوفة القياسية A لـ تي غير قابل للعكس ، والمصفوفة القياسية B من س هو معكوس أ. بالتالي س هو معكوس تي و ST =أنا.

لا يحتوي الدليل في الفقرة الأخيرة على إشارات إلى النتائج التي استخدمناها. ابحث عن هذه المراجع!


الإسقاطات على المساحات الجزئية ، المسافة من متجه إلى فضاء جزئي

تخبرنا النظرية حول المكملات المتعامدة أنه إذا الخامس هو فضاء فرعي من الفضاء المتجه الإقليدي دبليو و ث هو متجه من W ثم w = v + v 'للبعض الخامس في الخامس و الخامس'في المكمل المتعامد V c من V. نحن نعلم أيضًا أن هذا التمثيل ث فريد من نوعة. المتجه الخامس ثم يسمى تنبؤ من ث على V المتجه v 'يسمى مكون عادي من ث.

يعطينا إجراء جرام شميدت صيغة الإسقاط والمكون العادي. إذا كان v1. الخامسك هو أساس متعامد للفضاء الجزئي V إذن

في الواقع، الخامس ينتمي إلى الخامس لأن كل أنا في داخل الخامس و الخامس مغلق تحت مجموعات خطية. ومن السهل التحقق (تمرين) من أن v '= w-v متعامد مع كل من vأنا . وهذا يعني أن الخامسمتعامد مع كل متجه في الخامس لأن النواقل في الخامس هي مجموعات خطية من v1. الخامسك (تحقق من ذلك إذا كان ناقل ص متعامد مع المتجهات ف1. فن ، من ثم ص متعامد مع أي مجموعة خطية من q1. فن ).

تسمح لنا النظرية حول المكملات المتعامدة بإيجاد مسافات من المتجهات إلى الفراغات الفرعية في أي فضاء متجه إقليدي.


مثال أكثر بصرية. تحويل المصفوفة

في المثال التالي سوف نستخدم مصفوفة أكبر ، ممثلة كصورة للدعم البصري. بمجرد أن نحسب مصفوفة المؤشرات الجديدة ، سنقوم بتعيين المصفوفة الأصلية إلى المؤشرات الجديدة ، مع التفاف المؤشرات خارج الحدود للحصول على مستوى مستمر باستخدام numpy.take مع mode = 'wrap'.

قم بإنشاء مصفوفة 200 × 200 لهذا المثال:

يمكن كتابة دالة التحويل الخطي ، والتي تتضمن عمليات الأمثلة السابقة ولكن تقريب أزواج المؤشرات الجديدة وتعيين مصفوفة المصدر إلى المؤشرات الجديدة على النحو التالي:

دعونا نرى بعض التحولات الخطية التي يمكننا القيام بها.

تحجيم المستوى في المحور (س ) بمعامل 1.5:

تمدد الطائرة بمعامل 1.8:

تمدد الطائرة بمعامل 0.5:

تحجيم المستوى في المحور (ص ) بمعامل 0.5:

القص حول المحور (y ) مع إزاحة رأسية لـ (+ x / 2 ):

الدوران من خلال (45 ^ < circ> ) حول الأصل:

الانعكاس في خط مع ميل (45 ^ < circ> ) من خلال الأصل:


نموذج الأردن الكنسي

شكل الأردن الكنسي هو تمثيل للتحول الخطي عبر فضاء متجه معقد ذي أبعاد محدودة بواسطة نوع معين من المصفوفة المثلثية العليا. كل تحول خطي من هذا القبيل له شكل أساسي فريد من نوعه في الأردن ، والذي له خصائص مفيدة: من السهل وصفه ومناسب تمامًا للحسابات.

بشكل أقل تجريدًا ، يمكن للمرء أن يتحدث عن الشكل الكنسي الأردني لمصفوفة مربعة ، كل مصفوفة مربعة تشبه مصفوفة فريدة في شكل الأردن الكنسي ، نظرًا لأن المصفوفات المماثلة تتوافق مع تمثيلات نفس التحويل الخطي فيما يتعلق بقواعد مختلفة ، عن طريق تغيير نظرية الأساس.

يمكن اعتبار الشكل الكنسي الأردني بمثابة تعميم للقابلية المائلة للتحولات الخطية التعسفية (أو المصفوفات) في الواقع ، فإن الشكل الكنسي الأردني للتحول الخطي القابل للقطر (أو المصفوفة القابلة للقطر) هو مصفوفة قطرية.

محتويات


تظهر العينة أعلاه درجة 4 في اشخاص قسم ودرجة 6 في مهمة قسم. المربع الذي يتقاطع فيه الخطان هو أسلوب القيادة ، في هذه الحالة & # 8212 سلطوي.

سيعطيك هذا المخطط فكرة عن أسلوبك في القيادة:

الفقراء (1،1 إلى 4،4): ضعيف في كل من المهارات والمهارات الشخصية

استبدادي (الناس - 1 إلى 4 والمهمة - 5 إلى 9): قوي في المهام ، ضعيف في مهارات الناس

الإجتماعي (الأشخاص - من 5 إلى 9 والمهمة 1-4): قوي في مهارات التعامل مع الأشخاص ، وضعيف في المهام

قيادة الفريق (6،6 إلى 9،9): قوية في كل من المهام ومهارات التعامل مع الأشخاص

منتصف الطريق (5،5): في منتصف الرسم البياني ، ولكن مع المزيد من الخبرة والمهارات يمكن أن يظهر قيادة فريق جيدة

ومع ذلك ، مثل أي أداة أخرى تحاول تعريف شخص ما ، عليك أن تأخذ في الاعتبار عوامل أخرى ، مثل ، كيف يصنفك مديرك وموظفوك كقائد ، هل تنجز عملك ، هل تعتني بموظفيك ، أو هل تساعد في & # 8220grow & # 8221 مؤسستك.

يجب عليك مراجعة العبارات الواردة في الاستطلاع والتفكير في النتائج المنخفضة بسؤال نفسك ، & # 8220 إذا سجلت أعلى في هذا المجال ، فهل سأكون قائدًا أكثر فاعلية؟ & # 8221 وإذا كانت الإجابة بنعم ، فيجب أن تصبح أ عنصر العمل الشخصي.


المصفوفات¶

المصفوفة عبارة عن شبكة مستطيلة من الأرقام أو المصطلحات (مثل جدول بيانات Excel) مع قواعد خاصة للجمع والطرح والضرب.

أبعاد¶

نصف أبعاد المصفوفة من حيث الصفوف حسب الأعمدة.

الأول له أبعاد (3،2). الثانية (2،3).

العمليات العددية¶

تعمل العمليات العددية باستخدام المصفوفات بنفس الطريقة التي تعمل بها مع المتجهات. ما عليك سوى تطبيق العدد القياسي على كل عنصر في المصفوفة - الجمع والطرح والقسمة والضرب ، إلخ.

العمليات الأولية¶

من أجل إضافة أو طرح أو تقسيم مصفوفتين يجب أن يكون لهما أبعاد متساوية. نقوم بدمج القيم المتناظرة بطريقة عنصرية لإنتاج مصفوفة جديدة.

منتج هادامارد¶

منتج Hadamard من المصفوفات عملية عنصرية. يتم ضرب القيم التي تتوافق مع الوضع لإنتاج مصفوفة جديدة.

في numpy يمكنك أن تأخذ منتج Hadamard من مصفوفة ومتجه طالما أن أبعادها تفي بمتطلبات البث.

تبديل المصفوفة¶

تعالج الشبكات العصبية بشكل متكرر الأوزان والمدخلات بأحجام مختلفة حيث لا تلبي الأبعاد متطلبات مضاعفة المصفوفة. يوفر تبديل المصفوفة (غالبًا ما يُشار إليه بحرف مرتفع "T" مثل M ^ T) طريقة "لتدوير" إحدى المصفوفات بحيث تتوافق العملية مع متطلبات الضرب ويمكن أن تستمر. هناك خطوتان لتبديل المصفوفة:

  1. قم بتدوير المصفوفة لليمين 90 درجة
  2. عكس ترتيب العناصر في كل صف (على سبيل المثال ، يصبح [أ ب ج] [ج ب أ])

كمثال ، انقل المصفوفة M إلى T:

ضرب المصفوفة¶

يحدد ضرب المصفوفة مجموعة من القواعد لضرب المصفوفات معًا لإنتاج مصفوفة جديدة.

ليست كل المصفوفات مؤهلة لعملية الضرب. بالإضافة إلى ذلك ، هناك حاجة إلى أبعاد ناتج المصفوفة الناتج. مصدر.

  1. يجب أن يساوي عدد أعمدة المصفوفة الأولى عدد صفوف المصفوفة الثانية
  2. حاصل ضرب مصفوفة M x N ومصفوفة N x K هو مصفوفة M x K. تأخذ المصفوفة الجديدة صفوف الأول وأعمدة الثاني

يعتمد ضرب المصفوفة على حاصل الضرب النقطي لمضاعفة مجموعات مختلفة من الصفوف والأعمدة. في الصورة أدناه ، مأخوذة من دورة الجبر الخطي الممتازة في Khan Academy ، كل إدخال في Matrix C هو حاصل الضرب النقطي لصف في المصفوفة A وعمود في المصفوفة B [3].

تعني العملية a1 · b1 أننا نأخذ حاصل الضرب القياسي للصف الأول في المصفوفة A (1 ، 7) والعمود الأول في المصفوفة B (3 ، 5).

إليك طريقة أخرى للنظر إليها:

اختبر نفسك¶


6.6: مصفوفة الخريطة الخطية

بعد قراءة هذا الفصل ، ستتمكن من القيام بما يلي:

  • افهم ما يمكن أن تضيفه خرائط النسيج إلى مشهدك
  • حدد صورة نسيج
  • التحكم في كيفية تصفية صورة النسيج عند تطبيقها على جزء
  • قم بإنشاء وإدارة صور النسيج في كائنات النسيج ، وإذا كان ذلك متاحًا ، يمكنك التحكم في مجموعة عمل عالية الأداء من كائنات النسيج تلك
  • حدد كيفية دمج قيم اللون في الصورة مع قيم الجزء الذي يتم تطبيقه عليه
  • قم بتوفير إحداثيات نسيج للإشارة إلى كيفية محاذاة صورة النسيج مع الكائنات الموجودة في المشهد الخاص بك
  • استخدم إنشاء إحداثيات نسيج تلقائي لإنتاج تأثيرات مثل خرائط الكنتور وخرائط البيئة

حتى الآن ، تم رسم كل بدائية هندسية إما بلون خالص أو مظللة بسلاسة بين الألوان عند قممها - أي أنها رُسِمت بدون تعيين نسيج. إذا كنت ترغب في رسم جدار كبير من الطوب بدون تخطيط نسيج ، على سبيل المثال ، يجب رسم كل لبنة كمضلع منفصل. بدون نسيج ، قد يتطلب الجدار المسطح الكبير - وهو في الحقيقة مستطيل واحد - آلاف الطوب الفردي ، وحتى في هذه الحالة قد يبدو الطوب سلسًا ومنتظمًا لدرجة يصعب معها أن يكون واقعيًا.

يتيح لك تعيين النسيج لصق صورة لجدار من الطوب (ربما عن طريق المسح في صورة لجدار حقيقي) على مضلع ورسم الجدار بالكامل كمضلع واحد. يضمن تعيين النسيج حدوث كل الأشياء الصحيحة أثناء تحويل المضلع وعرضه. على سبيل المثال ، عندما يُنظر إلى الجدار في المنظور ، قد يظهر الطوب أصغر حيث يبتعد الجدار عن وجهة النظر. تشمل الاستخدامات الأخرى لرسم خرائط النسيج تصوير الغطاء النباتي على مضلعات كبيرة تمثل الأرض في أنماط ورق الحائط لمحاكاة الطيران والأنسجة التي تجعل المضلعات تبدو وكأنها مواد طبيعية مثل الرخام أو الخشب أو القماش.الاحتمالات لا حصر لها. على الرغم من أنه من الطبيعي جدًا التفكير في تطبيق الزخارف على المضلعات ، يمكن تطبيق الأنسجة على جميع العناصر الأولية - النقاط والخطوط والمضلعات والصور النقطية والصور. توضح اللوحات 6 و 8 و 18 21 و 24 و 27 و 29 31 كلها استخدام الزخارف.

نظرًا لوجود العديد من الاحتمالات ، يعد تعيين النسيج موضوعًا كبيرًا ومعقدًا إلى حد ما ، ويجب عليك اتخاذ العديد من خيارات البرمجة عند استخدامه. على سبيل المثال ، يمكنك تعيين الأنسجة على أسطح مصنوعة من مجموعة من المضلعات أو الأسطح المنحنية ، ويمكنك تكرار نسيج في اتجاه واحد أو كلا الاتجاهين لتغطية السطح. يمكن أن يكون النسيج أحادي البعد. بالإضافة إلى ذلك ، يمكنك تعيين نسيج تلقائيًا على كائن بطريقة تشير النسيج إلى معالم أو خصائص أخرى للعنصر الذي يتم عرضه. يمكن زخرفة الأشياء اللامعة بحيث تبدو وكأنها في وسط غرفة أو بيئة أخرى ، مما يعكس البيئة المحيطة عن أسطحها. أخيرًا ، يمكن تطبيق النسيج على السطح بطرق مختلفة. يمكن رسمها مباشرة (مثل الملصق الموضوعة على السطح) ، أو استخدامها لتعديل اللون الذي كان يمكن رسم السطح به بطريقة أخرى ، أو استخدامها لمزج لون النسيج مع لون السطح. إذا كان هذا هو أول تعرض لك لرسم خرائط النسيج ، فقد تجد أن المناقشة في هذا الفصل تتحرك بسرعة إلى حد ما. كمرجع إضافي ، يمكنك إلقاء نظرة على الفصل الخاص بتعيين النسيج في أساسيات رسومات الكمبيوتر ثلاثية الأبعاد بواسطة Alan Watt (Reading، MA: Addison-Wesley Publishing Company، 1990).

الأنسجة هي ببساطة مصفوفات بيانات مستطيلة الشكل - على سبيل المثال ، بيانات الألوان أو بيانات النصوع أو بيانات اللون وبيانات ألفا. غالبًا ما تسمى القيم الفردية في مصفوفة النسيج بـ texels. ما يجعل رسم خرائط النسيج أمرًا صعبًا هو أنه يمكن تعيين نسيج مستطيل إلى مناطق غير مستطيلة ، ويجب القيام بذلك بطريقة معقولة.

يوضح الشكل 9-1 عملية رسم خرائط النسيج. يمثل الجانب الأيسر من الشكل النسيج بالكامل ، ويمثل المخطط التفصيلي الأسود شكلًا رباعيًا يتم تعيين أركانه على تلك البقع على النسيج. عندما يتم عرض الشكل الرباعي على الشاشة ، فقد يتم تشويهه من خلال تطبيق تحويلات مختلفة - التدوير ، والترجمات ، والقياس ، والإسقاطات. يُظهر الجانب الأيمن من الشكل كيف يمكن أن يظهر الشكل الرباعي المعين نسيجًا على شاشتك بعد هذه التحولات. (لاحظ أن هذا الشكل الرباعي مقعر وقد لا يتم عرضه بشكل صحيح بواسطة OpenGL بدون استخدام الفسيفساء مسبقًا. راجع الفصل 11 للحصول على مزيد من المعلومات حول المضلعات بالفسيفساء.)

الشكل 9-1: عملية رسم الخرائط

لاحظ كيف يتم تشويه النسيج ليطابق تشويه الشكل الرباعي. في هذه الحالة ، يتم شدها في الاتجاه x وضغطها في الاتجاه y ، وهناك القليل من الدوران والقص أيضًا. اعتمادًا على حجم النسيج ، وتشويه الشكل الرباعي ، وحجم الصورة المعروضة على الشاشة ، قد يتم تعيين بعض النصوص إلى أكثر من جزء واحد ، وقد تتم تغطية بعض الأجزاء بنصوص متعددة. نظرًا لأن النسيج يتكون من تكسيل منفصل (في هذه الحالة ، 256 و 180 256 منها) ، يجب إجراء عمليات التصفية لتعيين التكسيل إلى الأجزاء. على سبيل المثال ، إذا كانت العديد من النصوص تتوافق مع جزء ما ، فسيتم حساب متوسطها لتناسب إذا كانت حدود texel تتخطى حدود الأجزاء ، ويتم تنفيذ متوسط ​​مرجح للنصوص القابلة للتطبيق. بسبب هذه الحسابات ، يعد التركيب باهظ التكلفة من الناحية الحسابية ، وهذا هو السبب في أن العديد من أنظمة الرسومات المتخصصة تتضمن دعمًا للأجهزة لرسم خرائط النسيج.

قد ينشئ التطبيق كائنات نسيج ، حيث يمثل كل كائن نسيج نسيجًا واحدًا (والخرائط الصورية المرتبطة المحتملة). يمكن لبعض تطبيقات OpenGL أن تدعم مجموعة عمل خاصة من كائنات النسيج التي تتمتع بأداء أفضل من كائنات النسيج خارج مجموعة العمل. يقال إن كائنات النسيج عالية الأداء هذه مقيمة وقد تحتوي على أجهزة و / أو تسريع برامج خاص متاح. يمكنك استخدام OpenGL لإنشاء وحذف كائنات النسيج ولتحديد الأنسجة التي تشكل مجموعة العمل الخاصة بك.

يغطي هذا الفصل وسيلة OpenGL لرسم خرائط النسيج في الأقسام الرئيسية التالية.

  • "نظرة عامة ومثال" يعطي نظرة موجزة وواسعة على الخطوات المطلوبة لإجراء تعيين النسيج. كما يقدم مثالًا بسيطًا نسبيًا لرسم خرائط النسيج.
  • يوضح "تحديد النسيج" كيفية تحديد الزخارف أحادية أو ثنائية الأبعاد. يناقش أيضًا كيفية استخدام حدود النسيج ، وكيفية توفير سلسلة من الأنسجة ذات الصلة بأحجام مختلفة ، وكيفية التحكم في طرق التصفية المستخدمة لتحديد كيفية تعيين نسيج مطبق على إحداثيات الشاشة.
  • توضح "التصفية" كيفية تكبير الأنسجة أو تصغيرها أثناء تطبيقها على وحدات البكسل في المضلعات. يتم أيضًا شرح التصغير باستخدام مواد خاصة لخريطة الصور الدقيقة.
  • تصف "Texture Objects" كيفية وضع صور النسيج في الكائنات بحيث يمكنك التحكم في العديد من الأنسجة في وقت واحد. باستخدام كائنات النسيج ، قد تتمكن من إنشاء مجموعة عمل من الأنسجة عالية الأداء ، والتي يُقال إنها مقيمة. يمكنك أيضًا إعطاء الأولوية لكائنات النسيج لزيادة أو تقليل احتمالية وجود كائن نسيج.
  • تناقش "وظائف النسيج" الطرق المستخدمة لطلاء نسيج على السطح. يمكنك اختيار أن تحل قيم ألوان النسيج محل تلك التي سيتم استخدامها إذا لم يكن النسيج ساريًا ، أو يمكنك جعل اللون النهائي مزيجًا من الاثنين.
  • يصف "تعيين إحداثيات النسيج" كيفية حساب إحداثيات النسيج المناسبة وتعيينها لرؤوس الكائن. يشرح أيضًا كيفية التحكم في سلوك الإحداثيات التي تقع خارج النطاق الافتراضي - أي كيفية تكرار أو تثبيت الأنسجة عبر السطح.
  • يوضح "إنشاء التنسيق التلقائي للنسيج" كيفية جعل OpenGL يقوم تلقائيًا بإنشاء إحداثيات نسيج بحيث يمكنك تحقيق تأثيرات مثل خرائط المحيط وخرائط البيئة.
  • توضح "الميزات المتقدمة" كيفية معالجة مكدس مصفوفة النسيج وكيفية استخدام إحداثيات النسيج q.

يقدم الإصدار 1.1 من OpenGL العديد من عمليات رسم الخرائط الجديدة:

    • ثمانية وثلاثون تنسيقًا إضافيًا للصور الداخلية
    • وكيل نسيج ، للاستعلام عما إذا كانت هناك موارد كافية لاستيعاب صورة نسيج معينة
    • الصورة الفرعية للنسيج ، لاستبدال كل أو جزء من صورة نسيج موجودة بدلاً من حذف وإنشاء نسيج بالكامل لتحقيق نفس التأثير
    • تحديد بيانات النسيج من ذاكرة التخزين المؤقت (وكذلك من ذاكرة المعالج)
    • كائنات النسيج ، بما في ذلك الزخارف المقيمة وتحديد الأولويات

    إذا حاولت استخدام إحدى عمليات تعيين النسيج ولم تتمكن من العثور عليها ، فتحقق من رقم إصدار تطبيق OpenGL لمعرفة ما إذا كان يدعمه بالفعل. (راجع "ما هو الإصدار الذي أستخدمه؟" في الفصل 14.)

    نظرة عامة ومثال

    يقدم هذا القسم نظرة عامة على الخطوات اللازمة لإجراء تعيين النسيج. كما يقدم برنامج رسم خرائط نسيج بسيط نسبيًا. بالطبع ، أنت تعلم أن رسم خرائط النسيج يمكن أن يكون عملية معقدة للغاية.

    خطوات رسم الخرائط

    لاستخدام تعيين النسيج ، يمكنك تنفيذ هذه الخطوات.

    قم بإنشاء كائن نسيج وحدد نسيجًا لذلك الكائن.

    أشر إلى كيفية تطبيق النسيج على كل بكسل.

    ارسم المشهد مع توفير كل من الإحداثيات الملمس والهندسية.

    ضع في اعتبارك أن تعيين النسيج يعمل فقط في وضع RGBA. نتائج تعيين النسيج في صيغة مؤشر اللون غير محددة.

    قم بإنشاء كائن Texture وحدد نسيجًا لذلك الكائن

    عادةً ما يُنظر إلى النسيج على أنه ثنائي الأبعاد ، مثل معظم الصور ، ولكن يمكن أيضًا أن يكون أحادي البعد. قد تتكون البيانات التي تصف نسيجًا من عنصر واحد أو عنصرين أو ثلاثة أو أربعة عناصر لكل texel ، والتي تمثل أي شيء من ثابت التعديل إلى رباعي (R ، G ، B ، A).

    في المثال 9-1 ، وهو بسيط للغاية ، يتم إنشاء كائن نسيج واحد للحفاظ على نسيج واحد ثنائي الأبعاد. هذا المثال لا يكتشف مقدار الذاكرة المتوفرة. نظرًا لأنه يتم إنشاء نسيج واحد فقط ، فلا توجد محاولة لتحديد أولويات أو إدارة مجموعة عمل من كائنات النسيج. لا يتم استخدام التقنيات المتقدمة الأخرى ، مثل حدود النسيج أو خرائط الصور ، في هذا المثال البسيط.

    أشر إلى كيفية تطبيق النسيج على كل بكسل

    يمكنك اختيار أي من أربع وظائف ممكنة لحساب قيمة RGBA النهائية من لون الجزء وبيانات صورة النسيج. أحد الاحتمالات هو ببساطة استخدام لون النسيج باعتباره اللون النهائي ، وهذا هو وضع الملصق ، حيث يتم رسم النسيج أعلى الجزء ، تمامًا مثل وضع الملصق. (يستخدم المثال 9-1 وضع الملصق.) وضع الاستبدال ، وهو متغير من وضع الملصق ، هو طريقة ثانية. هناك طريقة أخرى وهي استخدام النسيج لتعديل أو قياس لون القطعة ، هذه التقنية مفيدة للجمع بين تأثيرات الإضاءة والتركيب. أخيرًا ، يمكن مزج لون ثابت مع لون الجزء ، بناءً على قيمة النسيج.

    تمكين تعيين النسيج

    تحتاج إلى تمكين التركيب قبل رسم المشهد الخاص بك. يتم تمكين النسيج أو تعطيله باستخدام glEnable () أو glDisable () مع الثابت الرمزي GL_TEXTURE_1D أو GL_TEXTURE_2D للتركيب أحادي أو ثنائي الأبعاد ، على التوالي. (إذا تم تمكين كلاهما ، فإن GL_TEXTURE_2D هو الذي يتم استخدامه.)

    ارسم المشهد مع توفير كل من الملمس والإحداثيات الهندسية

    تحتاج إلى الإشارة إلى كيفية محاذاة النسيج بالنسبة للأجزاء التي سيتم تطبيقه عليها قبل "لصقها". أي أنك تحتاج إلى تحديد كل من إحداثيات النسيج والإحداثيات الهندسية أثناء تحديد الكائنات في المشهد الخاص بك. بالنسبة لخريطة نسيج ثنائية الأبعاد ، على سبيل المثال ، تتراوح إحداثيات النسيج من 0.0 إلى 1.0 في كلا الاتجاهين ، ولكن يمكن أن تكون إحداثيات العناصر المنسقة أي شيء. بالنسبة لمثال جدار القرميد ، إذا كان الجدار مربعًا ويقصد به تمثيل نسخة واحدة من النسيج ، فمن المحتمل أن يقوم الكود بتعيين إحداثيات نسيج (0 ، 0) ، (1 ، 0) ، (1 ، 1) ، (0) ، 1) إلى الزوايا الأربع للجدار. إذا كان الجدار كبيرًا ، فقد ترغب في رسم عدة نسخ من خريطة النسيج الموجودة عليه. إذا قمت بذلك ، فيجب تصميم خريطة النسيج بحيث تتطابق الطوب الموجود على الحافة اليسرى بشكل جيد مع الطوب الموجود على الحافة اليمنى ، وبالمثل للطوب الموجود في الأعلى وتلك الموجودة في الأسفل.

    يجب عليك أيضًا الإشارة إلى كيفية معالجة إحداثيات النسيج خارج النطاق [0.0،1.0]. هل تتكرر الأنسجة لتغطية الكائن ، أم أنها مثبتة بقيمة حدية؟

    برنامج عينة

    تتمثل إحدى مشكلات عرض نماذج البرامج لتوضيح رسم خرائط النسيج في أن القوام المثير للاهتمام كبير. عادةً ما تتم قراءة الأنسجة من ملف صورة ، نظرًا لأن تحديد نسيج برمجيًا قد يستغرق مئات الأسطر من التعليمات البرمجية. في المثال 9-1 ، يتم إنشاء النسيج - الذي يتكون من مربعات بيضاء وسوداء متبادلة ، مثل رقعة الشطرنج - بواسطة البرنامج. يطبق البرنامج هذا النسيج على مربعين ، يتم عرضهما بعد ذلك في المنظور ، أحدهما يواجه المشاهد بشكل مباشر والآخر يميل للخلف عند 45 درجة ، كما هو موضح في الشكل 9-2. في إحداثيات الكائن ، يكون كلا المربعين بنفس الحجم.

    الشكل 9-2: المربعات المعينة بالنسيج

    مثال 9-1: رقعة شطرنج معينة بالنسيج: checker.c

    يتم إنشاء نسيج رقعة الشطرنج في الإجراء الروتيني makeCheckImage () ، وتحدث جميع عمليات تهيئة تعيين النسيج في إجراء init () الروتيني. اسم glGenTextures () و glBindTexture () وإنشاء كائن نسيج لصورة نسيج. (راجع "Texture Objects.") يتم تحديد خريطة النسيج الفردية كاملة الدقة بواسطة glTexImage2D () ، والتي تشير معلماتها إلى حجم الصورة ونوعها وموقعها وخصائص أخرى لها. (راجع "تحديد الملمس" للحصول على مزيد من المعلومات حول glTexImage2D ().)

    تحدد الاستدعاءات الأربعة لـ glTexParameter * () كيفية التفاف النسيج وكيفية تصفية الألوان إذا لم يكن هناك تطابق تام بين وحدات البكسل في النسيج والبكسل على الشاشة. (راجع "التكرار وتحامل القوام" و "التصفية").

    في الشاشة () ، يقوم glEnable () بتشغيل التركيب. يضبط glTexEnv * () وضع الرسم على GL_DECAL بحيث يتم رسم المضلعات المنسوجة باستخدام الألوان من خريطة النسيج (بدلاً من مراعاة اللون الذي تم رسم المضلعات بدون النسيج).

    ثم يتم رسم مضلعين. لاحظ أن إحداثيات النسيج محددة مع إحداثيات الرأس. يتصرف الأمر glTexCoord * () بشكل مشابه للأمر glNormal (). يعيّن glTexCoord * () إحداثيات النسيج الحالية ، أي أمر رأس تالٍ يحتوي على إحداثيات النسيج المرتبطة به حتى يتم استدعاء glTexCoord * () مرة أخرى.

    ملاحظة: قد تبدو صورة رقعة الشطرنج على المضلع المائل خاطئة عند تجميعها وتشغيلها على جهازك - على سبيل المثال ، قد تبدو مثل مثلثين بهما إسقاطات مختلفة لصورة رقعة الداما عليهما. إذا كان الأمر كذلك ، فحاول تعيين المعلمة GL_PERSPECTIVE_CORRECTION_HINT على GL_NICEST وتشغيل المثال مرة أخرى. للقيام بذلك ، استخدم glHint ().

    تحديد الملمس

    يعرّف الأمر glTexImage2D () نسيجًا ثنائي الأبعاد. يتطلب الأمر العديد من الحجج ، والتي تم وصفها بإيجاز هنا وبمزيد من التفصيل في الأقسام الفرعية التالية. يتم وصف الأمر المرتبط بالقوام أحادي البعد ، glTexImage1D () ، في "نسيج أحادي البعد".

    باطل glTexImage2D (هدف GLenum ، مستوى GLint ، تنسيق GLint الداخلي ،
    عرض GLsizei ، ارتفاع GLsizei ، حدود GLint ،
    تنسيق GLenum ، نوع GLenum ،
    const GLvoid * pixels) تحدد نسيجًا ثنائي الأبعاد. يتم تعيين المعلمة الهدف إما على GL_TEXTURE_2D الثابت أو GL_PROXY_TEXTURE_2D. يمكنك استخدام معلمة المستوى إذا كنت توفر دقة متعددة لخريطة النسيج بدقة واحدة فقط ، فيجب أن يكون المستوى 0. (راجع "مستويات متعددة من التفاصيل" لمزيد من المعلومات حول استخدام درجات دقة متعددة.) تشير المعلمة التالية ، "تنسيق داخلي" ، إلى أي من مكونات R و G و B و A أو قيم النصوع أو الكثافة المحددة للاستخدام في وصف تكسيل الصورة. قيمة InternalFormat هو عدد صحيح من 1 إلى 4 ، أو واحد من ثمانية وثلاثين من الثوابت الرمزية. الثوابت-ثمانية وثلاثون رمزي التي هي أيضا القيم القانونية لinternalFormat هي GL_ALPHA، GL_ALPHA4، GL_ALPHA8، GL_ALPHA12، GL_ALPHA16، GL_LUMINANCE، GL_LUMINANCE4، GL_LUMINANCE8، GL_LUMINANCE12، GL_LUMINANCE16، GL_LUMINANCE_ALPHA، GL_LUMINANCE4_ALPHA4، GL_LUMINANCE6_ALPHA2، GL_LUMINANCE8_ALPHA8، GL_LUMINANCE12_ALPHA4، GL_LUMINANCE12_ALPHA12، GL_LUMINANCE16_ALPHA16، GL_INTENSITY، GL_INTENSITY4 ، GL_INTENSITY8 ، GL_INTENSITY12 ، GL_INTENSITY16 ، GL_RGB ، GL_R3_G3_B2 ، GL_RGB4 ، GL_RGB5 ، GL_RGB8 ، GL_RGB10 ، GL_RGB12 ، GL_RGB16 ، GL_RGBA ، GL_RGBA2 ، GLRBA ، GL_RGBA4 ، GLR8 (راجع "وظائف النسيج" للاطلاع على مناقشة حول كيفية تطبيق هذه المكونات المحددة.) إذا كان التنسيق الداخلي هو أحد الثوابت الرمزية الثمانية والثلاثين ، فأنت تطلب مكونات محددة وربما دقة هذه المكونات. على سبيل المثال ، إذا كان تنسيق InternalFormat هو GL_R3_G3_B2 ، فأنت تطلب أن تكون النصوص 3 بت من اللون الأحمر و 3 بتات من اللون الأخضر و 2 بت من اللون الأزرق ، ولكن OpenGL ليس مضمونًا لتقديم ذلك. OpenGL ملزم فقط باختيار تمثيل داخلي يقارب ما هو مطلوب ، ولكن المطابقة التامة غير مطلوبة عادة. بحكم التعريف ، GL_LUMINANCE و GL_LUMINANCE_ALPHA و GL_RGB و GL_RGBA متساهلون ، لأنهم لا يطلبون دقة معينة. (للتوافق مع إصدار OpenGL 1.0 ، القيم الرقمية 1 و 2 و 3 و 4 ، للتنسيق الداخلي ، تكافئ الثوابت الرمزية GL_LUMINANCE و GL_LUMINANCE_ALPHA و GL_RGB و GL_RGBA ، على التوالي.) تعطي معلمات العرض والارتفاع الأبعاد يشير حد صورة النسيج إلى عرض الحد ، والذي يكون إما صفرًا (بلا حدود) أو واحدًا. (راجع "استخدام حدود نسيج".) يجب أن يكون كل من العرض والارتفاع بالشكل 2m + 2b ، حيث m هو عدد صحيح غير سالب (والذي يمكن أن يكون له قيمة مختلفة للعرض عن قيمة الارتفاع) و b هي قيمة الحد. يعتمد الحد الأقصى لحجم خريطة النسيج على تطبيق OpenGL ، ولكن يجب أن يكون 64 & # 180 64 على الأقل (أو 66 & # 180 66 بحدود). تصف معلمات التنسيق والنوع التنسيق ونوع البيانات لبيانات صورة النسيج. لها نفس المعنى كما هو الحال مع glDrawPixels (). (راجع "خط أنابيب التصوير" في الفصل 8.) في الواقع ، تكون بيانات النسيج بنفس تنسيق البيانات المستخدمة بواسطة glDrawPixels () ، لذلك يتم تطبيق إعدادات glPixelStore * () و glPixelTransfer * (). (في المثال 9-1 ، المكالمة
    تم إنشاؤه لأن البيانات الموجودة في المثال ليست مبطنة في نهاية كل صف texel.) يمكن أن تكون معلمة التنسيق GL_COLOR_INDEX أو GL_RGB أو GL_RGBA أو GL_RED أو GL_GREEN أو GL_BLUE أو GL_ALPHA أو GL_LUMINANCE أو GL_LUMINANCE_ALPHA - وهذا هو نفسه التنسيقات المتاحة لـ glDrawPixels () باستثناء GL_STENCIL_INDEX و GL_DEPTH_COMPONENT. وبالمثل ، يمكن أن تكون معلمة النوع GL_BYTE أو GL_UNSIGNED_BYTE أو GL_SHORT أو GL_UNSIGNED_SHORT أو GL_INT أو GL_UNSIGNED_INT أو GL_FLOAT أو GL_BITMAP. أخيرًا ، تحتوي وحدات البكسل على بيانات صورة النسيج. تصف هذه البيانات صورة النسيج نفسها بالإضافة إلى حدودها.

    قد يؤثر التنسيق الداخلي لصورة النسيج على أداء عمليات النسيج. على سبيل المثال ، تقوم بعض التطبيقات بإجراء التركيب باستخدام GL_RGBA أسرع من GL_RGB ، لأن مكونات اللون تعمل على محاذاة ذاكرة المعالج بشكل أفضل. نظرًا لاختلاف هذا ، يجب عليك التحقق من معلومات محددة حول تنفيذك لبرنامج OpenGL.

    قد يتحكم التنسيق الداخلي لصورة النسيج أيضًا في مقدار الذاكرة التي تستهلكها صورة النسيج. على سبيل المثال ، يستخدم نسيج التنسيق الداخلي GL_RGBA8 32 بت لكل texel ، بينما يستخدم نسيج التنسيق الداخلي GL_R3_G3_B2 8 بت فقط لكل texel. بالطبع ، هناك مفاضلة مقابلة بين استهلاك الذاكرة ودقة اللون.

    ملاحظة: على الرغم من أن نتائج تعيين النسيج في صيغة مؤشر اللون غير محددة ، فلا يزال بإمكانك تحديد نسيج باستخدام صورة GL_COLOR_INDEX. في هذه الحالة ، يتم تطبيق عمليات نقل البكسل لتحويل المؤشرات إلى قيم RGBA عن طريق البحث في الجدول قبل استخدامها لتشكيل صورة النسيج.

    يجب أن يكون عدد النصوص لكل من عرض صورة النسيج وارتفاعها ، دون تضمين الحدود الاختيارية ، بقوة 2. إذا كانت صورتك الأصلية لا تحتوي على أبعاد تناسب هذا القيد ، فيمكنك استخدام روتين مكتبة OpenGL المساعدة gluScaleImage () لتغيير حجم الزخارف الخاصة بك.

    int gluScaleImage (تنسيق GLenum ، GLint widthin ، GLint heightin ،
    نوع GLenum ، الثابت * datain ، عرض GLint ،
    ارتفاع GLint ، وكتابة GLenum ، وبيانات باطلة *) تقوم بقياس صورة باستخدام أوضاع تخزين البكسل المناسبة لفك ضغط البيانات من البيانات. يمكن أن تشير معلمات التنسيق والنوع والكتابة إلى أي من التنسيقات أو أنواع البيانات التي يدعمها glDrawPixels (). يتم تحجيم الصورة باستخدام الاستيفاء الخطي وتصفية الصندوق (من الحجم المشار إليه بواسطة العرض والارتفاع إلى العرض والارتفاع) ، وتتم كتابة الصورة الناتجة على dataout ، باستخدام أوضاع التخزين GL_PACK * بالبكسل. يجب على مستدعي gluScaleImage () تخصيص مساحة كافية لمخزن الإخراج.يتم إرجاع القيمة 0 عند النجاح ، ويتم إرجاع رمز خطأ GLU عند الفشل.

    يمكن أيضًا استخدام إطار التخزين المؤقت نفسه كمصدر لبيانات النسيج. تقرأ glCopyTexImage2D () مستطيلاً من وحدات البكسل من حافظة الإطارات ويستخدمها لنسيج جديد.

    باطل glCopyTexImage2D (هدف GLenum ، مستوى GLint ،
    تنسيق GLint الداخلي ،
    GLint x ، GLint y ، عرض GLsizei ، ارتفاع GLsizei ،
    GLint border) لإنشاء نسيج ثنائي الأبعاد ، باستخدام بيانات الإطارات الاحتياطية لتعريف التكسيل. تتم قراءة وحدات البكسل من GL_READ_BUFFER الحالي وتتم معالجتها تمامًا كما لو تم استدعاء glCopyPixels () ولكن تم إيقافها قبل التحويل النهائي. يتم تطبيق إعدادات glPixelTransfer * (). يجب تعيين المعلمة الهدف على GL_TEXTURE_2D الثابت. يكون لمعلمات المستوى ، و InternalFormat ، و border نفس التأثيرات التي تمتلكها مع glTexImage2D (). يتم أخذ مصفوفة النسيج من مستطيل بكسل محاذي للشاشة مع الزاوية اليسرى السفلية عند الإحداثيات المحددة بواسطة المعلمات (س ، ص). تحدد معلمات العرض والارتفاع حجم مستطيل البكسل هذا. يجب أن يكون كل من العرض والارتفاع بالصيغة 2m + 2b ، حيث m هو عدد صحيح غير سالب (والذي يمكن أن يكون له قيمة مختلفة للعرض عن الارتفاع) و b هي قيمة الحد.

    تقدم الأقسام التالية مزيدًا من التفاصيل حول التركيب ، بما في ذلك استخدام معلمات الهدف والحد والمستوى. يمكن استخدام المعلمة الهدف للاستعلام بدقة عن حجم النسيج (عن طريق إنشاء وكيل نسيج باستخدام glTexImage * D ()) وما إذا كان يمكن استخدام نسيج داخل موارد النسيج لتطبيق OpenGL. يتم وصف إعادة تعريف جزء من نسيج في "استبدال كل أو جزء من صورة نسيج." تتم مناقشة الزخارف أحادية البعد في "مواد أحادية البعد". تم تفصيل حدود النسيج ، والتي يتم التحكم في حجمها بواسطة معلمة الحدود ، في "استخدام حدود نسيج". يتم استخدام معلمة المستوى لتحديد مواد ذات دقة مختلفة ويتم دمجها في التقنية الخاصة لرسم الخرائط ، والتي يتم شرحها في "مستويات متعددة من التفاصيل". تتطلب Mipmapping فهم كيفية تصفية الزخارف لأنها مطبقة ، فإن التصفية هي موضوع "التصفية".

    وكيل نسيج

    بالنسبة لمبرمج OpenGL الذي يستخدم الزخارف ، فإن الحجم مهم. عادةً ما تكون موارد النسيج محدودة وتتنوع بين تطبيقات OpenGL. هناك هدف بروكسي خاص للنسيج لتقييم ما إذا كانت الموارد الكافية متوفرة.

    تخبرك glGetIntegerv (GL_MAX_TEXTURE_SIZE.) بأكبر بُعد (عرض أو ارتفاع ، بدون حدود) لصورة نسيج ، وعادة ما يكون حجم أكبر نسيج مربع مدعوم. ومع ذلك ، لا يأخذ GL_MAX_TEXTURE_SIZE في الاعتبار تأثير التنسيق الداخلي للنسيج. قد تستخدم صورة النسيج التي تخزن texels باستخدام التنسيق الداخلي GL_RGBA16 64 بت لكل texel ، لذلك قد يلزم أن تكون صورتها أصغر بمقدار 16 مرة من الصورة ذات التنسيق الداخلي GL_LUMINANCE4. (أيضًا ، قد تؤدي الصور التي تتطلب حدودًا أو خرائط mipm إلى تقليل حجم الذاكرة المتوفرة.)

    يسمح حامل المكان الخاص ، أو الوكيل ، لصورة النسيج للبرنامج بالاستعلام بشكل أكثر دقة عما إذا كان OpenGL يمكنه استيعاب نسيج للتنسيق الداخلي المطلوب. لاستخدام الوكيل للاستعلام عن OpenGL ، قم باستدعاء glTexImage2D () مع معلمة هدف GL_PROXY_TEXTURE_2D والمستوى المحدد ، تنسيق داخلي ، عرض ، ارتفاع ، حد ، تنسيق ، ونوع. (بالنسبة للأنسجة أحادية البعد ، استخدم إجراءات 1D المقابلة والثوابت الرمزية.) بالنسبة إلى الوكيل ، يجب أن تمرر NULL كمؤشر لصفيف البكسل.

    لمعرفة ما إذا كانت هناك موارد كافية متاحة للنسيج الخاص بك ، بعد إنشاء وكيل النسيج ، استعلم عن متغيرات حالة النسيج باستخدام glGetTexLevelParameter * (). إذا لم تكن هناك موارد كافية لاستيعاب وكيل النسيج ، فسيتم تعيين متغيرات حالة النسيج للعرض والارتفاع وعرض الحدود ودقة المكونات على 0.

    glGetTexLevelParameter باطل v (هدف GLenum ، مستوى GLint ،
    GLenum pname ، TYPE * params) يرجع في قيم معلمات نسيج المعلمات لمستوى معين من التفاصيل ، محدد كمستوى. الهدف يحدد النسيج الهدف وهو أحد GL_TEXTURE_1D أو GL_TEXTURE_2D أو GL_PROXY_TEXTURE_1D أو GL_PROXY_TEXTURE_2D. القيم المقبولة لـ pname هي GL_TEXTURE_WIDTH ، GL_TEXTURE_HEIGHT ، GL_TEXTURE_BORDER ، GL_TEXTURE_INTERNAL_FORMAT ، GL_TEXTURE_RED_SIZE ، GL_TEXTURE_GREEN_SIZE ، GL_TEXTURE_BLUE_SIZE ، GL_TEXTURE_BLUE_SIZE ، GL_TEXTURE_BLUE_SIZE ، GL_TEXTURE_BLUE_SIZE ، GL_TEXTURE_BLUE_SIZE ، يتم قبول GL_TEXTURE_COMPONENTS أيضًا لـ pname ، ولكن فقط للتوافق مع الإصدارات السابقة مع OpenGL الإصدار 1.0 - GL_TEXTURE_INTERNAL_FORMAT هو الثابت الرمزي الموصى به للإصدار 1.1.

    يوضح المثال 9-2 كيفية استخدام وكيل النسيج لمعرفة ما إذا كانت هناك موارد كافية لإنشاء نسيج texel 64 & # 180 64 بمكونات RGBA بدقة 8 بت. إذا نجح ذلك ، فإن glGetTexLevelParameteriv () يخزن التنسيق الداخلي (في هذه الحالة ، GL_RGBA8) في تنسيق متغير.

    مثال 9-2: استعلام عن موارد Texture باستخدام وكيل Texture

    ملاحظة: هناك قيود رئيسية واحدة حول وكلاء النسيج: يخبرك وكيل النسيج إذا كان هناك مساحة للنسيج الخاص بك ، ولكن فقط إذا كانت جميع موارد النسيج متاحة (بمعنى آخر ، إذا كان النسيج هو النسيج الوحيد في المدينة). إذا كانت الأنسجة الأخرى تستخدم الموارد ، فقد يستجيب استعلام وكيل النسيج بشكل إيجابي ، ولكن قد لا تكون هناك مساحة كافية لجعل نسيجك مقيمًا (أي جزء من مجموعة عمل عالية الأداء محتملة من القوام). (انظر "Texture Objects" لمزيد من المعلومات حول إدارة القوام المقيم.)

    استبدال صورة نسيج بالكامل أو جزء منها

    قد يكون إنشاء نسيج أكثر تكلفة من الناحية الحسابية من تعديل نسيج موجود. في الإصدار 1.1 من OpenGL ، توجد إجراءات جديدة لاستبدال كل أو جزء من صورة النسيج بمعلومات جديدة. يمكن أن يكون هذا مفيدًا لبعض التطبيقات ، مثل استخدام صور الفيديو الملتقطة في الوقت الفعلي كصور نسيج. بالنسبة لهذا التطبيق ، من المنطقي إنشاء نسيج واحد واستخدام glTexSubImage2D () لاستبدال بيانات النسيج بشكل متكرر بصور فيديو جديدة. أيضًا ، لا توجد قيود على الحجم لـ glTexSubImage2D () تفرض أن يكون الارتفاع أو العرض قوة اثنين. هذا مفيد في معالجة صور الفيديو ، والتي لا تحتوي بشكل عام على أحجام تبلغ قوتها اثنين.

    void glTexSubImage2D (هدف GLenum ، مستوى GLint ، GLint xoffset ،
    GLint yoffset ، عرض GLsizei ، ارتفاع GLsizei ،
    تنسيق GLenum ، نوع GLenum ، const GLvoid * pixels) يحدد صورة نسيج ثنائية الأبعاد تحل محل كل أو جزء من منطقة فرعية متجاورة (في 2D ، إنها مجرد مستطيل) لصورة النسيج الحالية ثنائية الأبعاد. يجب تعيين المعلمة الهدف على GL_TEXTURE_2D. تتشابه معلمات المستوى والشكل والنوع مع المعلمات المستخدمة في glTexImage2D (). level هو رقم مستوى التفاصيل في الخريطة mipmap. ليس من الخطأ تحديد عرض أو ارتفاع للصفر ، لكن الصورة الفرعية لن يكون لها أي تأثير. يصف التنسيق والنوع التنسيق ونوع البيانات لبيانات صورة النسيج. تتأثر الصورة الفرعية أيضًا بالأوضاع التي تم تعيينها بواسطة glPixelStore * () و glPixelTransfer * (). تحتوي وحدات البكسل على بيانات النسيج للصورة الفرعية. العرض والارتفاع هما أبعاد المنطقة الفرعية التي تحل محل صورة النسيج الحالية بالكامل أو جزء منها. xoffset و yoffset يحددان إزاحة texel في اتجاهي x و y (مع (0 ، 0) في الزاوية اليسرى السفلية من النسيج) وحدد مكان وضع الصورة الفرعية ضمن مجموعة النسيج الموجودة. قد لا تشتمل هذه المنطقة على أي نصوص خارج نطاق مصفوفة النسيج المحددة في الأصل.

    في المثال 9-3 ، تم تعديل بعض التعليمات البرمجية من المثال 9-1 بحيث يؤدي الضغط على مفتاح "s" إلى إسقاط صورة فرعية صغيرة متقلب في الصورة الحالية. (يظهر النسيج الناتج في الشكل 9-3). يؤدي الضغط على مفتاح "r" إلى استعادة الصورة الأصلية. يوضح المثال 9-3 الإجراءين الروتينيين ، makeCheckImages () ولوحة المفاتيح () ، اللذين تم تغييرهما بشكل كبير. (راجع "Texture Objects" لمزيد من المعلومات حول glBindTexture ().)

    الشكل 9-3: الملمس مع الصورة المضافة

    مثال 9-3: استبدال Texture Subimage: texsub.c

    مرة أخرى ، يمكن استخدام الإطار المؤقت نفسه كمصدر لبيانات النسيج هذه المرة ، صورة فرعية للنسيج. تقرأ glCopyTexSubImage2D () مستطيلاً من وحدات البكسل من حافظة الإطارات وتستبدل جزءًا من مصفوفة نسيج موجودة. (glCopyTexSubImage2D () هو نوع من التقاطع بين glCopyTexImage2D () و glTexSubImage2D ().)

    باطل glCopyTexSubImage2D (هدف GLenum ، مستوى GLint ،
    GLint xoffset ، GLint yoffset ، GLint x ، GLint y ،
    GLsizei width، GLsizei height) يستخدم بيانات الصورة من frameebuffer لاستبدال كل أو جزء من المنطقة الفرعية المتجاورة لصورة النسيج الحالية ثنائية الأبعاد. تتم قراءة وحدات البكسل من GL_READ_BUFFER الحالي وتتم معالجتها تمامًا كما لو تم استدعاء glCopyPixels () ، وتتوقف قبل التحويل النهائي. يتم تطبيق إعدادات glPixelStore * () و glPixelTransfer * (). يجب تعيين المعلمة الهدف على GL_TEXTURE_2D. level هو رقم مستوى التفاصيل في الخريطة mipmap. xoffset و yoffset يحددان إزاحة texel في اتجاهي x و y (مع (0 ، 0) في الزاوية اليسرى السفلية من النسيج) وحدد مكان وضع الصورة الفرعية ضمن مجموعة النسيج الموجودة. يتم أخذ مصفوفة نسيج الصورة الفرعية من مستطيل بكسل محاذي للشاشة مع الزاوية اليسرى السفلية عند الإحداثيات المحددة بواسطة المعلمات (س ، ص). تحدد معلمات العرض والارتفاع حجم مستطيل الصورة الفرعية هذا.

    قوام أحادي البعد

    أحيانًا يكون النسيج أحادي البعد كافيًا - على سبيل المثال ، إذا كنت ترسم نطاقات منسوجة حيث يكون كل التباين في اتجاه واحد. يتصرف النسيج أحادي البعد وكأنه نسيج ثنائي الأبعاد بارتفاع = 1 ، وبدون حدود على طول الجزء العلوي والسفلي. جميع إجراءات تعريف النسيج ثنائي الأبعاد والنسيج الفرعي لها إجراءات مقابلة أحادية البعد. لإنشاء نسيج بسيط أحادي البعد ، استخدم glTexImage1D ().

    باطل glTexImage1D (هدف GLenum ، مستوى GLint ، تنسيق GLint داخلي ،
    عرض GLsizei ، حدود GLint ، تنسيق GLenum ،
    نوع GLenum ، const GLvoid * pixels) يحدد نسيجًا أحادي البعد. جميع المعلمات لها نفس المعاني مثل glTexImage2D () ، باستثناء أن الصورة الآن عبارة عن مصفوفة أحادية البعد من texels. كما كان من قبل ، فإن قيمة العرض هي 2m (أو 2m + 2 ، إذا كان هناك حد) ، حيث m هو عدد صحيح غير سالب. يمكنك توفير خرائط الصور ، والوكلاء (تعيين الهدف على GL_PROXY_TEXTURE_1D) ، وتتوفر خيارات التصفية نفسها أيضًا.

    للحصول على نموذج برنامج يستخدم مخطط نسيج أحادي البعد ، انظر المثال 9-6.

    لاستبدال كل أو بعض النصوص الخاصة بنسيج أحادي البعد ، استخدم glTexSubImage1D ().

    void glTexSubImage1D (هدف GLenum ، مستوى GLint ، GLint xoffset ،
    عرض GLsizei ، تنسيق GLenum ،
    نوع GLenum ، const GLvoid * pixels) يحدد مصفوفة نسيج أحادية البعد تستبدل كل أو جزء من منطقة فرعية متجاورة (في 1D ، صف) لصورة النسيج الحالية أحادية البعد. يجب تعيين المعلمة الهدف على GL_TEXTURE_1D. تتشابه معلمات المستوى والشكل والنوع مع المعلمات المستخدمة في glTexImage1D (). level هو رقم مستوى التفاصيل في الخريطة mipmap. يصف التنسيق والنوع التنسيق ونوع البيانات لبيانات صورة النسيج. تتأثر الصورة الفرعية أيضًا بالأوضاع التي تم تعيينها بواسطة glPixelStore * () أو glPixelTransfer * ().

    تحتوي وحدات البكسل على بيانات النسيج للصورة الفرعية. العرض هو عدد النصوص التي تحل محل جزء أو كل صورة النسيج الحالية. يحدد xoffset إزاحة texel لمكان وضع الصورة الفرعية داخل مصفوفة النسيج الموجودة.

    لاستخدام الإطارات الاحتياطية كمصدر جديد أو بديل لمادة قديمة أحادية البعد ، استخدم إما glCopyTexImage1D () أو glCopyTexSubImage1D ().

    باطل glCopyTexImage1D (هدف GLenum ، مستوى GLint ،
    GLint InternalFormat و GLint x و GLint y و
    عرض GLsizei ، حدود GLint) لإنشاء نسيج أحادي البعد ، باستخدام بيانات الإطارات الاحتياطية لتحديد التكسيل. تتم قراءة وحدات البكسل من GL_READ_BUFFER الحالي وتتم معالجتها تمامًا كما لو تم استدعاء glCopyPixels () ولكن تم إيقافها قبل التحويل النهائي. يتم تطبيق إعدادات glPixelStore * () و glPixelTransfer * (). يجب تعيين المعلمة الهدف على GL_TEXTURE_1D الثابت. يكون لمعلمات المستوى ، و InternalFormat ، و border نفس التأثيرات الموجودة في glCopyTexImage2D (). يتم أخذ مصفوفة النسيج من صف من وحدات البكسل مع الزاوية اليسرى السفلية عند الإحداثيات المحددة بواسطة المعلمات (س ، ص). تحدد معلمة العرض عدد وحدات البكسل في هذا الصف. قيمة العرض هي 2m (أو 2m + 2 إذا كان هناك حد) ، حيث m هو عدد صحيح غير سالب. باطل glCopyTexSubImage1D (هدف GLenum ، مستوى GLint ، GLint xoffset ،
    GLint x، GLint y، GLsizei width) يستخدم بيانات الصورة من حاجز الإطارات لاستبدال كل أو جزء من المنطقة الفرعية المتجاورة لصورة النسيج الحالية أحادية البعد. تتم قراءة وحدات البكسل من GL_READ_BUFFER الحالي وتتم معالجتها تمامًا كما لو تم استدعاء glCopyPixels () ولكن تم إيقافها قبل التحويل النهائي. يتم تطبيق إعدادات glPixelStore * () و glPixelTransfer * (). يجب تعيين المعلمة الهدف على GL_TEXTURE_1D. level هو رقم مستوى التفاصيل في الخريطة mipmap. يحدد xoffset إزاحة texel ويحدد مكان وضع الصورة الفرعية داخل مصفوفة النسيج الموجودة. يتم أخذ مصفوفة نسيج الصورة الفرعية من صف من وحدات البكسل مع الزاوية اليسرى السفلية عند الإحداثيات المحددة بواسطة المعلمات (س ، ص). تحدد معلمة العرض عدد وحدات البكسل في هذا الصف.

    باستخدام حدود الملمس

    إذا كنت بحاجة إلى تطبيق خريطة نسيج أكبر مما يسمح به تطبيقك لـ OpenGL ، فيمكنك ، مع قليل من العناية ، عمل قوام أكبر بشكل فعال عن طريق التبليط باستخدام العديد من الأنسجة المختلفة. على سبيل المثال ، إذا كنت بحاجة إلى نسيج بحجم ضعف الحد الأقصى المسموح به للحجم المعين لمربع ، ارسم المربع بأربعة مربعات فرعية ، وحمل نسيجًا مختلفًا قبل رسم كل قطعة.

    نظرًا لأن خريطة نسيج واحدة فقط متاحة في وقت واحد ، فقد يؤدي هذا الأسلوب إلى مشاكل عند حواف الأنسجة ، خاصةً إذا تم تمكين أحد أشكال التصفية الخطية. يجب أن يتم حساب متوسط ​​قيمة النسيج التي سيتم استخدامها للبكسل عند الحواف بشيء ما وراء الحافة ، والذي ، بشكل مثالي ، يجب أن يأتي من خريطة النسيج المجاورة. إذا قمت بتعريف حد لكل نسيج تتساوى قيمه texel مع قيم texels على حافة خريطة النسيج المجاورة ، فإن السلوك الصحيح ينتج عند حدوث تصفية خطية.

    للقيام بذلك بشكل صحيح ، لاحظ أن كل خريطة يمكن أن تحتوي على ثمانية جيران - واحد مجاور لكل حافة وواحد يلامس كل زاوية. يجب أن تتوافق قيم النصوص الموجودة في زاوية الحد مع النصوص الموجودة في خرائط النسيج التي تمس الزوايا. إذا كان النسيج الخاص بك هو حافة أو زاوية من التبليط بأكمله ، فأنت بحاجة إلى تحديد القيم التي سيكون من المعقول وضعها في الحدود. أسهل شيء يمكن القيام به هو نسخ قيمة texel المجاور في خريطة النسيج. تذكر أنه يجب توفير قيم الحدود في نفس الوقت مع بيانات صورة النسيج ، لذلك تحتاج إلى معرفة ذلك مسبقًا.

    يتم استخدام لون حدود النسيج أيضًا إذا تم تطبيق النسيج بطريقة تغطي الجزء الأساسي جزئيًا فقط. (راجع "تكرار القوام وتثبيته" للحصول على مزيد من المعلومات حول هذا الموقف.)

    مستويات متعددة من التفاصيل

    يمكن رؤية الكائنات ذات النسيج ، مثل أي كائنات أخرى في مشهد ، على مسافات مختلفة من وجهة النظر. في المشهد الديناميكي ، عندما يتحرك كائن محكم بعيدًا عن نقطة العرض ، يجب تقليل حجم خريطة النسيج جنبًا إلى جنب مع حجم الصورة المعروضة. لإنجاز ذلك ، يجب على OpenGL تصفية خريطة النسيج وصولاً إلى الحجم المناسب لرسم الخرائط على الكائن ، دون إدخال عناصر مزعجة بصريًا. على سبيل المثال ، لتصيير جدار من الطوب ، يمكنك استخدام صورة نسيج كبيرة (مثل 128 & # 180128 texel) عندما تكون قريبة من العارض. ولكن إذا تم نقل الجدار بعيدًا عن العارض حتى يظهر على الشاشة على هيئة بكسل واحد ، فقد تظهر الأنسجة التي تمت تصفيتها لتتغير فجأة عند نقاط انتقال معينة.

    لتجنب مثل هذه القطع الأثرية ، يمكنك تحديد سلسلة من خرائط النسيج المفلترة مسبقًا ذات الدقة المتناقصة ، تسمى خرائط الصور ، كما هو موضح في الشكل 9-4. صاغ لانس ويليامز مصطلح mipmap ، عندما قدم الفكرة في ورقته البحثية ، "Pyramidal Parametrics" (SIGGRAPH 1983 Proceedings). Mip تعني الكلمة اللاتينية multim im parvo وتعني "أشياء كثيرة في مكان صغير". تستخدم Mipmapping بعض الأساليب الذكية لحزم بيانات الصورة في الذاكرة.

    عند استخدام mipmapping ، يحدد OpenGL تلقائيًا خريطة النسيج المراد استخدامها بناءً على الحجم (بالبكسل) للكائن الذي يتم تعيينه. باستخدام هذا الأسلوب ، يكون مستوى التفاصيل في خريطة النسيج مناسبًا للصورة المرسومة على الشاشة - مع تصغير صورة الكائن ، يقل حجم خريطة النسيج. تتطلب Mipmapping بعض المساحة الإضافية للحساب وتخزين النسيج ، ومع ذلك ، في حالة عدم استخدامها ، قد تلمع الأنسجة التي تم تعيينها على كائنات أصغر وتومض أثناء تحرك الكائنات.

    لاستخدام رسم الخرائط ، يجب توفير جميع أحجام النسيج بصلاحيات 2 بين أكبر حجم وخريطة 1 & # 180 1. على سبيل المثال ، إذا كانت الخريطة الأعلى دقة هي 64 & # 180 16 ، يجب عليك أيضًا تقديم خرائط بحجم 32 & # 180 8 ، 16 & # 180 4 ، 8 & # 180 2 ، 4 & # 180 1 ، 2 & # 180 1 و 1 & # 180 1. عادةً ما يتم تصفية الخرائط الأصغر وإصدارات متدنية من أكبر خريطة يكون فيها كل نص في نسيج أصغر متوسطًا لأربعة تكسيل المقابلة في النسيج الأكبر. (نظرًا لأن OpenGL لا يتطلب أي طريقة معينة لحساب الخرائط الأصغر حجمًا ، فقد تكون الزخارف ذات الأحجام المختلفة غير مرتبطة تمامًا. ومن الناحية العملية ، فإن الأنسجة غير ذات الصلة ستجعل الانتقالات بين خرائط الصور الصغيرة ملحوظة للغاية.)

    لتحديد هذه الأنسجة ، قم باستدعاء glTexImage2D () مرة واحدة لكل دقة لخريطة النسيج ، بقيم مختلفة للمستوى والعرض والارتفاع ومعلمات الصورة. بدءًا من الصفر ، يحدد المستوى أي نسيج في السلسلة يتم تحديده بالمثال السابق ، سيتم الإعلان عن أكبر نسيج بالحجم 64 & # 180 16 بالمستوى = 0 ، والملمس 32 & # 180 8 بالمستوى = 1 ، وهكذا على. بالإضافة إلى ذلك ، لكي يتم تفعيل الأنسجة التي تم تعيينها على الخريطة ، تحتاج إلى اختيار إحدى طرق التصفية المناسبة الموضحة في القسم التالي.

    يوضح المثال 9-4 استخدام سلسلة من ست خرائط نسيج يتناقص حجمها من 32 & # 180 32 إلى 1 & # 180 1. يرسم هذا البرنامج مستطيلًا يمتد من المقدمة بعيدًا في المسافة ، ويختفي في النهاية عند النقطة ، كما هو موضح في "اللوحة 20" في الملحق 1. لاحظ أن إحداثيات النسيج تتراوح من 0.0 إلى 8.0 لذا يلزم وجود 64 نسخة من خريطة النسيج لتجانب المستطيل ، ثمانية في كل اتجاه. لتوضيح كيفية نجاح إحدى خرائط النسيج في خريطة أخرى ، يكون لكل خريطة لون مختلف.

    مثال 9-4: مواد Mipmap: mipmap.c

    يوضح المثال 9-4 رسم الخرائط بجعل كل خريطة لونًا مختلفًا بحيث يكون واضحًا عند استبدال خريطة بأخرى. في الوضع الحقيقي ، تقوم بتعريف خرائط الصور الصغيرة بحيث يكون الانتقال سلسًا قدر الإمكان.وبالتالي ، فإن الخرائط ذات الدقة المنخفضة عادةً ما تكون نسخًا مفلترة من خريطة أصلية عالية الدقة. إن إنشاء سلسلة من هذه الخرائط هي عملية برمجية ، وبالتالي فهي ليست جزءًا من OpenGL ، وهي مجرد مكتبة عرض. ومع ذلك ، نظرًا لأن إنشاء mipmap يعد عملية مهمة ، فإن مكتبة OpenGL المساعدة تحتوي على عمليتين روتينيتين تساعدان في معالجة الصور لاستخدامها كأنماط مخططة.

    بافتراض أنك أنشأت المستوى 0 ، أو الخريطة ذات الدقة الأعلى ، فإن الإجرائين gluBuild1DMipmaps () و gluBuild2DMipmaps () يبنيان ويحددان هرم الخرائط الصورية بدقة تصل إلى 1 & # 180 1 (أو 1 ، لخرائط النسيج أحادية البعد ). إذا كانت صورتك الأصلية لها أبعاد ليست بالضبط قوى 2 ، فإن gluBuild * DMipmaps () يساعد على تغيير حجم الصورة إلى أقرب قوة 2.

    int gluBuild1DMipmaps (هدف GLenum ، مكونات GLint ، عرض GLint ،
    تنسيق GLenum ، نوع GLenum ، بيانات باطلة *)
    int gluBuild2DMipmaps (هدف GLenum ، مكونات GLint ، عرض GLint ،
    ارتفاع GLint ، تنسيق GLenum ، نوع GLenum ،
    void * data) لإنشاء سلسلة من خرائط الصور الصغيرة واستدعاء glTexImage * D () لتحميل الصور. معلمات الهدف والمكونات والعرض والارتفاع والتنسيق والنوع والبيانات هي نفسها تمامًا مثل تلك الخاصة بـ glTexImage1D () و glTexImage2D (). يتم إرجاع القيمة 0 إذا تم إنشاء جميع خرائط الصور بنجاح ، وإلا فسيتم إرجاع رمز خطأ GLU.

    الفلتره

    تكون خرائط النسيج مربعة أو مستطيلة ، ولكن بعد تعيينها على شكل مضلع أو سطح وتحويلها إلى إحداثيات شاشة ، نادرًا ما تتوافق الخطوط الفردية للنسيج مع وحدات البكسل الفردية لصورة الشاشة النهائية. اعتمادًا على التحولات المستخدمة ورسم خرائط النسيج المطبق ، يمكن أن يتوافق بكسل واحد على الشاشة مع أي شيء بدءًا من جزء صغير من texel (تكبير) إلى مجموعة كبيرة من texels (تصغير) ، كما هو موضح في الشكل 9-5. في كلتا الحالتين ، ليس من الواضح بالضبط ما هي قيم texel التي يجب استخدامها وكيف ينبغي حساب متوسطها أو إقحامها. وبالتالي ، يتيح لك OpenGL تحديد أي من خيارات التصفية العديدة لتحديد هذه الحسابات. توفر الخيارات مقايضات مختلفة بين السرعة وجودة الصورة. أيضًا ، يمكنك تحديد طرق التصفية الخاصة بالتكبير والتصغير بشكل مستقل.

    الشكل 9-5: تكبير الملمس وتصغيره

    في بعض الحالات ، ليس من الواضح ما إذا كان التكبير أو التصغير مطلوبًا. إذا احتاجت خريطة mipmap إلى تمديدها (أو تقليصها) في كلا الاتجاهين x و y ، فإن التكبير (أو التصغير) مطلوب. إذا احتاجت خريطة mipmap إلى التمدد في اتجاه واحد وتقليصها في الاتجاه الآخر ، يقوم OpenGL بالاختيار بين التكبير والتصغير الذي يعطي في معظم الحالات أفضل نتيجة ممكنة. من الأفضل محاولة تجنب هذه المواقف باستخدام إحداثيات نسيج تلك الخريطة بدون مثل هذا التشويه. (راجع "حساب إحداثيات الزخرفة المناسبة.")

    الأسطر التالية هي أمثلة على كيفية استخدام glTexParameter * () لتحديد طرق تصفية التكبير والتصغير:

    الوسيطة الأولى لـ glTexParameter * () هي إما GL_TEXTURE_2D أو GL_TEXTURE_1D ، اعتمادًا على ما إذا كنت تعمل باستخدام مواد ثنائية أو أحادية البعد. لأغراض هذه المناقشة ، تكون الوسيطة الثانية إما GL_TEXTURE_MAG_FILTER أو GL_TEXTURE_MIN_FILTER للإشارة إلى ما إذا كنت تحدد طريقة التصفية للتكبير أو التصغير. الوسيطة الثالثة تحدد طريقة التصفية يسرد الجدول 9-1 القيم المحتملة.

    الجدول 9-1: طرق التصفية الخاصة بالتكبير والتصغير

    GL_NEAREST أو GL_LINEAR أو GL_NEAREST_MIPMAP_NEAREST أو GL_NEAREST_MIPMAP_LINEAR أو GL_LINEAR_MIPMAP_NEAREST أو GL_LINEAR_MIPMAP_LINEAR

    إذا اخترت GL_NEAREST ، فسيتم استخدام النص ذي الإحداثيات الأقرب لمركز البكسل لكل من التكبير والتصغير. يمكن أن يؤدي هذا إلى تشويش القطع الأثرية (شديدة أحيانًا). إذا اخترت GL_LINEAR ، فسيتم استخدام متوسط ​​خطي مرجح للمصفوفة 2 & # 180 2 من texels الأقرب إلى مركز البكسل ، مرة أخرى لكل من التكبير والتصغير. عندما تكون إحداثيات النسيج بالقرب من حافة خريطة النسيج ، فإن أقرب مصفوفة من التكسيل 2 & # 180 2 قد تتضمن بعضًا من خارج خريطة النسيج. في هذه الحالات ، تعتمد قيم texel المستخدمة على ما إذا كان GL_REPEAT أو GL_CLAMP ساريًا وما إذا كنت قد قمت بتعيين حد للنسيج. (راجع "استخدام حدود نسيج.") يتطلب GL_NEAREST حسابًا أقل من GL_LINEAR وبالتالي قد يتم تنفيذه بسرعة أكبر ، ولكن GL_LINEAR يوفر نتائج أكثر سلاسة.

    باستخدام التكبير ، حتى إذا قمت بتوفير الخرائط الصورية ، يتم دائمًا استخدام أكبر خريطة نسيج (المستوى = 0). باستخدام التصغير ، يمكنك اختيار طريقة تصفية تستخدم أنسب خرائط خرائط واحدة أو اثنتين ، كما هو موضح في الفقرة التالية. (إذا تم تحديد GL_NEAREST أو GL_LINEAR بالتصغير ، فسيتم استخدام أكبر خريطة نسيج.)

    كما هو موضح في الجدول 9-1 ، تتوفر أربعة خيارات ترشيح إضافية عند التصغير باستخدام خرائط الصور الصغيرة. ضمن خريطة فردية ، يمكنك اختيار أقرب قيمة texel مع GL_NEAREST_MIPMAP_NEAREST ، أو يمكنك الإقحام خطيًا بتحديد GL_LINEAR_MIPMAP_NEAREST. يعد استخدام أقرب texels أسرع ولكنه ينتج عنه نتائج أقل استحسانًا. إن خريطة mipm المحددة المختارة هي دالة لمقدار التصغير المطلوب ، وهناك نقطة قطع من استخدام خريطة mip معينة إلى التي تليها. لتجنب الانتقال المفاجئ ، استخدم GL_NEAREST_MIPMAP_LINEAR أو GL_LINEAR_MIPMAP_LINEAR لاستيفاء قيم texel خطيًا من أقرب خيارين من أفضل الخرائط الصورية. GL_NEAREST_MIPMAP_LINEAR يختار أقرب texel في كل من الخريطتين ثم يقحم خطيًا بين هاتين القيمتين. GL_LINEAR_MIPMAP_LINEAR يستخدم الاستيفاء الخطي لحساب القيمة في كل من الخريطتين ثم يقحم خطيًا بين هاتين القيمتين. كما قد تتوقع ، ينتج GL_LINEAR_MIPMAP_LINEAR عمومًا أفضل النتائج ، ولكنه يتطلب معظم الحسابات ، وبالتالي قد يكون الأبطأ.

    كائنات النسيج

    تعتبر كائنات النسيج ميزة جديدة مهمة في الإصدار 1.1 من OpenGL. يخزن كائن النسيج بيانات النسيج ويجعلها متاحة بسهولة. يمكنك الآن التحكم في العديد من الأنسجة والعودة إلى الأنسجة التي تم تحميلها مسبقًا في موارد النسيج الخاصة بك. عادةً ما يكون استخدام كائنات النسيج هو أسرع طريقة لتطبيق الأنسجة ، مما يؤدي إلى مكاسب كبيرة في الأداء ، لأنه دائمًا ما يكون ربط (إعادة استخدام) كائن نسيج موجود أسرع بكثير من إعادة تحميل صورة نسيج باستخدام glTexImage * D ().

    أيضًا ، تدعم بعض التطبيقات مجموعة عمل محدودة من القوام عالي الأداء. يمكنك استخدام كائنات النسيج لتحميل الأنسجة الأكثر استخدامًا في هذه المنطقة المحدودة.

    لاستخدام كائنات النسيج لبيانات النسيج ، اتبع هذه الخطوات.

    في البداية ، قم بربط (إنشاء) كائنات النسيج ببيانات النسيج ، بما في ذلك مصفوفات الصور وخصائص النسيج.

    إذا كان التنفيذ الخاص بك يدعم مجموعة عمل من الأنسجة عالية الأداء ، فراجع ما إذا كان لديك مساحة كافية لجميع كائنات النسيج الخاصة بك. إذا لم تكن هناك مساحة كافية ، فقد ترغب في تحديد الأولويات لكل كائن نسيج بحيث تظل القوام الأكثر استخدامًا في مجموعة العمل.

    قم بربط كائنات النسيج وإعادة ربطها ، مما يجعل بياناتها متاحة حاليًا لتقديم النماذج المنسوجة.

    تسمية كائن نسيج

    يمكن استخدام أي عدد صحيح بدون إشارة كاسم مادة. لتجنب إعادة استخدام الأسماء عن طريق الخطأ ، استخدم glGenTextures () باستمرار لتوفير أسماء نسيج غير مستخدمة.

    void glGenTextures (GLsizei n، GLuint * TextNames) يعيد n الأسماء غير المستخدمة حاليًا لكائنات النسيج في أسماء نسيج المصفوفة. لا يجب أن تكون الأسماء التي يتم إرجاعها في اسم الملمس مجموعة متجاورة من الأعداد الصحيحة. يتم تمييز الأسماء في الملمس على أنها مستخدمة ، لكنها تكتسب حالة النسيج والأبعاد (1D أو 2D) فقط عندما يتم ربطها أولاً. الصفر هو اسم نسيج محجوز ولا يتم إرجاعه أبدًا كاسم نسيج بواسطة glGenTextures ().

    يحدد glIsTexture () ما إذا كان اسم النسيج قيد الاستخدام بالفعل. إذا تم إرجاع اسم نسيج بواسطة glGenTextures () ولكن لم يتم ربطه بعد (استدعاء glBindTexture () بالاسم مرة واحدة على الأقل) ، فإن glIsTexture () ترجع GL_FALSE.

    GLboolean glIsTexture (GLuint fabricName) يرجع GL_TRUE إذا كان اسم النسيج هو اسم نسيج تم ربطه ولم يتم حذفه بعد ذلك. تُرجع GL_FALSE إذا كان اسم النسيج يساوي صفرًا أو إن اسم المظهر هو قيمة غير صفرية وليست اسم نسيج موجود.

    إنشاء واستخدام كائنات نسيج

    نفس الإجراء ، glBindTexture () ، ينشئ ويستخدم كائنات نسيج. عندما يكون اسم نسيج مرتبطًا في البداية (يُستخدم مع glBindTexture ()) ، يتم إنشاء كائن نسيج جديد بقيم افتراضية لصورة النسيج وخصائص النسيج. تخزن الاستدعاءات اللاحقة لـ glTexImage * () و glTexSubImage * () و glCopyTexImage * () و glCopyTexSubImage * () و glTexParameter * () و glPrioritizeTextures () البيانات في كائن النسيج. قد يحتوي كائن النسيج على صورة نسيج وصور mipmap مرتبطة (إن وجدت) ، بما في ذلك البيانات المرتبطة مثل العرض والارتفاع وعرض الحد والتنسيق الداخلي ودقة المكونات وخصائص النسيج. تتضمن خصائص النسيج المحفوظة عوامل تصفية التصغير والتكبير وأوضاع الالتفاف ولون الحدود وأولوية النسيج.

    عندما يتم ربط كائن نسيج مرة أخرى لاحقًا ، تصبح بياناته حالة النسيج الحالية. (يتم استبدال حالة النسيج المرتبط مسبقًا.)

    void glBindTexture (هدف GLuint ، GLuint TextName) يقوم glBindTexture () بثلاثة أشياء. عند استخدام اسم نسيج لعدد صحيح بدون إشارة بخلاف الصفر لأول مرة ، يتم إنشاء كائن نسيج جديد وتعيين هذا الاسم. عند الارتباط بكائن نسيج تم إنشاؤه مسبقًا ، يصبح كائن النسيج هذا نشطًا. عند الارتباط بقيمة اسم نسيج بقيمة صفر ، يتوقف OpenGL عن استخدام كائنات النسيج ويعود إلى النسيج الافتراضي غير المسماة. عندما يتم ربط كائن نسيج مبدئيًا (أي تم إنشاؤه) ، فإنه يفترض أبعاد الهدف ، والتي تكون إما GL_TEXTURE_1D أو GL_TEXTURE_2D. فور ربطه الأولي ، تكون حالة كائن النسيج مساوية لحالة GL_TEXTURE_1D أو GL_TEXTURE_2D الافتراضية (اعتمادًا على أبعادها) عند تهيئة OpenGL. في هذه الحالة الأولية ، يتم تعيين خصائص النسيج مثل عوامل تصفية التصغير والتكبير وأوضاع الالتفاف ولون الحدود وأولوية النسيج على قيمها الافتراضية.

    في المثال 9-5 ، تم إنشاء كائني نسيج في init (). في العرض () ، يتم استخدام كل كائن نسيج لتصيير مضلع رباعي الجوانب مختلف.

    مثال 9-5: كائنات نسيج ملزمة: texbind.c

    عندما يتم ربط كائن نسيج مرة أخرى ، يمكنك تحرير محتويات كائن النسيج المرتبط. أي أوامر تستدعيها تغير صورة النسيج أو الخصائص الأخرى تغير محتويات كائن النسيج المرتبط حاليًا بالإضافة إلى حالة النسيج الحالية.

    في المثال 9-5 ، بعد الانتهاء من العرض () ، لا تزال ملزمًا بالنسيج المسمى بمحتويات texName [1]. كن حذرًا من عدم استدعاء روتين نسيج زائف يغير البيانات الموجودة في كائن النسيج هذا.

    عند استخدام خرائط الصور المتحركة ، يجب وضع جميع خرائط الصور ذات الصلة لصورة نسيج واحدة في كائن نسيج واحد. في المثال 9-4 ، يتم وضع المستويات 0-5 من صورة نسيج مخططة في كائن نسيج واحد يسمى texName.

    تنظيف كائنات النسيج

    أثناء ربط وفك ربط كائنات النسيج ، لا تزال بياناتها موجودة في مكان ما بين موارد النسيج الخاصة بك. إذا كانت موارد النسيج محدودة ، فقد يكون حذف الأنسجة إحدى الطرق لتحرير الموارد.

    void glDeleteTextures (GLsizei n، const GLuint * TextNames) يحذف n كائنات نسيج ، تسمى بواسطة عناصر في اسم المصفوفة. يمكن الآن إعادة استخدام أسماء النسيج المحررة (على سبيل المثال ، بواسطة glGenTextures ()). إذا تم حذف نسيج مرتبط حاليًا ، يعود الارتباط إلى النسيج الافتراضي ، كما لو تم استدعاء glBindTexture () بصفر لقيمة نسيج اسم. يتم تجاهل محاولات حذف أسماء النسيج غير الموجودة أو اسم المظهر السطحي للصفر بدون إنشاء خطأ.

    مجموعة عمل من القوام المقيمة

    تدعم بعض تطبيقات OpenGL مجموعة عمل من التركيبات عالية الأداء ، والتي يُقال إنها مقيمة. عادةً ما تحتوي هذه التطبيقات على أجهزة متخصصة لإجراء عمليات النسيج وذاكرة تخزين مؤقت محدودة للأجهزة لتخزين صور النسيج. في هذه الحالة ، يوصى باستخدام كائنات النسيج ، لأنك قادر على تحميل العديد من الأنسجة في مجموعة العمل ثم التحكم فيها.

    إذا تجاوزت جميع الزخارف المطلوبة من قبل التطبيق حجم ذاكرة التخزين المؤقت ، فلا يمكن أن تكون بعض الزخارف مقيمة. إذا كنت تريد معرفة ما إذا كان نسيج واحد مقيمًا حاليًا ، فقم بربط الكائن الخاص به ، ثم استخدم glGetTexParameter * v () لمعرفة القيمة المرتبطة بحالة GL_TEXTURE_RESIDENT. إذا كنت تريد معرفة حالة الإقامة الملمس للعديد من القوام ، فاستخدم glAreTexturesResident ().

    GLboolean glAreTextures مقيم (GLsizei n، const
    GLuint * fabricNames، GLboolean * Residences) يستعلم عن حالة الإقامة النسيجية لكائنات النسيج n ، المسماة في أسماء نسيج المصفوفة. المساكن عبارة عن مصفوفة يتم فيها إرجاع حالة الإقامة النسيجية لكائنات النسيج المقابلة في أسماء نسيج المصفوفة. إذا كانت جميع الزخارف المسماة في textNames مقيمة ، فإن الدالة glAreTexturesResident () ترجع GL_TRUE ، وتكون محتويات مساكن الصفيف غير مضطربة. إذا لم يكن أي نسيج في TextNames مقيماً ، فإن glAreTexturesResident () ترجع GL_FALSE والعناصر الموجودة في المساكن ، والتي تتوافق مع كائنات نسيج غير مقيمة في textNames ، يتم تعيينها أيضًا على GL_FALSE.

    لاحظ أن glAreTexturesResident () تسترجع حالة الإقامة الحالية. موارد النسيج ديناميكية للغاية ، وقد تتغير حالة الإقامة في أي وقت. تقوم بعض التطبيقات بتخزين القوام مؤقتًا عند استخدامها لأول مرة. قد يكون من الضروري الرسم بالنسيج قبل التحقق من الإقامة.

    إذا لم يؤسس تطبيق OpenGL الخاص بك مجموعة عمل من الأنسجة عالية الأداء ، فإن كائنات النسيج تعتبر دائمًا مقيمة. في هذه الحالة ، يقوم glAreTexturesResident () دائمًا بإرجاع GL_TRUE ولا يوفر أي معلومات بشكل أساسي.

    استراتيجيات الإقامة الملمس

    إذا كان بإمكانك إنشاء مجموعة عمل من القوام وترغب في الحصول على أفضل أداء ممكن للقوام ، فعليك حقًا معرفة تفاصيل التنفيذ والتطبيق. على سبيل المثال ، مع محاكاة مرئية أو لعبة فيديو ، عليك الحفاظ على الأداء في جميع المواقف. في هذه الحالة ، يجب ألا تصل أبدًا إلى نسيج غير مقيم. بالنسبة لهذه التطبيقات ، تريد تحميل جميع التركيبات عند التهيئة وجعلها جميعًا مقيمة. إذا لم يكن لديك ذاكرة نسيج كافية متاحة ، فقد تحتاج إلى تقليل الحجم والدقة ومستويات الخرائط البينية لصور النسيج الخاصة بك ، أو يمكنك استخدام glTexSubImage * () لإعادة استخدام نفس ذاكرة النسيج بشكل متكرر.

    بالنسبة للتطبيقات التي تنشئ نسيجًا "سريعًا" ، قد لا يمكن تجنب الزخارف غير السكنية. إذا تم استخدام بعض الأنسجة بشكل متكرر أكثر من غيرها ، فيمكنك تعيين أولوية أعلى لكائنات النسيج هذه لزيادة احتمالية كونها مقيمة. يؤدي حذف كائنات النسيج أيضًا إلى تحرير مساحة. باختصار ، قد يؤدي تعيين أولوية أقل لكائن نسيج إلى جعله أولًا في السطر ليتم نقله خارج مجموعة العمل ، حيث تتضاءل الموارد. يستخدم glPrioritizeTextures () لتعيين الأولويات لكائنات النسيج.

    void glPrioritizeTextures (GLsizei n ، const GLuint * TextNames ،
    const GLclampf * أولويات) يعين كائنات النسيج n ، المسماة في أسماء نسيج المصفوفة ، أولويات إقامة النسيج في العناصر المقابلة لأولويات المصفوفة. يتم تثبيت قيم الأولوية في أولويات الصفيف على النطاق [0.0 ، 1.0] قبل تعيينها. يشير الصفر إلى أدنى أولوية من المحتمل أن تكون هذه القوام مقيمة. واحد يشير إلى أعلى أولوية. لا يتطلب glPrioritizeTextures () ربط أي من الأنسجة في اسم النسيج. ومع ذلك ، قد لا يكون للأولوية أي تأثير على كائن نسيج حتى يتم ربطه في البداية.

    يمكن أيضًا استخدام glTexParameter * () لتعيين أولوية نسيج واحد ، ولكن فقط إذا كان النسيج مقيدًا حاليًا. في الواقع ، يعد استخدام glTexParameter * () هو الطريقة الوحيدة لتعيين أولوية النسيج الافتراضي.

    إذا كانت كائنات النسيج لها أولوية متساوية ، فإن التطبيقات النموذجية لـ OpenGL تطبق إستراتيجية أقل استخدامًا مؤخرًا (LRU) لتحديد كائنات النسيج التي سيتم نقلها خارج مجموعة العمل. إذا كنت تعلم أن تطبيق OpenGL الخاص بك به هذا السلوك ، فإن وجود أولويات متساوية لجميع كائنات النسيج يؤدي إلى إنشاء نظام LRU معقول لإعادة تخصيص موارد النسيج.

    إذا كان تطبيقك لـ OpenGL لا يستخدم إستراتيجية LRU لكائنات النسيج ذات الأولوية المتساوية (أو إذا كنت لا تعرف كيف تقرر ذلك) ، يمكنك تنفيذ إستراتيجية LRU الخاصة بك عن طريق الحفاظ بعناية على أولويات كائن النسيج. عند استخدام نسيج (مرتبط) ، يمكنك تعظيم أولويته ، مما يعكس استخدامه مؤخرًا. بعد ذلك ، على فترات منتظمة (زمنية) ، يمكنك التقليل من أولويات كل كائنات النسيج.

    ملاحظة: يمكن أن يمثل تجزئة ذاكرة النسيج مشكلة ، خاصة إذا كنت تقوم بحذف وإنشاء الكثير من الأنسجة الجديدة. على الرغم من أنه من الممكن أيضًا تحميل جميع كائنات النسيج في مجموعة عمل من خلال ربطها في تسلسل واحد ، إلا أن ربطها في تسلسل مختلف قد يترك بعض الأنسجة غير مقيمة.

    وظائف الملمس

    في جميع الأمثلة حتى الآن في هذا الفصل ، تم استخدام القيم الموجودة في خريطة النسيج مباشرة كلون يتم رسمها على السطح الذي يتم تقديمه. يمكنك أيضًا استخدام القيم الموجودة في خريطة النسيج لتعديل اللون الذي سيعرضه السطح بدون نسيج ، أو لمزج اللون في خريطة النسيج مع اللون الأصلي للسطح. يمكنك اختيار إحدى وظائف التركيب الأربع من خلال توفير الوسيطات المناسبة لـ glTexEnv * ().

    glTexEnv باطل (هدف GLenum ، اسم GLenum ، TYPEparam)
    glTexEnv باطل v (هدف GLenum ، اسم GLenum ، TYPE * param) يضبط وظيفة التركيب الحالية. يجب أن يكون الهدف GL_TEXTURE_ENV. إذا كانت pname هي GL_TEXTURE_ENV_MODE ، يمكن أن تكون المعلمة GL_DECAL أو GL_REPLACE أو GL_MODULATE أو GL_BLEND ، لتحديد كيفية دمج قيم النسيج مع قيم اللون للجزء الذي تتم معالجته. إذا كانت pname هي GL_TEXTURE_ENV_COLOR ، فإن المعلمة عبارة عن مصفوفة من أربع قيم للفاصلة العائمة تمثل مكونات R و G و B و A. يتم استخدام هذه القيم فقط إذا تم تحديد وظيفة المظهر السطحي GL_BLEND أيضًا.

    يحدد الجمع بين وظيفة التركيب والتنسيق الداخلي الأساسي كيفية تطبيق الأنسجة لكل مكون من مكونات النسيج. تعمل وظيفة التركيب على مكونات محددة من النسيج وقيم اللون التي سيتم استخدامها بدون نسيج. (لاحظ أنه يتم إجراء التحديد بعد تطبيق وظيفة نقل البكسل.) تذكر أنه عند تحديد خريطة النسيج الخاصة بك باستخدام glTexImage * D () ، فإن الوسيطة الثالثة هي التنسيق الداخلي الذي سيتم تحديده لكل texel.

    يوضح الجدول 9-2 والجدول 9-3 كيف تحدد وظيفة التركيب والتنسيق الداخلي الأساسي صيغة تطبيق التركيب المستخدمة لكل مكون من مكونات النسيج. هناك ستة تنسيقات داخلية أساسية (تمثل الأحرف الموجودة بين قوسين قيمها في الجداول): GL_ALPHA (A) و GL_LUMINANCE (L) و GL_LUMINANCE_ALPHA (L و A) و GL_INTENSITY (I) و GL_RGB (C) و GL_RGBA (C) و أ). تحدد التنسيقات الداخلية الأخرى الدقة المرغوبة لمكونات النسيج ويمكن مطابقتها مع أحد هذه التنسيقات الداخلية الستة الأساسية.


    يؤلف التحولات الخطية

    اسمحوا وتكون أعداد صحيحة موجبة. افترض وكن تحولات خطية. هل التكوين هو أيضًا تحول خطي؟

    لمعرفة ذلك ، افترض و. يمكننا استخدام تعريف الخطية الموجود في القسم 1.7 ، & # 8220 الجبر الخطي عالي الأبعاد & # 8221 لإجراء الحساب أدناه. لاحظ أهمية الافتراض بأن كلاهما خطي في هذا الحساب.

    ولكن كيف يرتبط هذا الخطي بممثلي المصفوفة لهذه التحولات الخطية؟ قد نبدأ في التحقيق في إجابة هذا السؤال من خلال النظر في أمثلة ذات أبعاد منخفضة.

    قبل القيام بذلك ، من المهم تذكر ذلك لقد حددنا بالفعل مصفوفة مضروبة في متجه في القسم 1.7 ، & # 8220 الجبر الخطي عالي الأبعاد & # 8221. على وجه التحديد ، إذا كانت مصفوفة (صفوف وأعمدة) ومتجهًا بأبعاد (مصفوفة) ، فعندئذٍ مصفوفة / منتج متجه سيكون متجهًا ثلاثي الأبعاد (مصفوفة). وبشكل أكثر تحديدًا ، سيكون متجه الأبعاد الذي تم تشكيله كمزيج خطي من أعمدة مع إدخالات مثل الأوزان المقابلة.

    في الصيغة ، إذا ، وأين توجد أعمدة ، و if ، ثم:

    ضرب المصفوفة لتكوين

    افترض وتحولات خطية. ثم هناك الثوابت (المصفوفات) وكذا وإلى الأبد.

    تكوين هذه الوظائف. بمعنى آخر ، المصفوفة (العدد) المقابلة للتكوين هي منتج من المصفوفات (الأرقام) المقابلة لكل من & # 8220factors & # 8221 و.

    يقودنا هذا إلى تحديد حاصل ضرب المصفوفات كمصفوفة أخرى:. يكون ضرب المصفوفات أمرًا سهلاً عندما تكون المصفوفات. فقط اضرب الأرقام!

    ضرب المصفوفة لتكوين

    افترض وتحولات خطية. ثم هناك مصفوفة ومصفوفة للجميع وللجميع.

    نسعى لتعريف منتج المصفوفة بطريقة تناسب الجميع. القيام بذلك في هذه الحالة يعني بالضرورة أن المنتج يجب أن يكون مصفوفة (رقم).

    إذا و ، فيمكننا كتابة المعادلات أدناه.

    وبالتالي فإن الوظيفة المكونة هي:

    لاحظ أن الإجابة النهائية هي نفسها حاصل ضرب المصفوفات التالي للمصفوفات (أرقام)

    لذلك ، يجب أن يكون حاصل ضرب المصفوفة هو المصفوفة أدناه. يوضح هذا أنه يمكن تحديد المصفوفة في المصفوفة والإجابة هي مصفوفة.

    نظرًا لأنه في الحقيقة متجه ثنائي الأبعاد (عمود) ، فقد قمنا بالفعل بهذا الحساب من قبل! الإجابة عبارة عن مجموعة خطية من الأعمدة التي تحتوي على مداخل مثل الأوزان.

    ضرب المصفوفة لتكوين

    افترض وتحولات خطية. ثم هناك مصفوفة ومصفوفة للجميع وللجميع.

    نسعى لتعريف منتج المصفوفة بطريقة تناسب الجميع. القيام بذلك في هذه الحالة يعني بالضرورة أن المنتج يجب أن يكون مصفوفة.

    إذا و ، فيمكننا كتابة المعادلات أدناه.

    وبالتالي فإن الوظيفة المكونة هي:

    من خلال تعريفنا السابق لمصفوفة / ضرب المتجهات ، هذا هو نفس قول ذلك

    لذلك ، لتحديد ضرب مصفوفة في مصفوفة ، يجب أن نفعل ذلك كما هو موضح أدناه:

    هذا هو في الأساس الجديد نوع المنتج مما فعلناه من قبل. ومع ذلك ، لاحظ أنه يمكن كتابتها بالطريقة التالية ، حيث يكون كل عمود في الإجابة عبارة عن متجه ثنائي الأبعاد يتكون من المصفوفة مضروبًا في عمود من.

    سيعمل هذا النمط في الحالة العامة التي سنحددها قريبًا.

    ضرب المصفوفة لتكوين

    سيتم النظر في مثال آخر بأبعاد منخفضة قبل أن نناقش الحالة العامة.

    افترض وتحولات خطية. ثم هناك مصفوفة ومصفوفة للجميع وللجميع.

    مرة أخرى ، نسعى لتعريف منتج المصفوفة بطريقة تناسب الجميع. القيام بذلك في هذه الحالة يعني بالضرورة أن المنتج يجب أن يكون مصفوفة.

    إذا و ، فيمكننا كتابة المعادلات أدناه.

    وبالتالي فإن الوظيفة المكونة هي:

    من خلال تعريفنا لمصفوفة / ضرب المتجهات ، هذا هو نفس الشيء مثل

    لذلك ، نحدد ضرب المصفوفة لمصفوفتين لتكون نفس المصفوفة كما في السطر السابق. خاصة،

    لاحظ أنه إذا كانت أعمدة ، ثم

    هذا مرة أخرى هو النمط الذي سنراه في الحالة العامة.

    ضرب المصفوفة للحالة العامة

    ربما يكون المنطق في الحالة العامة أكثر تشويقًا وتنويرًا ، على الرغم من أنه يتطلب تركيزًا شديدًا لفهمه تمامًا.

    افترض وتحولات خطية. ثم هناك مصفوفة ومصفوفة للجميع وللجميع.

    مرة أخرى ، نسعى لتعريف منتج المصفوفة بطريقة تناسب الجميع. القيام بذلك في هذه الحالة يعني بالضرورة أن المنتج يجب أن يكون مصفوفة.

    افترض ، أين كل ، وافترض.

    بما أنه خطي ويمكننا أن نقول أيضًا:

    لكن هذا مزيج خطي من المتجهات ذات الأبعاد مع مدخلات مثل الأوزان!

    إذا كان هذا يساوي ، يجب أن نحدد حاصل ضرب المصفوفة ليكون المصفوفة التالية:

    هذا في الواقع ما نفعله.

    نهج بديل مع المنتجات النقطية

    بالطبع ، هذا يعني أن كل عمود هو عبارة عن مجموعة خطية من الأعمدة مع إدخالات من العمود المناسب مثل الأوزان المقابلة.

    لنكون أكثر دقة ، دعنا نأخذ مكان كل عمود متجهًا. علاوة على ذلك ، اسمحوا أن يكون عمود ، ل. ثم عمود هو

    اسمحوا أن يكون الإدخال في صف وعمود المنتج (مع و). علاوة على ذلك ، فليكن عمود.

    يُظهر ما فعلناه أيضًا أنه من أجل و

    من الجدير جدا أن نلاحظ ذلك هو منتج نقطي. إنه منتج نقطي للعمود ذي صف (والتي يمكننا بالتأكيد التفكير فيها كناقل).

    هذا الوصف لمدخلات كمنتجات نقطية هو في الواقع طريقة أسرع للعثور عليها. ومع ذلك ، فهي أقل أهمية كتعريف.

    نهجنا مع التحولات الخطية يدخل في صميم المعنى الحقيقي لضرب المصفوفة: يجب أن تكون مرتبطة مباشرة بالتحولات الخطية المركبة.

    أبعاد عوامل المصفوفة للمنتج

    من المهم ملاحظة أن حاصل ضرب المصفوفة (على اليسار) مضروبًا في مصفوفة (على اليمين) يمكن إجراؤه ، وأن الإجابة هي مصفوفة.

    هذا هو، يجب أن يتطابق عدد الأعمدة في مع عدد صفوف. علاوة على ذلك، الإجابة النهائية لها نفس عدد الصفوف ونفس عدد الأعمدة.

    لهذا السبب ، يجب أن تدرك أيضًا أنه لمجرد إمكانية حساب المنتج ، فإن هذا يحدث ليس يعني أنه يمكن حساب المنتج العكسي.

    عندما يكون وحاصل الضرب العكسي يمكن حسابه إذا وفقط إذا. ومع ذلك ، حتى في هذه الحالة ، عادة ما يكون هذا هو الحال. هذا يعكس حقيقة أن تكوين الوظيفة ليس تبادليًا بشكل عام أيضًا.

    الخاصية الترابطية لضرب المصفوفة

    قبل النظر في الأمثلة ، يجدر التأكيد على أن ضرب المصفوفة يفي بالخاصية الترابطية. هذا يعكس حقيقة أن تكوين الوظيفة هو ترابطي.

    افترض ، وكلها تحويلات خطية. ثم من السهل التحقق من المعادلة.

    بالنظر إلى التعسفية ، لدينا

    إذا ، وللمصفوفات ذات الحجم المناسب والمتجهات المتغيرة ، فإن المعادلة ستظل كذلك بشكل واضح.

    يتم تعميم الخاصية الترابطية على أي منتج مصفوفة بعدد محدد من العوامل. كما يعني أنه يمكن كتابة مثل هذه المنتجات دون استخدام الأقواس.

    مثال 1

    سننظر أولاً في مثال حسابي بحت عالي الأبعاد. بعد هذه النقطة ، سننظر في أمثلة منخفضة الأبعاد يمكن تصورها.

    حدد والصيغ التالية.

    ثم يتم تعريفه من خلال أين.

    الآن احسب كل عمود على حدة. سنفعل العمود الأول.

    يجب عليك بالتأكيد أن تأخذ الوقت الكافي للتحقق من أن منتج المصفوفة النهائي هو

    يمكننا أيضًا التحقق من ذلك مرة أخرى باستخدام المنتج النقطي كما هو موضح أعلاه.

    على سبيل المثال ، ضع في اعتبارك الإدخال في الصف الثالث والعمود الثاني للمنتج. الصف الثالث من هو ، بينما العمود الثاني من هو. حاصل الضرب القياسي لهذين المتجهين هو.

    لذلك ، فإن الصيغة النهائية للتحويل الخطي المركب هي

    بالطبع ، بعد أن عرفنا مصفوفة التركيب ، يمكننا استخدام عمليات الصف الأولية ، على سبيل المثال ، لتحديد النواة (مسافة فارغة).

    كتمرين ، يجب أن تأخذ الوقت الكافي لإظهار أن المصفوفة المعززة للنظام يمكن تصغيرها إلى شكل الصف المختزل الموضح (RREF).

    لذلك وهي متغيرات حرة والنواة (فراغ فارغ) هو مستوي ثنائي الأبعاد من خلال الأصل في فضاء خماسي الأبعاد.

    مثال 2

    المثالان التاليان ثنائي الأبعاد حتى نتمكن من تصورهما بسهولة. لغرض مراجعة القسم 1.4 ، & # 8220 التحولات الخطية في بعدين & # 8221 ، نؤكد على تصور التحول الخطي كخريطة وكحقل متجه.

    ماذا يحدث عندما نؤلف الدوران والقص ، على سبيل المثال؟

    نستكشف ذلك الآن. سنستخدم مجموعة مختلفة من الأحرف لأسماء التحويل لتجنب الالتباس مع تأثيراتهم الهندسية.

    افترض وحدد بواسطة

    ثم هو تحويل القص الذي تمت مناقشته في القسم 1.4 ، & # 8220 التحويلات الخطية في بعدين & # 8221 وهو تحويل دوران عكس اتجاه عقارب الساعة حول الأصل بواسطة.

    سيحدد منتج المصفوفة معادلة التحويل المركب. من ناحية أخرى ، سيحدد منتج المصفوفة معادلة التحويل المركب.

    دع & # 8217s يحسب الصيغ لكلتا الوظيفتين. سنستخدم صيغة حاصل الضرب النقطي المكافئ لضرب المصفوفة.

    من أجل التكوين العكسي ، ليكون متسقًا مع ما فعلناه حتى الآن ، نستخدمه ذ& # 8216s لأسماء المتغيرات. لا تدع هذا يزعجك. كان بإمكاننا استخدامها x& # 8216 ثانية.

    هذان التحوّلان مختلفان بالفعل. هذا هو، . يجب أن يكون هذا متوقعًا. تكوين الوظيفة ليس تبادليًا.

    كما أن ضرب المصفوفة ليس تبادليًا ، حتى عندما يكون كلاهما ويمكن حسابه.

    تصور التراكيب كتعيينات

    هل يمكن تصور التأثيرات الهندسية لهذه التكوينات بسهولة؟ نعم ، لكنها ليست & # 8220simple & # 8221 مرئيات. من الأفضل بشكل أساسي النظر إلى تأثيراتهم الهندسية بالترتيب الذي تحدث فيه.

    إليك صورة مرئية توضح كيف يؤثر كل من هذين التركيبين المختلفين على منحنى الفراشة من القسم 1.4 ، & # 8220 التحولات الخطية في بعدين & # 8221. في كل حالة ، تمثل البداية (الحمراء) الفراشة مجموعة من النقاط التي سيتم تحويلها تحت التعيين المركب إلى الفراشة النهائية (الزرقاء). الفراشة النهائية هي صورة الخريطة المركبة (على اليسار) و (على اليمين) ، على التوالي.

    تصور التراكيب كحقول متجهة

    تذكر أن تمثيل حقل متجه للتحول الخطي يأخذ كل نقطة كمدخل و & # 8220 يرفق & # 8221 متجه الإخراج إلى هذه النقطة كسهم.

    كصور ثابتة ، يتم عرض هذه الحقول المتجهة أدناه.

    يمكننا تحريك هذا أيضًا لمعرفة الارتباط مع عرض الخرائط للتحول الخطي. يمكننا أن نرى & # 8220shearing & # 8221 و & # 8220 rotating & # 8221 في كل حالة إذا تخيلنا تحويل كل متجه في حقل المتجه من حقل المتجه & # 8220identity & # 8221.

    في كل حالة ، يكون حقل متجه البداية (الهوية) أحمر ، ومجال المتجه الوسيط أرجواني ، وحقل المتجه الأخير أزرق.

    مثال 3

    بالنسبة لمثالنا الأخير ، فإننا نأخذ في الاعتبار تكوين انعكاسين. سيكون أحد التحويلات انعكاسًا عبر المحور الأفقي. سيكون التحول الآخر انعكاسًا عبر الخط القطري خلال الأصل.

    سوف نسمي هذه الانعكاسات و (& # 8220ح& # 8221 للأفقي و & # 8220د& # 8221 للقطري). سنكتب أيضًا وبالنسبة لبعض المصفوفات و و.

    الصيغة المعتمدة على منتج المصفوفة هي:

    والصيغة المعتمدة على حاصل ضرب المصفوفة هي:

    التصورات

    يجب أن تكون تعسفية. لاحظ أن . من ناحية أخرى ، يمكننا أن نقول ذلك. هذه ملكية خاصة جدا.

    يجب أن نرى هذا ينعكس في الرسوم المتحركة لدينا (يقصد التورية).

    فيما يلي حقول المتجه الثابتة.

    وها هي الرسوم المتحركة الخاصة بمجال متجه الهوية الذي يتم تحويله إلى كل حقل من هذه الحقول المتجهية. لاحظ كيف تنعكس متجهات البداية (الأحمر) على الحالة المتوسطة (الأرجواني) قبل الانتقال إلى الحالة النهائية (الأزرق).


    مراجع

    Zeileis A (2006) ، الحساب الكينوني لمقدري الساندوتش. مجلة البرامج الإحصائية, 16(9) ، 1-16. عنوان URL https://www.jstatsoft.org/v16/i09/.

    بيير تشاوس (2010) ، حساب الطريقة المعممة للحظات والاحتمال التجريبي المعمم مع R. مجلة البرامج الإحصائية, 34(11) ، 1–35. عنوان URL https://www.jstatsoft.org/v34/i11/.

    Andrews DWK (1991) ، تقدير مصفوفة التغاير المتسق والارتباط الذاتي. إيكونوميتريكا, 59, 817--858.

    Newey WK & amp West KD (1987) ، مصفوفة تغاير بسيطة ، إيجابية شبه محددة ، متغايرة وترابط تلقائي. إيكونوميتريكا, 55, 703--708.

    Newey WK & amp West KD (1994) ، التحديد التلقائي لفترة التأخير في تقدير مصفوفة التغاير. مراجعة الدراسات الاقتصادية, 61, 631-653.


    شاهد الفيديو: انواع الخرائط (شهر نوفمبر 2021).