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

دروس: الإحداثيات القطبية وتطبيقاتها في علم الرسم بالحاسب .

مغلقرائج
بدأه Abdullah.Alshammeri في 2 سبتمبر 2007 · 10 رد · 21,528 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لتحميل أمثلة هذا الموضوع :*

Polar_Coordinates_Ex.zip

جميع الأمثلة مكتوبة بلغة :

1- Cpp ( السي بلس ) + Win32 API

2- ( السي بلس ) Cpp + OpenGL

3- الجافا - Java

ومرفق أيضا الملفات التنفيذية .

---------------------------

الهدف من هذا الموضوع هو إلقاء نظرة على الاحداثيات القطبية , التي تتميز بانتاج كم وافر من الاشكال الدائرية ( بأقل جهد ممكن ) .

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

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

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

وسنقوم معا بإنعاش ذاكرتنا لفهم بعض القوانين البسيطة .

أيضا يتوجب عليك أن تكون على اطلاع واسع بالدوال المثلثية ( الجا والجتا ) .

قد كتبت موضوع قبل مدة عن الدوال المثلثية .

الدوال المثلثية .. وتطبيقاتها في برمجة الألعاب والجرافكس.

الموضوع تطبيقي لابد من وضع التطبيقات ..

ملاحظة هامة :

- نظام الاحداثيات في الويندوز ( Win32 API ) .. والجافا .. يختلف عن الشائع وعما درسناه .

فالاحداثي الصادي يتزايد كلما اتجهنا من أعلى إلى أسفل النافذة .

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

لذلك ستجد بعض الاشكال التي سنرسمها مقلوبة .. وقد تعمدت ترك ذلك حتى لا نغير من شكل القوانين .. بأن نضربها بسالب واحد ,

ولكن في OpenGL .. استطيع التحكم بالاحداثيات .. لذلك ستجد الرسم غير مقلوب .

فهرس الموضوع :

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

• التطبيق الأول : الدوائر في الإحداثيات القطبية .

• التطبيق الثاني : المنحنيات القلبية .

• التطبيق الثالث : المنحنيات الصدفية الدائرية .

• التطبيق الرابع : ذوات العروتين .( العروة)

• التطبيق الخامس المنحنيات الوردية ( الوردة) .

• التطبيق السادس: حلزون أرخميدس .

الكتاب الذي اعتمدته كمرجع , هو كتاب قد درسته في المستوى السابق ,

وهو : مبادئ التفاضل والتكامل – الجزء الثاني – الفصل الأخير منه – ( من تأليف الدكتور صالح السنوسي وآخرون ) :) .

أنظمة الإحداثيات :

• لقد استخدمنا في دراستنا على مدى السنين الطوال الإحداثيات الديكارتية لتعيين النقاط في المستوي , واستفدنا من هذه الإحداثيات في علم الرسم بالحاسب , مكتبة GDI و GDI+ و OpenGL و Directx و Java2D الخ .. كلها تعتمد على الإحداثيات الديكارتية لتعيين النقاط على النافذة.

• للتذكير :

الإحداثيات الديكارتية هدفها الأساسي هو تحويل وتمثيل المسائل الجبرية إلى هندسية والعكس , وتحتاج لتعيين نقطة في المستوي إلى تمثيلها هكذا :

X , Y

لاحظ أن نقطة الأصل في منتصف النافذة , ولكن بعض الأنظمة مثل الGDI في الويندوز تفرض أن نقطة الأصل في الزاوية العلوية اليسرى .

بالتالي لتطبيق بعض النقاط .. تحتاج لعمل ازاحة .

• الإحداثيات القطبية :

الإحداثيات القطبية تتكون من :

- نقطة ثابتة تسمى القطب أو نقطة الأصل O .

- نصف مستقيم موجه من نقطة الأصل يسمى بالمحور القطبي ,

- لتعيين النقاط في المستوي نحتاج إلى زوج مرتب بهذه الصورة :

R , Theta

حيث R هي المسافة الموجة من نقطة الأصل إلى النقطة التي نحددها P

Theta هي الزاوية الموجهة من المحور القطبي إلى المستقيم O P.

post-42837-1188757680_thumb.jpg

بالنسبة لقياس الزاوية theta هو بالقياس الدائري .. لا اعلم هل هذا الزامي أو لا , لا أتوقع أن هذا إلزامي , لكن هو إلزامي عندما نريد تطبيق الدروس بلغات البرمجة .. التي تفرض أن الزاوية بالراديان .

• مثال :

عين هذه النقطة الممثلة بالاحداثيات القطبية :

( 3 , PI/4)

