الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Matrix Rotation

مغلق
بدأه CsharpProgrammer في 15 أغسطس 2007 · 7 رد · 1,124 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم يا شباب

هل يعلم احد كيف يمكننى ان افعل Rotation ل Matrix او Array

مثل ملف المرفق

New_Text_Document_2_.txt

#2

ما ادري وش تقصد بالروتيشن هل هو نفسه اللي في الAVL tree ؟ ، والملف المرفق مب واضح المغزى منه ، ياليت تصيغ السؤال مره ثاني بشكل اوضح حتى نقدر نساعدك

#3

اقصد بالروتيشن الدوران

فى الملف المرفق فى اول رد

اول matrix على اليسار هى الحالة الاولى

ثم الثانية من اليسار هى بعد ان ادرنا الاولى 90 درجة لليمين و هكذا

#4

السلام عليكم, :)

العملية الأساسي في عملية تدوير مصفوفة هي تبديل إحداثيات الصفوف بالأعمدة:

int m[4][4] = {  { 0, 0, 1, 0 }, { 0, 1, 1, 1 }, { 1, 0, 0, 1 }, { 0, 0, 1, 1 } };

لنفرض إن m هي المصفوفة التي أرغب في تدويرها, بتطبيق العملية الأساسية (عملية إستبدال الصفوف بالأعمدة):

int temp [4][4];  // This is where the new matrix is going to be held
for( int j = 0; j < 4; j++ )
	for( int i = 0; i < 4; i++ )
		temp[j] = m[j];
// now let's copy over the new matrix
memcpy( m, temp, sizeof(int) * 16 );

والآن, لو قمت بنفس العملية بيدك على الورق ستلاحظ إن الشكل قد تم تدويره ولكنه معكوس أفقياً (mirrored).

يجب أن نقوم بعكس الشكل أفقياً لكي يظهر بشكل صحيح, لنحقق ذلك سنتلاعب بالسطر التالي:

		temp[j] = m[j];

عملية العكس الأفقي بسيطة جداً, وهي= عدد الأعمدة - 1 - المتغير الذي يمثل X

والعكس العمودي = عدد الصفوف - 1 - المتغير الذي يمثل Y

إذن لنعكس الشكل أفقياً أثناء تدويره:

(حسب القانون, عدد الأعمدة - 1 = 4 - 1 = 3)

		temp[j] = m[3 - j];

أما زوايا الدوران الأخرى فتستطيع أن تمثلها بنفس الطريقة ولكن فقط بتغيير أي المحاور يعكس, وهنالك حالة دوران (أعتقد 180 درجة) لا تبادل الصفوف بالأعمدة ولكن تعكس الصفوف والأعمدة فقط:

		temp[j] = m[3 - i][3 - j];

أتمنى أن يكون شرحي مفهوماً :)

تم تعديل هذه المشاركة بواسطة SandHawk في 16 أغسطس 2007 في 16:58

#5

جزاك الله خيرا SandHawk

فعلا ما كنت اريده

سؤال اخر

كيف يمكننى مقارنة بين 2arrays

مثلا

if(temp == m)
	 cout<<"Good";
#6

هناك ملاحظة عند القيام بعملية التبديل لا تكمل الحلقة الى اخر عنصر

لانك في هذه الحالة تجد ان المصفوفة لم تتغير

اي ان البرنامج يقوم بتبديل العنصر من الخانة 1 2 الى الخانة 1 2

لكن عندما يصل البرنامج الى الخانة 2 1 يقوم بارجاع العنصر الى الخانة 1 2

وبهذا يكون البرنامج لم يفعل شئ

#7

من غير الممكن إجراء مقارنة مباشرة لأن المصفوفة ممثلة كمؤشر في الذاكرة, أي إن m و temp لا يحددان محتوى المصفوفة, وإنما موقعها.

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

تستطيع أن تكتب دالتك الخاصة للقيام بالمقارنة, مثلاً:

// Returns: true when a1 = a2, false when a1 != a2
bool Compare4x4Int( int* a1, int* a2 )
{
	for( int j = 0; j < 4; j++ )
		for( int i = 0; i < 4; i++ )
			if( a1[j] != a2[j] )
				return false;
	return true;
}

ثم تستطيع إستخدامها بهذا الشكل:

if( Compare4x4IntArray( m, temp ) )
	cout<<"Good";

هنالك طريقة أخرى وهي إستخدام دالة لمقارنة الذاكرة (مثل strcmp) ولكنها لا تقتصر فقط على النصوص.

هنالك دالة memcmp من مكتبة memory.h أو string.h (أي واحده من الإثنين يحتويها) وهي تأخذ مؤشران لمكانان في الذاكرة وتقارن بينهما حسب الحجم الذي يتم تمريره أيضاً والذي يمثل عدد البايتات الكلي للمقارنة, في حالة مصفوفة int بقياس 4x4 تكون sizeof(int)*16.

تعيد دالة memcmp القيمة 0 في حالة تساوي المصفوفتين, وقيمة أصغر من صفر تمثل حالة أصغر من, وقيمة أكبر من صفر تمثل حالة أكبر من:

//....
#include <memory.h>
//....
if( memcmp( m, temp, sizeof(int) * 16 ) == 0 )
	cout<<"Good";

وقد تكون هنالك طرق أخرى.

#8
bachirk كتب:
هناك ملاحظة عند القيام بعملية التبديل لا تكمل الحلقة الى اخر عنصر

لانك في هذه الحالة تجد ان المصفوفة لم تتغير

اي ان البرنامج يقوم بتبديل العنصر من الخانة 1 2 الى الخانة 1 2

لكن عندما يصل البرنامج الى الخانة 2 1 يقوم بارجاع العنصر الى الخانة 1 2

وبهذا يكون البرنامج لم يفعل شئ

:)

هل تتحدث عن الطريقة التي قدمتها للتدوير؟

ستلاحظ إني إستخدمت مصفوفة مؤقتة temp لخزن المصفوفة الجديدة حتى لا تتغير المصفوفة الأساسية m, ثم في النهاية بعد إكتمال العملية, نسخت المصفوفة المؤقتة بالكامل إلى m.

إضافة إلى إنك إذا أوقفت عملية التدوير قبل الوصول إلى آخر عنصر ستحصل على نتائج غريبة...

هذا الموضوع مغلق.

مواضيع مشابهة