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

مكتبة مصغرة لاكتشاف التصادم ( مشروع جماعي ايضا)

مغلق
بدأه Abdullah.Alshammeri في 25 يوليو 2006 · 20 رد · 2,039 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم .

هذا المشروع يريد فقط شخص يعرف للمتغيرات والدوال . بدون رمكتبات ووجع راس .

مارأيكم لو نبني كلاس واحد نضع فيه دوال لاكتشاف التصادم مثلا

اكتشاف التصادم بين النقطة و :

المستطيل

الدائرة

الخط

اكنشاف التصادم بين المستطيل و

الدائرة والخط

اكتشاف التصادم بين الدائرة و

الدائرة والخط

اكتشاف التصادم بين

خطين .

واكتشاف التصادم بين المثلث و

المستطيل والمثلث والنقطة والخط .

طبعا ونطور الكلاس بحيث .

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

بل وممكن نطور المثال لاكتشاف التصادم في عالم الثري دي .

كل ذلك بالسي بلس فقط .

أعتقد الامر ممتع .. فقط نريد وقت فراغ .

اعلم اننا فنحنا عدة مشاريع وعلى عدة جبهات ولم ننجزها .. لكن هذا المشروع يسير في الركب ولايوجد تعارض بل هو ممتع على حسب ظني .

أي شيء يخطر ببالك .. افتح الفيجوال سي واكتب الكود وارفقه في المرفقات .

تم تعديل هذه المشاركة بواسطة الشمري في 25 يوليو 2006 في 11:45

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

انا بدأت حاليا بتعلم opengl و لكني جيد في الـ ++C لذلك ساحاول ما استطعت ........ و عندما أكتب أي شيء سأرفقه فورا .................

MAAAAAAAAAAAAAAAAAAAAAAAC

#3

تعرف إش هي المشكلة إنو أنا أبرمج بـ C++ بس ما استخدم Open GL

#5

نحن اصلا لن نستخدم oPENGL او DX .. مجرد لغة السي فقط

IF ( RECT.LEFT > RECT2.LEFT &&......)
RETURN TRUE;
else
return false;

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

السلام عليكم

أخواني الكرام أنا كتبت هذا الكود أرجوا أن تروه

#include<iostream.h>
class Point3D
{





public:
	float px;									
	float py;									
	float pz;	
	Point3D()									
	{
		px = 0;
		py = 0;
		pz = 0;
	}
	Point3D(float px, float py, float pz)			
	{
		this->px = px;
		this->py = py;
		this->pz = pz;

	}

Point3D& operator= (Point3D p)			
	{

		px = p.px;
		py = p.py;
		pz = p.pz;
		return *this;

	}



	Point3D operator* (float value)			
	{
		return Point3D(px * value, py * value, pz * value);
	}

	Point3D operator/ (float value)			
	{
		return Point3D(px / value, py / value, pz / value);
	}





	Point3D& operator*= (float value)			
	{
		px *= value;
		py *= value;
		pz *= value;
		return *this;
	}


	Point3D& operator/= (float value)			
	{
		px /= value;
		py /= value;
		pz /= value;
		return *this;
	}


	Point3D operator- ()						
	{
		return Point3D(-px, -py, -pz);
	}


};

class Vector3D:public Point3D

{
public:
	float vx;									
	float vy;									
	float vz;
Vector3D()									
	{

		vx = 0;
		vy = 0;
		vz = 0;

	}
	Vector3D(float vx, float vy, float vz)		
	{

		this->vx = vx;
		this->vy = vy;
		this->vz = vz;

	}

Vector3D (Point3D pb, Point3D pa)	
{

Vector3D(pb.px -pa.px ,pb.py -pa.py ,pb.pz -pa.pz );
this->vx =pb.px -pa.px;
this->vy =pb.py -pa.py;
this->vz =pb.pz -pa.pz;
cout<<vx  <<endl<<vy <<endl<< vz  <<endl;


}

Vector3D operator+ (Vector3D v)				
	{

		return Vector3D(vx + v.vx, vy + v.vy, vz + v.vz);

	}


Vector3D operator- (Vector3D v)				
	{
		return Vector3D(vx - v.vx, vy - v.vy, vz - v.vz);
	}

Vector3D& operator+= (Vector3D v)			
	{
		vx += v.vx;
		vy += v.vy;
		vz += v.vz;
		return *this;
	}

Vector3D& operator-= (Vector3D v)		
	{
		vx -= v.vx;
		vy -= v.vy;
		vz -= v.vz;
		return *this;
	}


};


