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

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

مغلقرائج
بدأه Abdullah.Alshammeri في 15 يونيو 2007 · 9 رد · 21,888 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

سنتكلم حول عدة نقاط خلال هذا الموضوع .. من هذه النقاط :

-لماذا الدوال المثلثية بالتحديد من بين عشرات الدوال الرياضية.

-تطبيق عملي بسيط باستخدام لغة السي .

-تطبيقات متنوعة اخرى وتشمل :

1-الحركة الدائرية .

2-رسم بيان الدالة cos و sin .

3-رسم بعض الاشكال بالاستفادة من الدوال المثلثية .

4-عمل ساعة ( ومحاكاة حركة عقاربها ).

ملاحظة هامة :

-سأفرض أنك درست الدوال المثلثية .. وتعرف كل الاساسيات عنها .. لن اخوض في أي تفاصيل ( تعلمناها في التعليم الاكاديمي ) , الهدف برمجي بحت .

-أيضا يجب ان تعرف ان ما يهمنا من دوال مثلثية في هذا الموضوع ( الجا و الجتا ) .

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

-لماذا الدوال المثلثية بالتحديد من بين عشرات الدوال الرياضية؟

الجواب والسر هو أنها دوال دورية .. الدوال المثلثية ( وحتى يكون كلامنا اكثر صحة) دالة الجيب sin و جيب التمام cos هما دالتان دوريتان ودورهما هو 360 درجة

post-42837-1181876622_thumb.jpg

الشكل هو عبارة عن تمثيل لدائرة الوحدة ( التي نصف قطرها = 1 ) ونلاحظ أن قيم الدالتان Sin , Cos تقعان على دائرة الوحدة ذات المعادلة المعروفة .. ومن هنا جاءت تسميتها بالدوال الدائرية , ( حسب رواية الدكتور صالح  ) .

فلنأخذ الدالة Cos ..

ونمرر لها عدة زوايا مرورا بالصفر وانتهاء بال360 درجة ,

خذ الحاسبة واستنتج القيم .. ستجد ما يلي :

Cos(0) = 1

cos(30)=0.8

cos(45)=0.7

cos(60)=0.5

cos(90)=0

cos(135)=-.7

Cos(180)= -1

Cos(210)=-0.8

Cos(270)=0

Cos(330)=0.8

Cos(360)= 1

Cos(400)= Cos(400-360)= Cos(40)= 0.76

ستلاحظ ان قيم الدالة تتناقص من الزاوية صفر الى الزاوية 180 .. ثم تبدأ بالتزايد اعتبارا من 181 الى 360 ..

ونلاحظ أن دور الدالة هو 360 درجة .. بالتالي جتا 400 هو نفسه جتا (400-360) وهو جتا 40 ..

ونلاحظ ايضا ان المجال المقابل للدالة cos هو من -1 الى 1

نفس الامر ينطبق على الدالة Sin .. الفرق هو في فترات التزايد والتناقس .. حيث الدالة جا ... تتزايد من 0 الى 90 درجة .. ووتناقص من 90 الى270 ثم تتزايد من 270 الى 360 ..

من هذه الخواص وهي :

1-التزايد والتناقص ( المنتظم ان صح التعبير).

2-الدالة دورية .

3-المجال المقابل يقع بين -1 و 1 .

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

إلى هنا تنتهي الجلسة الاولى .

تم تعديل هذه المشاركة بواسطة الشمري في 15 يونيو 2007 في 06:13

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

- تطبيق عملي بسيط باستخدام لغة السي .

الهدف من هذا التطبيق هو التعرف على كيفية استدعاء الدوال المثلثية من المكتبة math ..

وكيفية تحويل الزاوية من التقدير الستيني الى الدائري ,

للمزيد

لغة السي بلس ( وأغلب اللغات) .. تفرض أنك تقوم بتمرير الزاوية الى الدالة المثلثية بالتقدير الدائري ( وليس الستيني ) لذلك يجب تحويل الزاوية الى تقدير دائري .. حسب هذه المعادلة المعروفة :

double D  = angle*(3.14/180)

حيث angle هي الزاوية بالقياس الستيني ..

مثال يقوم بطباعة جتا عدة زوايا .. وجا عدة زوايا ,

#include<cmath>
#include<iostream>
using namespace std; 