لاحظ أن الزاوية بالراديان .. ويقابلها بالستيني الزاوية 45

الحل :

post-42837-1188757714_thumb.jpg

• التحويل من الإحداثيات القطبية إلى الإحداثيات الديكارتية :

يوجد أكثر من قانون .. سنأخذ أهمها :

X = r * Cos(theta)

Y = r * Sin(theta)

• مثال : جد الإحداثيات الديكارتية من النقطة ( 8, 9*PI/4 ) :

الحل :

X = 8 * Cos (9*PI/4) = 5.6

Y = 8 * Sin(9*PI/4) = 5.6

لذلك :

(x,y) = (5.6,5.6)

بهذا نكون قد انتهينا من الجزء النظري للموضوع .. الجلسة القادمة ستتناول الجاني التطيقي .

تم تعديل هذه المشاركة بواسطة الشمري في 4 سبتمبر 2007 في 17:34

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

الدوائر في الإحداثيات القطبية :-

معادلة الدائرة القطبية المتمركزة عند نقطة الأصل .. ولها نصف القطر a .

r = a

حيث أن الزاوية theta تأخذ قيم متغيرة في الفترة 360 درجة ( يعني 2*PI ) .

مثال :

r = 10

post-42837-1188759585_thumb.jpg

الفكرة أننا في كل مرة نرسم نقطة عن النقطة

( 10 ,theta )

حيث theta تتغير من صفر الى 360 .

تحويل المعادلة القطبية الى ديكارتية ومن ثم تطبيقها في لغة البرمجة :

دائما نتبع هذه الخطوات :

1- تحويل الزاوية من التقدير الستيني الى الدائري .

2- تحويل المعادلة من قطبية الى ديكارتية كما تعلمنا سابقا .

3- نرسم النقطة x,y .

4- نكون بتكرار الخطوات 1,2,3 .. 360 مرة .. وذلك لانتاج عدد كافي من الزوايا ( من صفر إلى 2*PI )

لاحظ :

		for( degree=0;degree<=360;degree++)
		{

				theta= degree*3.14/180; // تحويل إلى راديان

				// المعادلة القطبية
				r=a;

				// التحويل إلى معادلة ديكارتية
				x = r* cos(theta);
				y = r* sin(theta);

				DrawPoint(x,y);			
		}

- عوض عن a بأي قيمة .. مثلا 10 .. لتكون هي نصف القطر .

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

فمثلا اذا أبعاد النافذة = 400 بيكسل * 400 بيكسل .. فاعمل ازاحة قدرها 200 بيسكل ..

				x = r* cos(theta) + 200;
				y = r* sin(theta) + 200;

post-42837-1188759632_thumb.jpg

انظر المثال Polar Coordinates 2 المرفق في أول الموضوع .

تم تعديل هذه المشاركة بواسطة الشمري في 2 سبتمبر 2007 في 22:02

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

المنحنيات القلبية في الإحداثيات القطبية :

يوجد أربع معادلات :

 r = a* ( 1+ sin(theta) )
 r = a* ( 1 – sin(theta) )
 r = a* (1+ cos(theta) )
 r = a* (1- cos(theta) )

دائما نتبع هذه الخطوات :

1- تحويل الزاوية من التقدير الستيني الى الدائري .

2- تحويل المعادلة من قطبية الى ديكارتية كما تعلمنا سابقا .

3- نرسم النقطة x,y .

4- نكون بتكرار الخطوات 1,2,3 .. 360 مرة .. وذلك لانتاج عدد كافي من الزوايا ( من صفر إلى 2*PI )

void draw(float a)
{
		for( degree=0;degree<=360;degree++)
		{
				theta= degree*3.14/180;

 // المعادلة القطبية					
				r=a * ( 1+ sin(theta) );

				/* 
					 جرب  أحد هذه المعادلات بدلا من المعادلة السابقة	
				 r = a* ( 1+ sin(theta) )
				 r = a* ( 1 – sin(theta) )
				 r = a* (1+ cos(theta) )
				 r = a* (1- cos(theta) )
				*/


				التحويل إلى معادلة ديكارتية	// 				
				x = r* cos(theta);
				y = r* sin(theta);

				DrawPoint(x,y);			
		}
}

وهذه صورة التطبيق للمعادلة الموجودة في الكود ...

post-42837-1188799869_thumb.jpg

انظر المثال Polar Coordinates 2 المرفق في أول الموضوع .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

السلام عليكم ورحمة الله

أخى الفاضل

بارك الله فيك على مجهوداتك , ولكن لى تساؤل.

لماذا نقلت موضوعك من قسم الرياضيات والخوارزميات؟

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