class q:public Point3D
{
public :
	Point3D p1;

Point3D p2;

Point3D p3;

Point3D p4;
q()
{
this->	 p1= Point3D(0,0,0);

this-> p2= Point3D(0,0,0);

 this->p3= Point3D(0,0,0);

this-> p4= Point3D(0,0,0);
}
q(Point3D p1,Point3D p2,Point3D p3,Point3D p4)
	{

this->	 p1=  p1;

this-> p2= p2;

 this->p3= p3;

this-> p4= p4;
	}


};

class q_6:public q
{

public:
q q1,q2,q3,q4,q5,q6;

q_6()
{

}
q_6(Point3D p1,Point3D p2,Point3D p3,Point3D p4,Point3D p5,Point3D p6,Point3D p7,Point3D p8)
{
this->q1 .p1=p1;
this->q1 .p2=p2;
this->q1 .p3=p3;
this->q1 .p4=p4;

this->q2 .p1=p2;
this->q2 .p2=p6;
this->q2 .p3=p7;
this->q2 .p4=p3;

this->q3 .p1=p5;
this->q3 .p2=p6;
this->q3 .p3=p7;
this->q3 .p4=p8;

this->q4 .p1=p1;
this->q4 .p2=p5;
this->q4 .p3=p8;
this->q4 .p4=p4;

this->q5 .p1=p1;
this->q5 .p2=p2;
this->q5 .p3=p6;
this->q5 .p4=p5;

this->q6 .p1=p4;
this->q6 .p2=p3;
this->q6 .p3=p7;
this->q6 .p4=p8;

}







};



class collide
{

public:

	Point3D po;
Point3D pt;
q q1;
Point3D p;
bool coll;

collide(Point3D po,Point3D pt)///تصادم نقطة بنقطة 
{

this-> po=po;
this-> pt= pt;

if( (po.pz ==pt.pz)&&(po.px==pt.px )&&(po.py ==pt.py ))

coll=true;
else
coll=false;

cout<<"coll="<<coll<<endl;
}
collide(q q1,Point3D p)///تصادم نقطة بمربع  
{


	this->q1 =q1;
this->p =p;
if ((p.pz ==q1.p1.pz)&&(p.px>=q1.p1.px )&&(p.px <=q1.p2.px )&&(p.py >=q1.p1.py )&&(p.py<=q1.p4.py ))
{
	coll=true;

}
else
{
coll=false;
cout<<"ff"<<endl;
}
}

collide(q_6 wq,Point3D p)///تصادم نقطة بمكعب
{
if( (p.pz==wq.q1.p1.pz)&&(p.px>=wq.q1.p1.px)&&(p.px<=wq.q1.p2.px)&&(p.py>=wq.q1.p1.py)&&(p.py<=wq.q1.p4.py))
{
	coll=true;
	cout<<"wq1"<<endl;
}
if( (p.pz>=wq.q2.p1.pz)&&(p.pz<=wq.q2.p2.pz)&&(p.px==wq.q2.p1.px)&&(p.py>=wq.q2.p1.py)&&(p.py<=wq.q2.p4.py))
{
coll=true;
	cout<<"wq2"<<endl;
}

if( (p.pz==wq.q3.p1.pz)&&(p.px>=wq.q3.p1.px)&&(p.px<=wq.q3.p2.px)&&(p.py>=wq.q3.p1.py)&&(p.py<=wq.q3.p4.py))
{
coll=true;
	cout<<"wq3"<<endl;
}

if( (p.pz>=wq.q4.p1.pz)&&(p.pz<=wq.q4.p2.pz)&&(p.px==wq.q4.p1.px)&&(p.py>=wq.q4.p1.py)&&(p.py<=wq.q4.p4.py))
{
coll=true;
	cout<<"wq4"<<endl;
}

if( (p.pz>=wq.q5.p1.pz)&&(p.pz<=wq.q5.p4.pz)&&(p.px>=wq.q5.p1.px)&&(p.px<=wq.q5.p2.px)&&(p.py==wq.q5.p1.py))
{
coll=true;

	cout<<"wq5"<<endl;

}

if( (p.pz>=wq.q6.p1.pz)&&(p.pz<=wq.q6.p4.pz)&&(p.px>=wq.q6.p1.px)&&(p.px<=wq.q6.p2.px)&&(p.py==wq.q6.p1.py))
{
coll=true;
	cout<<"wq6"<<endl;

}

}
};
#7
اقتباس
نحن اصلا لن نستخدم oPENGL او DX .. مجرد لغة السي فقط