int main()
{
	double d; 
	cout << " Cos  Table " <<endl;

	for(double i=0;i<=360;i+=10)
	{
		d=i* ( 3.14/ 180 );
		cout <<"angle :" <<i<<" >>> "<< cos(d)<<endl;
	}

	cout<<endl;
	cout << " Sin  Table " <<endl;

	for(double i=0;i<=360;i+=10)
	{
		d=i* ( 3.14/ 180 );
		cout <<"angle :" <<i<<" >>> "<< sin(d)<<endl;
	}

	return 0;
}

تم تعديل هذه المشاركة بواسطة الشمري في 15 يونيو 2007 في 06:10

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

شكرا لك اخ الشمرى فعلا موضوع مهم

لكن التطبيقات يجب ان تكون فى مجال 3d فقط ام ان ذلك يمكن الاستفادة منه فى التطبيقات البسيطة 2d

موقع البرنامج

مبارك لشعب تونس photo-thumb-42837.png

#4

السلام عليكم

الف شكر اخوي الشمري على الموضوع الرائع و المهم لبرمجة الالعاب

ننتظر جديدك

تحياتي

#5

الله يعطيك العافية و الله

و يجزاك كل خير

#6

التحريك بالاستفادة من الدوال المثلثية .

ذكرنا ان الجتا و الجا .. تنتجان قيم مختلفة .. وتتميز بانها تتناقص ووتزايد بشكل منتظم ( تقريبا) .

فلو حولنا هذه القيم الى احداثيات .. وتخيلنا ما يحدث في الاحداثيات الديكارتية .. سنجد التالي ’’’

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

أما الاحداثي الصادي فلنجعله 0 دائما ( كتجربة فقط ) .

كل نقطة نسميها P

P1= (x,y)=( Cos(0),0) = (1 , 0 )
P2= (x,y)=( Cos(30),0) = (0.8 , 0 )
P3= (x,y)=( Cos(45),0) = (0.7 , 0 )
P4= (x,y)=( Cos(60),0) = (0.5 , 0 )
P5= (x,y)=( Cos(90),0) = (0 , 0 )
P6= (x,y)=( Cos(135),0) = (-0.7 , 0 )
P7= (x,y)=( Cos(180),0) = (-1 , 0 )
P8= (x,y)=( Cos(210),0) = (-0.8 , 0 )
P9= (x,y)=( Cos(270),0) = (0 , 0 )
P10= (x,y)=( Cos(330),0) = (0.8 , 0 )
P11= (x,y)=( Cos(360),0) = (1 , 0 )

post-42837-1182076877_thumb.jpg

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

إذن من خلال هذه الفكرة البسيطة تستطيع أن تنتج حركة جميلة ,,

نفس الامر ينطبق على دالة الجيب ..

كود بسيط :

   
// call this Function for each 10 ms 
void TimerFunc()
{
	angle+=1;
	if(angle>360)
		angle=0;
	x = cos(angle*(3.14/180))* 50;
}
// draw pixel,,, 
void display(void)
{
drawPixel( x ,0 );
}

الخطوات هي :

- قم باختيار 360 زاوية ..( وذلك لتكون الحركة ناعمة) .. وهات جيب التمام لكل زاوية .. وخزنه في متغير .. وذلك كل مدة معينة انت تحددها بنفسك .