وبالله التوفيق,,,

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#5

هلا أخوي ,,

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

لا اخفيك اني نقلته اكثر من مرة .. بين قسم الرياضيات و وقسم برمجة الجرافكس.. لاني مش متأكد الموضوع الى أين ينتمي . .

لكن بما أنك قلت كلمتك .. و انه ممكن يكون ضمن مجال الرياضيات .. فهذا هو الموضوع موجود هنا .. وهذه للمرة الخامسة أنقله .. دائما ما اواجه صعوبة في اتخاذ القرار .. :D

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

المنحنيات الصدفية الدائرية في الإحداثيات القطبية :

المعادلات هي :

 r = a + b * sin (theta)
 r = a – b * sin(theta)
 r = a + b * cos(theta)
 r = a – b * cos(theta)

حيث a لايساوي b .. وكل منهما أكبر من صفر .

أشكال هذه المنحنيات .. تعتمد على النسبة ( a تقسيم b ) .

دائما نتبع هذه الخطوات :

1- تحويل الزاوية من التقدير الستيني الى الدائري .

2- تحويل المعادلة من قطبية الى ديكارتية كما تعلمنا سابقا .

3- نرسم النقطة x,y .

4- نكون بتكرار الخطوات 1,2,3 .. 360 مرة .. وذلك لانتاج عدد كافي من الزوايا ( من صفر إلى 2*PI )

void draw(float a , float b)
{
		for( degree=0;degree<=360;degree++)
		{
				theta= degree*3.14/180;//

				// المعادلة القطبية				
				 r = a + b * sin (theta);

				/* 
				 جرب  أحد هذه المعادلات بدلا من المعادلة السابقة				
r = a + b * sin (theta)
 r = a – b * sin(theta)
 r = a + b * cos(theta)
 r = a – b * cos(theta)

				*/


				// التحويل إلى معادلة  ديكارتية
				x = r* cos(theta);
				y = r* sin(theta);

				DrawPoint(x,y);			
		}
}

النتيجة ستختلف بحسب قيم a و b .. راجع كتب الرياضيات التي تشرح الحالات المتوقعة للشكل بحسب قيم a و b .

( النسبة بين a و b )

نورد أهمها هنا :

post-42837-1188915949_thumb.jpg

post-42837-1188916146_thumb.jpg

يوجد نتائج اخرى للنسبة بين a , b انظر اليها في كتب الرياضيات المتخصصة .. أو بتجريب قيم عشوائية في المثال المرفق .

انظر المثال Polar Coordinates 3 المرفق في أول الموضوع .

تم تعديل هذه المشاركة بواسطة الشمري في 4 سبتمبر 2007 في 17:31

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

ذوات العروتين .

المعادلة تحتوي على تربيع ... لذلك .. سأضع المعادلات بشكل صورة .

post-42837-1189084907_thumb.jpg

ولكن نحن نريد كتابة تلك المعادلة بنظيرتها في الاحداثيات الديكارتية .. ونعلم أن

X = r * cos(theta)

لذلك هناك عدة حلول لايجاد r .. منها ماهو سهل بالنسبة لنا ولكن متعب للمعالج ... والعكس صحيح ..

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

سأحولها الى هذا الشكل :

post-42837-1189084938_thumb.jpg

ملاحظة هامة .. قمت بالابتعاد عن الاشارة السالبة تحت الجذر .. خوفا من الوقوع في المحظور ..

من يعرف طريقة مناسبة للتخلص من التربيع من ال r .. مع المحافظة على الاشارة السالبة فياليت يخبرنا .

دائما نتبع هذه الخطوات :

1- تحويل الزاوية من التقدير الستيني الى الدائري .

2- تحويل المعادلة من قطبية الى ديكارتية كما تعلمنا سابقا .

3- نرسم النقطة x,y .

4- نكون بتكرار الخطوات 1,2,3 .. 360 مرة .. وذلك لانتاج عدد كافي من الزوايا ( من صفر إلى 2*PI )

		for( degree=0;degree<=360;degree++)
		{
				theta= degree*3.14/180;// تحويل الى راديان

				// المعادلة القطبية
				 r =sqrt(a * a * cos(2*theta) );

				/* 
				 جرب  أحد هذه المعادلات بدلا من المعادلة السابقة			
				 مع ملاحظة خطورة وجود السالب تحت الجذر ) لست متأكد من صحة المعادلة			
				 r =sqrt(a * a * cos(2*theta) );
				 r =sqrt(a * a * sin(2*theta) );
				 r =sqrt(-a * a * cos(2*theta) );
				 r =sqrt(-a * a * sin(2*theta) );
				*/


				// التحويل إلى معالدة ديكارتية

				x = r* cos(theta);
				y = r* sin(theta);

				DrawPoint(x,y,);			
		}