عفوا أنا فهمت شي تاني

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

MAAAAAAAAAAAAAAAAAAAAAAAC

#8
اقتباس
class Vector3D:public Point3D

{

public:

float vx;

float vy;

float vz;

أعتقد أن عملية composition كانت أفضل من الـ inheritance أي أن نقوم بتعريف النقطتين المحددتين للشعاع في الـ class الجديد بدل الوراثة من الـ class القديم و إذافة نقطة ثانية

اقتباس
this->vx =pb.px -pa.px;

this->vy =pb.py -pa.py;

this->vz =pb.pz -pa.pz;

cout<<vx <<endl<<vy <<endl<< vz <<endl;

لم أفهم أهمية هذه الأسطر في الـ constructor الثالث للصف vector

فأنت تستدعي في السطر الأول الـ constructor الثاني الذي سيقوم بالمهمة ... و لماذا الطباعة ؟؟؟

بالنسبة للصف q ما هو ....؟ بصراحة لم أعرف عن ماذا يعبر ... الكثير من النقاط في الصف.... !!!!!

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

MAAAAAAAAAAAAAAAAAAAAAAAC

#9
اقتباس
بالنسبة للصف q ما هو ....؟ بصراحة لم أعرف عن ماذا يعبر ... الكثير من النقاط في الصف.... !!!!![/

هو يعبر عن رباعي له اربع نقاط (points) .. كل نقطة عبارة عن x-y-z .

الكود جدا رائع .. سأضيف اليه شيء بسيط ,,,

لكن بالنسبة للطباعة cout أرى ان لا تكتبها افضل.. لاننا لن نتعامل فقط مع الكونسول .

تم تعديل هذه المشاركة بواسطة الشمري في 28 يوليو 2006 في 20:22

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#10

يا جماعة ... ليش الوراثة من الـ point

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

بعرف الكل بالصف ... هيك أحسن بكتير ....... حدا عندو رأي تاني ...

و لم تجيباني عن التابع البناء في الصف Vector

أما توابع التقاطع ففعلا هي جيدة جدا ... ما شاء الله الأخ hunterxhunter سبقنا و كتب كل هالصفوف و التوابع ...

بصراحة أنا لهلأ ما خلصت قراءة الكود ... بس لما خلصو أكيد رح يكون في update إن شاء الله

تم تعديل هذه المشاركة بواسطة aubada في 28 يوليو 2006 في 21:09

MAAAAAAAAAAAAAAAAAAAAAAAC

#11

السلام عليكم

أخي الكريم Aubada

بالنسبة الى الوراثة

الغرض منها هو وراثت التعامل مع المعاملات مثلا تضرب عدد في متجه وهكذا

أما هذا السطر

this->vx =pb.px -pa.px;

vx:عبارة عن إحداثي المتجه السيني

pb.px:إحداثي السيني للنقطة الثانية

pa.px:إحداثي السيني للنقطة الأولة

this->vy =pb.py -pa.py;
this->vz =pb.pz -pa.pz;

السطرين السابقين مثل السطر الأول فقط على الإحداثي الصادي والعيني

الغرض من الأسطر الثلاثة السابقة هي إيجاد متجه عن طريق نقطتين

والبقية مثل ما قال أخي العزيز الشمري

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

وإذا في أيشيء فأنا حاضر

#12

ملاحظة بسيطة

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

#13

وجدت هذا المثال اللعبـة (لا أدري من أين) ... أعتقد أنه ما تريدون ومن الممكن أن يفيدكم في مشروعـكم ... خاصة أن أغلبه دوال وليس كلاساتExem.rar

#14

قرأت الكود وتمعنت فيه .

كل شيء رائع ولكن أريد أن أطرح وجهت نظري .

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

أتمنى ان نجعل الهدف الاول : مكتبة بسيطة : .

على العموم انا سأعدل في كود hunterxhunter .. واعيد طرحه من جديد ونسمع الاراء مرة اخرى . طبعا مجرد تجارب الان .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#15

قمت بعمل ديكور لكود الاخ hunter .

قمت بإعادة تسمية الكائن q الى Quad وايضا قمت باعادة تسمية الكائن q_6 الى Box .

فقط حتى يبقى الكود واضح .

أيضا قمت بنقل الكائن vector الى ملف مستقل سميته sub.h .. لنستعمله في وقت لاحق .

بالنسبة لفكرة الكود الذي كتبه الاخ hunter . فكرة رائعة ..

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

	Box b;
	b.q1.p1.px=...

لكن بصراحة أعتقد أن الكائن

Collide يحتاج لتعديلات

مثلا ان نستخدم دوال method من خلال الكائن بدلا من استخدام المشيد constructor

وكل دالة تعيد قيمة true او false حسب حالة التصادم .

مثلا قمت بتعديل بسيط

class Collide
{

public:

	Point3D po;
	Point3D pt;
	Quad q1;
	Point3D p;
	bool coll;

		bool Test_Point_Point(Point3D po,Point3D pt)
		{

			this-> po=po;
			this-> pt= pt;

			if( (po.pz ==pt.pz)&&(po.px==pt.px )&&(po.py ==pt.py ))
				return true;

			return false; 
		}

		bool Test_Quad_Point(Quad q1,Point3D p)
		{


			this->q1 =q1;
			this->p =p;

if ((p.pz ==q1.p1.pz)&&(p.px>=q1.p1.px )&&(p.px <=q1.p2.px )&&(p.py >=q1.p1.py )&&(p.py<=q1.p4.py ))
				{
					return true;

				}
			return false;  


		}

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

وقابلة للتغيير

الان ندخل للمضمون

انا كنت قد كتبت كود مشابه لكن فقط 2D

لكن سأعرضه هنا ..

struct POS
{
	float x ,  y;
};

typedef POS POINT2D;


struct BRECT
{
	int x1,y1,x2,y2;
};


class CCOLLISION
{
public: 
	CCOLLISION(){}
	~CCOLLISION(){}

	bool Test_Point_Point(POINT2D *P1,POINT2D *P2);
	bool Test_Point_Rect(POINT2D *P,BRECT *R);
	bool Test_Rect_Rect(BRECT *R1,BRECT *R2);

private:
}; 


bool CCOLLISION::Test_Point_Point(POINT2D *P1,POINT2D *P2)
{
	if(P1->x == P2->x && P1->y==P2->y )
		return true;
	return false; 

}


bool CCOLLISION::Test_Point_Rect(POINT2D *P,BRECT *R)
{
	if((P->x>=R->x1) && (P->x<=R->x2) && (P->y >=R->y1)&&(P->y<=R->y2) )
		return true;
	return false;

}

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

فلا نريد تشتيت انفسنا ..

لكن فقط زيادة خير .

على العموم .

اقترح ان يكون كود الاخ hunter هو القلب للمكتبة ..

فاي تعديلات بامكاننا اضافته اليها ..

سأقوم بتجربة كود hunter في الثري دي

=========================

collision.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#16
اقتباس
بالنسبة الى الوراثة

الغرض منها هو وراثت التعامل مع المعاملات مثلا تضرب عدد في متجه وهكذا

أنت لما تعمل composition للنقطتين مثلا لتشكيل الشعاع ... رح تقدر تستعمل كل الـ methods الموجودة في النقطة ...

تم تعديل هذه المشاركة بواسطة aubada في 29 يوليو 2006 في 18:35

MAAAAAAAAAAAAAAAAAAAAAAAC

#17

يبدو أننا نواجه مشاكل جديدة .

قمت بعمل اختبار للكلاس ... ولكن تبين لي ما يلي :

hunter كتب مايلي لاكتساف التصادم بين نقطة و شكل رباعي .

		bool Test_Quad_Point(Quad q1,Point3D p)///تصادم نقطة بمربع  
		{


			this->q1 =q1;
			this->p =p;

if ( (p.pz ==q1.p1.pz)&&(p.px>=q1.p1.px )&&(p.px <=q1.p2.px )&&(p.py >=q1.p1.py )&&(p.py<=q1.p4.py ))
				{
					return true;

				}
			else return false; //اذا لم يحدث تصادم 


		}

طبعا الكود صحيح 100% لكن المشكلة تظهر مع بعض انظمة الاحداثيات لبعض المكتبات ..

فهو مثلا قال

p.py >=q1.p1.py )&&(p.py<=q1.p4.py

هذه الجملة الشرطية صحيحة في حالة أن نظام الاحداثيات هو

شبيه بالتالي

11.JPG

بالتالي سيكون الشرط صحيح لانه كلما نزلنا لاسفل ستزداد قيمة الاحداثي الصادي

لكن في نظام الاحداثيات المستخدم في OPENGL

وهو النظام الافتراضي

هكذا

2.JPG

أي كلما نزلنا لاسفل ستقل قيمة الاحداثي الصادي

بالرغم من أنه يمكننا تحويل نظام الاحداثيات في OPENGL لتكون شبيه بنظام الاحداثيات في WINDOWS

عن طريق الدالة

	gluOrtho2D(0,800,600,0);

لكن المشكلة تظهر اذا تعاملنا مع الثري دي .

سأجرب الدالة glFrustum

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

نقطة أخرى ..

وهي أيضا في مسألة اكتشاف التصادم بين النقطة والرباعي

		bool Test_Quad_Point(Quad q1,Point3D p)///ÊÕÇÏã äÞØÉ ÈãÑÈÚ  
		{


			this->q1 =q1;
			this->p =p;

		if ( (p.pz ==q1.p1.pz)&&(p.px>=q1.p1.px )&&(p.px <=q1.p2.px )&&(p.py >=q1.p1.py )&&(p.py<=q1.p4.py ))
				{
					return true;

				}
			else return false; //ÇÐÇ áã íÍÏË ÊÕÇÏã 


		}

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

لاني لم اعرف كيف تم ترتيب النقاط

فمثلا شاهد الصورة

33.JPG

فهنا ستظهر مشاكل للمستخدم العادي

المطلوب لاكتشاف التصادم في المربع

اربعة أشياء

left

right

top

bottom

بالتالي بامكاننا اكتشاف التصادم من خلال نقطتين فقط

44.JPG

قمت بوضع دالة داخل الكائن Quad

سميتها Set

	void Set(float left,float right,float top,float bottom,float Z)
	{
		this->p1.pz=Z;
		this->p1.px=left;
		this->p2.px=right;
		this->p1.py=top;
		this->p4.py=bottom;
	}

طبعا سؤال ؟

لماذا اخترت بالتحديد p1 - p4

الجواب لانه في كود اكتشاف التصادم الذي كتبه hunter

if ( (p.pz ==q1.p1.pz)&&(p.px>=q1.p1.px )&&(p.px <=q1.p2.px )&&(p.py >=q1.p1.py )&&(p.py<=q1.p4.py ))

واخيرا بالمرفقات اختبار لهذا الكلاسفي 2D فقط

قم بتحريك الاسهم لتحرك النقطة

اذا اصطدمت النقطة بالنقطة الاخرى سيحدث تصادم

واذا اصطدمت النقطة بالمستطيل سيحدث ايضا تصادم

المثال باستخدام oPENGL و GLUT ومرفق معه التطبيق .

coll_2.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#18

السلام عليكم

موضوع جيد وكان نفسى اشارك بالطتبيقات ولكن ظروف عملى لا تسمح والكمبيوتر بعيد عنى ولكن يكفنى الأن المتابعه

163374357.gif

#19

السلام عليكم

أخي الكريم aubada

أنا مادري حبيت أستخدم الوراثة ولكن إذا أرت إحدف كود الوراثة وأرنا الإضافات والتعديلات

المهم مشكلت الوراث ليست صعبة لذلك مارأيك بالتركيز على كشف التصادم أنتضر رايك

أخي العزيز الشمري

بالنسبة الى المشكلة الأولة

لاتأخد قيمت الإحداثيات على أنها موقع والمشكلة ستحل

مثلا على المحور الصادي لاتقول أن 0 تقع أعلى –1

ولكن قول أن 0 أكبر من –1

ولكن ماهو المثال اللي أضهر لك هذه المشكلة

بالنسبة الى المشكلة الثانية فكلامك صحيح وأنا لم أحسب لها حساب

طيب الآن ماهي أفضل طريقة لكشف التصادم بين نقطة ومثلث

أنا وجت طريقة للأخ أحمد صالح

في هذا الرابط

/index.ph...=نقطة+داخل+مثلث

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

فهل لديكم طريقة أخرى

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

ولكن السؤال هل تريدوا أن نعملها مع العلم أنها ستكون متعبة للمعالج لكثرة إستخدام االدوال المثلثية أم لا؟

وإذا كانت هنالك طريقة أفضل فأرجوا أن تضعوها

#20

لا اريد التحطيم ولكن شكلنا بعيدين عن الهدف !

وجدت ان الموصوع أساسه خوارزميات ... ومشاكل ..

مثلا في حالة أننا عملنا للجسم rotation حينها لن يصبح هناك تصادم الا اذا تداركنا هذه المشكلة .

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

http://uk.geocities.com/olivier_rebellion/Polycolly.zip

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

===

أيضا .. انا سأضيف دوال اخرى لاكتشاف التصادم ..ولكن سأفرض اننا في 2d فقط .. مسألة الثري دي سأتركها الان .

===

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#21

ما هي اخر النتائج يا قوم ...

بعد ان تمرمرت ( اي : تعنتلت :D) بالتصادم ..

الان انتهيت من اكتشاف التصادم بين شكلين رباعيين .

طبعا الفكرة هي أني اكتشف التصادم بين كل رأس من رؤوس الشكلين الرباعيين ..

كما هو في الصورة .

AAAA.JPG

وهذا الكود الذي أضفته للكائن Collide

		bool Test_Quad_Quad(Quad q1 , Quad q2)
		{
			//check q1 
			if(Test_Quad_Point(q2,q1.p1) )
				return true;
			if(Test_Quad_Point(q2,q1.p2) )
				return true;
			if(Test_Quad_Point(q2,q1.p3) )
				return true;
			if(Test_Quad_Point(q2,q1.p4) )
				return true;
 		 	else return false;
			//check q2 
			if(Test_Quad_Point(q1,q2.p1) )
				return true;
			if(Test_Quad_Point(q1,q2.p2) )
				return true;
			if(Test_Quad_Point(q1,q2.p3) )
				return true;
			if(Test_Quad_Point(q1,q2.p4) )
				return true;


 		 	else return false;
		}

طبعا لازم تقوم بتحديد موقع كل رأس من رؤوس الشكل الرباعي ..

Quad rectangle;
Quad rectangle2;


 	rectangle.p1.px=200+X;
	rectangle.p1.py=200+Y;
	rectangle.p1.pz=0;

	rectangle.p2.px=300+X;
	rectangle.p2.py=200+Y;
	rectangle.p2.pz=0;

	rectangle.p3.px=200+X;
	rectangle.p3.px=300+Y;
	rectangle.p3.pz=0;

	rectangle.p4.py=300+X;
	rectangle.p4.py=300+Y;
	rectangle.p4.pz=0;
/////////////////////// 2 //////////////////
	rectangle2.p1.px=100;
	rectangle2.p1.py=100;
	rectangle2.p1.pz=0;

	rectangle2.p2.px=200;
	rectangle2.p2.py=100;
	rectangle2.p2.pz=0;

	rectangle2.p3.px=100;
	rectangle2.p3.px=200;
	rectangle2.p3.pz=0;

	rectangle2.p4.py=200;
	rectangle2.p4.py=200;
	rectangle2.p4.pz=0;


  if(col.Test_Quad_Quad(rectangle,rectangle2)  )
  {
	  collision=true
  }
   else collision =false;

التطبيق والكود الجديد بالمرفقات

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

بالنسبة للمثلث واكتشاف التصادم ... هذا متعب قليلا ..

لكن أتمنى أن نركز الان على الاشياء السهلة ..

عندك الدائرة فيه كود جاهز من الاخ هاي فولت ...

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

ايضا اكتشاف التصادم بين خطين وبين الخط والنقطة ,,

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

أخيرا ادعوكم لهذه الوليمة الدسمة .. اقصد المكتبة الدسمة

http://www.photoneffect.com/coldet/

مكتبة مميزة وسهلة لاكتشاف التصادم ,,

لو كنت اعلم بها

كان مافتحت هذا الموضوع :D

لاتنسون المرفقات ..

coll_3.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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

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