- قم بضرب النتيجة بقيمة معينة .. لتكبر القيمة ( حيث انه الجا والجتا تنتجان قيم محصورة بين الواحد والسالب واحد .. وهي قيم صغيرة لايمكن أن تؤشر في الغالب ... فنحن هنا ضربنا في 50 .

cos(angle*(3.14/180))* 50

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

ملاحظة :

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

وتستطيع ان تتحكم بقيم الاحداثيات كالتالي :

في OpenGL استخدم الدالة التالية

gluOrtho2D(-200,200,-200,200);

هذا مثال باستخدام OpenGL و glut

Cos_Sin_Ex02.zip

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

-الحركة الدائرية

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

إجعل الاحداثي السيني هو قيمة جيب التمام للزاوية a أي Cos a( حيث a هي قيمة من 0 الى 360 درجة ) .

إجعل الاحداثي الصادي هو قيمة الجيب للزاواية a أي Sin a ( حيث a هي قيمة من 0 الى 360 درجة ) .

دعنا نأخذ مثال .. وستتضح الفكرة ,

P1= (x,y)=( Cos(0),Sin(0)) = (1 , 0 )
P2= (x,y)=( Cos(30),Sin(30)) = (0.8 , 0.5)
P3= (x,y)=( Cos(45),Sin(30)) = (0.7 , 0.7)
P4= (x,y)=( Cos(60),Sin(60)) = (0.5 , 0.8)
P5= (x,y)=( Cos(90),Sin(90)) = (0 , 1 )
P6= (x,y)=( Cos(135),Sin(135)) = (-0.7 , 0.7)
P7= (x,y)=( Cos(180),Sin(180)  = (-1,0)
P8= (x,y)=( Cos(210),Sin(210)  =(-0.8 , -0.5 )
P9= (x,y)=( Cos(270),Sin(270) = (0, -1 )
P10= (x,y)=( Cos(330),Sin(330)= (0.8,-0.5)
P11= (x,y)=( Cos(360),Sin(360)=  (1,0)

قم بتمثيل هذه النقاط على الاحداثيات الديكارتية .

ستجد شكلا شبيه بالتالي .

post-42837-1182148587_thumb.jpg

الرسمة مش مظبوطة :) .. لكن الهدف واضح ان شاء الله .

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

لنخرج بحركة دائرية ..

كود بسيط :

void TimerFunc(int v)
{
	angle+=1;
	if(angle>360)
		angle=0;
	x = cos(angle*(3.14/180))* 80;
	y = sin(angle*(3.14/180))* 80;



}

void display(void)
{

	DrawPoint( x , y ) 
}

1. خزن قيم الجيب وجيب التمام في متغير ..( كل مدة معينة انت تحددها بنفسك ) .

2. قم برسم النقطة .. بالاعتماد على الاحداثيات التي حصلت عليها من الخطوة رقم 1 .

3. لاحظ أنه يمكن ان تنشئ حركة ( بيضاوية ) .. بضرب المتغير x أو y مختلفة لكل منهما .. مثال

x = cos(angle*(3.14/180))* 50;
y = sin(angle*(3.14/180))* 80;

4. لاحظ أنه لايلزم أن يكون الاحداثي السيني هو جيب التمام للزاوية .. فممكن يكون العكس .. مثال

x = sin(angle*(3.14/180))* 50;
y = cos(angle*(3.14/180))* 50;

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

6. حاول تغيير القيم .. ولاحظ ماذا يحدث .. أمثلة :

	x = cos(angle*(3.14/180))* 80;
	y = cos(angle*(3.14/180))* 80;


	x = sin(angle*(3.14/180))* 80;
	y = sin(angle*(3.14/180))* 80;


	x = cos(angle*(3.14/180))* 80;
	y = cos(angle*(3.14/180))* 30;

التطبيق على الحركة الدائرية باستخدام OpenGl و Glut

Sin_Cos_Ex03.zip

تم تعديل هذه المشاركة بواسطة الشمري في 18 يونيو 2007 في 09:38

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8

السلام عليكم

أهلين أخي الشمري

شرح جميل وننتضر المزيد

ولكن أريد أن أذكر شيء أن جميع ماذكرته تستطيع عمله بدون إستخدام الدوال المثلثية

ولكن تكمن الفائدة في إستخدامنا الدوال المثلثية هي

السرعة والسهولة التطبيق

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

نضام الجزيئات فمثلا تستطيع إستخدام الدوال المثلثية ولكن لو إستخدمة قوانين المقدوفات راح تكون أكثر واقعية

ولكن سوف يكون التطبيق بطيء لأنك راح تطبق قوانين المقذوفات على أكثر من 1000 جزيء

طبعا مشكلة البطء لها حلول كثير

وفي الأخير أقول أكمل وسأكون من أول المتابعين للموضوع

تم تعديل هذه المشاركة بواسطة hunterxhunter في 20 يونيو 2007 في 12:45

#9

شكرا جزيلا أخي الشمري :)

و لدي طلب بسيط إذا سمحت

أريد الكود بلغة فيجوال بيسك دوت نت

مع الشكر :D

#10

الاخ الشمري

ماشاء الله عليك

انت مبدع... ومجهود تشكر عليه

تقبل ودي

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

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