وهذه صورة التطبيق للمعادلة الموجودة في الكود ...

post-42837-1189084972_thumb.jpg

طبعا نحن نرسم بنقاط ... لو كنا نرسم بخطوط لصارت الرسمة أكثر وضوحا ... في OpenGL ,, استخدمت الخطوط .

جرب باقي المعادلات ..

انظر المثال Polar Coordinates 4 المرفق في أول الموضوع .

تم تعديل هذه المشاركة بواسطة الشمري في 6 سبتمبر 2007 في 16:27

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8

المنحنيات الوردية Roses .

المعادلات :

   r = a * sin(n * theta)
   r = a * cos(n * theta)

حيث n يتنمي لمجموعة الاعداد الطبيعية .

اذا كان n عدد فردي .. فإن عدد وريقات الوردة يساوي n .

أما اذا كان n عدد زوجي .. فإن عدد الوريقات هو 2n .

دائما نتبع هذه الخطوات :

1- تحويل الزاوية من التقدير الستيني الى الدائري .

2- تحويل المعادلة من قطبية الى ديكارتية كما تعلمنا سابقا .

3- نرسم النقطة x,y .

4- نكون بتكرار الخطوات 1,2,3 .. 360 مرة .. وذلك لانتاج عدد كافي من الزوايا ( من صفر إلى 2*PI )

void draw(float a , int n)
{
		for( degree=0;degree<=360;degree++)
		{
				theta= degree*3.14/180;// تحويل الى راديان

				// المعادلة القطبية
				 r =a* sin(n*theta);

				/* 
				 جرب  أحد هذه المعادلات بدلا من المعادلة السابقة
				 r =a* sin(n*theta);
				 r =a* cos(n*theta);
				*/


				// التحويل إلى معادلة ديكارتية

				x = r* cos(theta);
				y = r* sin(theta);

				DrawPoint(x,y);			
		}
}

لاحظ النتيجة في كل حالة :

post-42837-1189085363_thumb.jpg

post-42837-1189085370_thumb.jpg

انظر المثال Polar Coordinates 5 المرفق في أول الموضوع .

تم تعديل هذه المشاركة بواسطة الشمري في 6 سبتمبر 2007 في 16:36

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#9

حلزون أرخميدس Spiral Of Archimedes

المعادلة :

 r = a* theta

الزاوية theta كلما كان مداها أكبر كلما ظهر الشكل بشكل أفضل .. يعني 360 زاوية ... لاتظهر المنحنى بالشكل المطلوب , بالتالي من الافضل أن نجعل الفترة كبيرة .. مثلا 720

طبعا .. الزاوية ممكن تكون بالسالب أو الموجب .

دائما نتبع هذه الخطوات :

1- تحويل الزاوية من التقدير الستيني الى الدائري .

2- تحويل المعادلة من قطبية الى ديكارتية كما تعلمنا سابقا .

3- نرسم النقطة x,y .

4- نكون بتكرار الخطوات 1,2,3 .. 360 مرة أو أكثر .. وذلك لانتاج عدد كافي من الزوايا ( من صفر إلى 2*PI )

		for( degree=0;degree<=360*3;degree++) // 360*3 قيمة
		{
				theta= degree*3.14/180;// تحويل الى راديان

				// المعادلة القطبية
				 r = a*theta;


				// التحويل إلى معادلة ديكارتية
				x = r* cos(theta);
				y = r* sin(theta);

				DrawPoint(x,y);			
		}

post-42837-1189086456_thumb.jpg

انظر المثال Polar Coordinates 6 المرفق في أول الموضوع .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#11

السلام عليكم ورحمة الله وبركاته

من مدة طويلة أتردد على هذا الموضوع وأحاول أن أجد وقت للقراءة

وقد حصل ولله الحمد

موضوع أقل ما يقال عنه أنه رائع

قرأت عن المنحنيات القلبية

في البداية أريد أن أستفسر هل من طريقة لجعل المنحنى يزداد من هيئة القلب تلاحظ معي أنه شبه دائري من الأسفل

عندي اقتراح لتحسين الكود بدلاً من إجراء عملية الضرب كل مرة لما لا تضيف PI/180 بدلاً من واحد

على حد علمي برامج الرسومات graphics بالذات تحتاج إلى السرعة بشكل كبير

سأكمل قراءة الموضوع وأرد عليك بإذن الله

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

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

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