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

[شبه مكتمل] : المرحلة الأولى: تطوير وحدة Core

رائج
بدأه فريق الأندلس في 27 سبتمبر 2009 · 177 رد · 11,907 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#51
اقتباس
لأفضل أثناء كتابة Specification ( المواصفات) لكل كلاس .. أن نلتزم بأن يكون الكود موجّه لجميع المبرمجين وليس مكتوب بطريقة لايفهمها الا مبرمجي السي بلس

نسيت هذه النقطه تماما

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

ارجو وضع شرح و لو بسيط لنظام الملاحظات الذى سنتبعه لإنى لا اعرفه.

اقتباس
بالنسبه للنوع Matrix و Vector سأضيفهم بعد الفجر.

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

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

اقتباس
مانظام الاحداثيات الذي سنتعامل معه

بالطبع نظام الإحداثى الديكارتى للأشكال ثنائية البعد، و لمن لا يعرفه ففيه Y تزيد لاعلى و تنقص لأسفل.

نحن الأن نتكلم عن الرياضيات و ليس الرسم. سيكون من الصعب استخدام نظام احداثيات الشاشه اثناء محاولة تضمين دوال كل نوع.

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

حتى لا نقوم بالتنقل بين صفحات الموضوع بحثا عن الأنواع هذه هى النسخه الأخيره التى قمنا بتجهيزها و الموافقه عليها جميعا (بالإضافه لبعض الدوال الجديده)

ارجو المراجعه عليها حتى نتفق على النسخه الأخيره منها

1 - الفئه Math : وتحتوى على مجموعه من الدوال الرياضيه العامه.

 

[color= #0000ff;]class Math

[color= #000000;]{

[color= #0000ff;]public[color= #000000;]:

	[color= #0000ff;]static [color= #0000ff;]float ln[color= #000000;]([color= #0000ff;]float x[color= #000000;]); 

	[color= #0000ff;]static [color= #0000ff;]float log2[color= #000000;]([color= #0000ff;]float x[color= #000000;]); 

	[color= #0000ff;]static [color= #0000ff;]float log10[color= #000000;]([color= #0000ff;]float x[color= #000000;]); 

	[color= #0000ff;]static [color= #0000ff;]float exp[color= #000000;]([color= #0000ff;]float x[color= #000000;]); 

	[color= #0000ff;]static [color= #0000ff;]float alog2[color= #000000;]([color= #0000ff;]float x[color= #000000;]); 

	[color= #0000ff;]static [color= #0000ff;]float alog10[color= #000000;]([color= #0000ff;]float x[color= #000000;]); 

	[color= #0000ff;]static [color= #0000ff;]float pow[color= #000000;]([color= #0000ff;]float base,[color= #0000ff;]float exp[color= #000000;]); 

	[color= #0000ff;]static [color= #0000ff;]float root[color= #000000;]([color= #0000ff;]float base,[color= #0000ff;]float exp[color= #000000;]); 

	[color= #0000ff;]static [color= #0000ff;]float sqrt[color= #000000;]([color= #0000ff;]float base[color= #000000;]); 

	[color= #0000ff;]static [color= #0000ff;]float abs[color= #000000;]([color= #0000ff;]float x[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float floor[color= #000000;]([color= #0000ff;]float x[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float ceiling[color= #000000;]([color= #0000ff;]float x[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float sin[color= #000000;]([color= #0000ff;]float x[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float cos[color= #000000;]([color= #0000ff;]float x[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float tan[color= #000000;]([color= #0000ff;]float x[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float asin[color= #000000;]([color= #0000ff;]float x[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float acos[color= #000000;]([color= #0000ff;]float x[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float atan[color= #000000;]([color= #0000ff;]float x[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float RadToDeg[color= #000000;]([color= #0000ff;]float angle[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float DegToRad[color= #000000;]([color= #0000ff;]float angle[color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float PI[color= #000000;]([color= #000000;]);

	[color= #0000ff;]static [color= #0000ff;]float E[color= #000000;]([color= #000000;]);

[color= #000000;]};

2 - الفئه Point2D : و تمثل نقطه داخل نظام الإحداثيات الذى سيتم اتباعه (الديكارتى او الشاشه حسب ما سنحدد)

 

[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename T[color= #000000;]>

[color= #0000ff;]class Point2D

[color= #000000;]{

[color= #0000ff;]public[color= #000000;]:

	[color= #007f00;]// x is the x-axis

	[color= #007f00;]// y is the y-axis

	T x, y;

 

	[color= #007f00;]// add fixed distance to current point axises

	[color= #0000ff;]void Move    [color= #000000;]( T distance [color= #000000;]);

 

	[color= #007f00;]// add p1 point to p2 point and return new point of those

	[color= #007f00;]// return Point2D object, otherwise false

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]static Point2D[color= #000000;]<S[color= #000000;]> Add [color= #000000;]( Point2D[color= #000000;]<S[color= #000000;]> p1, Point2D[color= #000000;]<S[color= #000000;]> p2 [color= #000000;]);

 

	[color= #007f00;]// subtract p1 point from p2 point and return new point of those

	[color= #007f00;]// return Point2D object, otherwise false

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]static Point2D[color= #000000;]<S[color= #000000;]> Subtract [color= #000000;]( Point2D[color= #000000;]<S[color= #000000;]> p1, Point2D[color= #000000;]<S[color= #000000;]> p2 [color= #000000;]);

 

	[color= #0000ff;]bool equal   [color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Point2D[color= #000000;]<T[color= #000000;]> p [color= #000000;]);

	[color= #0000ff;]bool Notequal[color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Point2D[color= #000000;]<T[color= #000000;]> p [color= #000000;]);

[color= #000000;]};

3 - الفئه Line2D : و تمثل خط مستقيم داخل نظام الإحداثيات

 

[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename T[color= #000000;]>

[color= #0000ff;]class Line2D

[color= #000000;]{

[color= #0000ff;]public[color= #000000;]:

	[color= #007f00;]// start is the start point of line

	[color= #007f00;]// end is the end point of line

	Point2D[color= #000000;]<T[color= #000000;]> start, end;

 

	[color= #007f00;]// check if passed point fall in current line

	[color= #007f00;]// return true is it is, false otherwise

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]bool IsPointInLine[color= #000000;]( Point2D[color= #000000;]<S[color= #000000;]> p[color= #000000;]);

 

	[color= #007f00;]// check if passed line is contained in current line

	[color= #007f00;]// return true if it is, false otherwise

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]bool IsLineInMe[color= #000000;]( Line2D[color= #000000;]<S[color= #000000;]> l[color= #000000;]);

 

	[color= #007f00;]// get line center point

	[color= #007f00;]// in physics called center of gravity

	[color= #007f00;]// return Point2D object, otherwise false

	Point2D[color= #000000;]<T[color= #000000;]> getCenterPoint[color= #000000;]([color= #000000;]);	

 

	[color= #007f00;]// get line length

	[color= #0000ff;]float getLineLenght[color= #000000;]([color= #000000;]);

 

	[color= #007f00;]// increase line length by value

	[color= #0000ff;]void Increase[color= #000000;](T value[color= #000000;]);

	[color= #007f00;]// decrease line length by value

	[color= #0000ff;]void Decrease[color= #000000;](T value[color= #000000;]);

 

	[color= #007f00;]// move start point of line to new position

	[color= #0000ff;]void Move [color= #000000;]( Point2D[color= #000000;]<T[color= #000000;]> p [color= #000000;]);

 

	[color= #007f00;]// get current line slop

	[color= #0000ff;]float getLineSlope[color= #000000;]([color= #000000;]);

 

	[color= #007f00;]// is passed line is perpendicular to current line

	[color= #007f00;]// return true if it is, false otherwise

	[color= #0000ff;]bool IsPerpendicular[color= #000000;]( Line2D[color= #000000;]<T[color= #000000;]> l [color= #000000;]);

 

	[color= #007f00;]// get point that current line and passed line are perpendicular in

	[color= #007f00;]// return point object if exist, null otherwise

	Point2D[color= #000000;]<T[color= #000000;]> getPerpendicularPoint[color= #000000;]( Line2D[color= #000000;]<T[color= #000000;]> l [color= #000000;]);

 

	[color= #007f00;]// get point that current line and passed line and intersect in

	[color= #007f00;]// return point object if exist, null otherwise

	Point2D[color= #000000;]<T[color= #000000;]> getIntersectPoint [color= #000000;]( Line2D[color= #000000;]<T[color= #000000;]> l [color= #000000;]);

 

	[color= #007f00;]// add l1 line to l2 line and return the sum

	[color= #007f00;]// return line object, otherwise null

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]static Line2D[color= #000000;]<S[color= #000000;]> Add [color= #000000;]( Line2D[color= #000000;]<S[color= #000000;]> l1, Line2D[color= #000000;]<S[color= #000000;]> l2 [color= #000000;]);

 

	[color= #007f00;]// subtract l1 line from l2 line and return the difference

	[color= #007f00;]// return line object, otherwise null

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]static Line2D[color= #000000;]<S[color= #000000;]> Subtract [color= #000000;]( Line2D[color= #000000;]<S[color= #000000;]> l1, Line2D[color= #000000;]<S[color= #000000;]> l2 [color= #000000;]);

 

	[color= #0000ff;]bool equal   [color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Line2D[color= #000000;]<T[color= #000000;]> l [color= #000000;]);

	[color= #0000ff;]bool Notequal[color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Line2D[color= #000000;]<T[color= #000000;]> l [color= #000000;]);

[color= #000000;]};

3 - الفئه Rectangle : و تمثل مربع او مستطيل داخل نظام الإحداثيات

 

[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename T[color= #000000;]>

[color= #0000ff;]class Rectangle

[color= #000000;]{

[color= #0000ff;]public[color= #000000;]:

	[color= #007f00;]// rectangle points

	Point2D[color= #000000;]<T[color= #000000;]> top, bottom, left, right;

 

	[color= #007f00;]// check if passed point fall in current rectangle

	[color= #007f00;]// return true if it is, false otherwise

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]bool  IsPointInRect [color= #000000;]( Point2D[color= #000000;]<S[color= #000000;]> p[color= #000000;]);

 

	[color= #007f00;]// check if passed line fall in current rectangle

	[color= #007f00;]// if the line points is two of rectangle points the function will return true

	[color= #007f00;]// return true if it is, false otherwise

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]bool  IsLineInRect [color= #000000;]( Line2D[color= #000000;]<S[color= #000000;]> l[color= #000000;]);

 

	[color= #007f00;]// get rectangle center point

	[color= #007f00;]// in physics called center of gravity

	[color= #007f00;]// return Point2D object, otherwise false

	Point2D[color= #000000;]<T[color= #000000;]> getCenterPoint[color= #000000;]([color= #000000;]);	

 

 

	[color= #007f00;]// return rectangle absloute height

	[color= #0000ff;]float getHeight[color= #000000;]([color= #000000;]);

	[color= #007f00;]// return rectangle absloute width

	[color= #0000ff;]float getWidth[color= #000000;]([color= #000000;]);

 

	[color= #007f00;]// is current rectangle is valid rectangle

	[color= #007f00;]// return true if it is, false otherwise

	[color= #0000ff;]bool  IsValid[color= #000000;]([color= #000000;]);

 

	[color= #007f00;]// get circle that current rectangle points are fall in its edge

	[color= #007f00;]// in other word circle the our rectangle will fall in

	[color= #007f00;]// remember that circle is always a circle not an ellipse so if the rectangle is

	[color= #007f00;]// not square the returned circle will contained the rectangle but the rectangle

	[color= #007f00;]// points may not be in circle edge.

	[color= #007f00;]//

	[color= #007f00;]// return circle object, null otherwise

	Circle[color= #000000;]<T[color= #000000;]> getBoundCircle[color= #000000;]([color= #000000;]);

 

	[color= #0000ff;]bool equal   [color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Rectangle[color= #000000;]<T[color= #000000;]> p [color= #000000;]);

	[color= #0000ff;]bool Notequal[color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Rectangle[color= #000000;]<T[color= #000000;]> p [color= #000000;]);

[color= #000000;]};

4 - الفئه Circle : و تمثل دائره داخل نظام الإحداثيات

 

[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename T[color= #000000;]>

[color= #0000ff;]class Circle

[color= #000000;]{

[color= #0000ff;]public[color= #000000;]:

	[color= #007f00;]// center point of circle

	[color= #007f00;]// also it is the center of gravity

	[color= #007f00;]// because this type represent a perfect circle

	Point2D[color= #000000;]<T[color= #000000;]> center;

	[color= #007f00;]// circle radius

	T          Radius;

 

	[color= #007f00;]// check if passed point is fall in current circle (circle edges are part of circle)

	[color= #007f00;]// return true if it is, false otherwise

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]bool IsPointInCircle[color= #000000;]( Point2D[color= #000000;]<S[color= #000000;]> p [color= #000000;]);

 

	[color= #007f00;]// check if passed line touch the circle edge in one point

	[color= #007f00;]// return true if it is, false otherwise

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]bool IsLineTangent [color= #000000;]( Line2D[color= #000000;]<S[color= #000000;]> l [color= #000000;]);

 

	[color= #007f00;]// check if passed line is intersect current circle in any point

	[color= #007f00;]// return true if it is, false otherwise

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]bool IsLineIntersect [color= #000000;]( Line2D[color= #000000;]<S[color= #000000;]> l [color= #000000;]);

 

	[color= #007f00;]// get intersect points if intersection exist

	[color= #007f00;]// return array of 2 or 1 point(s) depend on intersection

	[color= #007f00;]// otherwise null array

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	Point2D[color= #000000;]<S[color= #000000;]>[color= #000000;][[color= #000000;]] getIntersectPoint [color= #000000;]( Line2D[color= #000000;]<S[color= #000000;]> l [color= #000000;]);

 

	[color= #007f00;]// return circle circumference

	[color= #0000ff;]float getCircumference[color= #000000;]([color= #000000;]);

	[color= #007f00;]// return circle area

	[color= #0000ff;]float getArea[color= #000000;]([color= #000000;]);

 

	[color= #007f00;]// get rectangle that contains current circle

	[color= #007f00;]// because of the circle is always a prefect

	[color= #007f00;]// circle that output object always a square

	[color= #007f00;]//

	[color= #007f00;]// return rectangle object, null otherwise

	Rectangle[color= #000000;]<T[color= #000000;]> getBoundRect[color= #000000;]([color= #000000;]);

 

	[color= #0000ff;]bool equal   [color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Circle[color= #000000;]<T[color= #000000;]> p [color= #000000;]);

	[color= #0000ff;]bool Notequal[color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Circle[color= #000000;]<T[color= #000000;]> p [color= #000000;]);

[color= #000000;]};

5 - النوع Triangle : و هو يمثل مثلث داخل نظام الإحداثيات

 

[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename T[color= #000000;]>

[color= #0000ff;]class Triangle

[color= #000000;]{

[color= #0000ff;]public[color= #000000;]:

 

	[color= #007f00;]// triangle points

	Point2D[color= #000000;]<T[color= #000000;]> p1, p2, p3;

 

	[color= #007f00;]// get current triangle area

	T getArea[color= #000000;]([color= #000000;]);

 

	[color= #007f00;]// check if passed point is fall in current triangle

	[color= #007f00;]// return true if it is, otherwise false

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]>

	[color= #0000ff;]bool IsPointInTringle[color= #000000;]( Point2D[color= #000000;]<S[color= #000000;]> p[color= #000000;]) const;

 

	[color= #007f00;]// get Triangle center point

	[color= #007f00;]// in physics called center of gravity

	[color= #007f00;]// return Point2D object, otherwise false

	Point2D[color= #000000;]<T[color= #000000;]> getCenterPoint[color= #000000;]([color= #000000;]);	

 

	[color= #007f00;]// get angle between two lines of current triangle

	[color= #007f00;]// pass triangle points in various way to get your desire angle

	[color= #007f00;]// return the angle in success, otherwise -1 if faild

	[color= #0000ff;]float getAngleBetween [color= #000000;]( Point2D[color= #000000;]<T[color= #000000;]> line1_End_point, Point2D[color= #000000;]<T[color= #000000;]> Line2_End_point, 

				Point2D[color= #000000;]<T[color= #000000;]> intersect_point [color= #000000;]);

 

	[color= #007f00;]// check if current triangle is valid triangle

	[color= #007f00;]// return true if it is, otherwise false

	[color= #0000ff;]bool IsValid[color= #000000;]([color= #000000;]);

 

	[color= #007f00;]// get rectangle that contain current triangle

	[color= #007f00;]// return rectangle object, otherwise null

	Rectangle[color= #000000;]<T[color= #000000;]> getBoundRect[color= #000000;]([color= #000000;]);

 

	[color= #007f00;]// get circle that contain current triangle

	[color= #007f00;]// return circle object, otherwise null

	Circle[color= #000000;]<T[color= #000000;]> getBoundCircle[color= #000000;]([color= #000000;]) const;

 

	[color= #0000ff;]bool equal   [color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Triangle[color= #000000;]<T[color= #000000;]> p [color= #000000;]);

	[color= #0000ff;]bool Notequal[color= #000000;]( [color= #000000;][IN, BYREF[color= #000000;]] Triangle[color= #000000;]<T[color= #000000;]> p [color= #000000;]);

[color= #000000;]};

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 29 سبتمبر 2009 في 19:40

مدونتي: C++ Tips and Tricks

#52

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

اقتباس
نحن الأن نتكلم عن الرياضيات و ليس الرسم. سيكون من الصعب استخدام نظام احداثيات الشاشه اثناء محاولة تضمين دوال كل نوع.

اذا كنا نتحدث عن الرياضيات فانا مع الاخ محمد علاء.

Point2D<T> getPerpendicularPoint( Line2D<T> l );

هذه العمليه لا داعي لها فيمكنك ايجاد نقطه التعامد باستخدام داله ايجاد نقطه التقاطع - ان كنت قد فهمت معناها بشكل جيد-

اقتباس
أوافق عليها .. أما الدالة perpSlop لم أفهمها

بالنسبه لهذه الداله فقد كنت اقصد ايجاد ميل العمود على الخط الحالي المعلوم ميله باستخدام المعادله:

m1.m2 = -1

حيث m1 ميل العمود الأول

m2 ميل العمود الثاني

ولكن كما قال الاخ محمد علاء ربما لن يكون لها فائده لذلك يمكن حذفها.

نقطه اخيره:

اقتباس
الأفضل أثناء كتابة Specification ( المواصفات) لكل كلاس .. أن نلتزم بأن يكون الكود موجّه لجميع المبرمجين وليس مكتوب بطريقة لايفهمها الا مبرمجي السي بلس ( يوجد لدينا جافويون أيضا )

أنا افهم C++ قليلا ولكني لا افهم كل شيء لذلك أرجو شرح

  template <typename S>

أو استخدام شيء ابسط منها.

تم تعديل هذه المشاركة بواسطة muqawem في 29 سبتمبر 2009 في 23:19

#53
Point2D<T> getPerpendicularPoint( Line2D<T> l );

اقتباس
هذه العمليه لا داعي لها فيمكنك ايجاد نقطه التعامد باستخدام داله ايجاد نقطه التقاطع - ان كنت قد فهمت معناها بشكل جيد-

نعم لقد فهمت معناها بشكل جيد اخى muqawem و كلامك فعلا صحيح حيث مع وجود الداله IsPerpendicular و الداله getIntersectPoint يصبح وجود الداله getPerpendicularPoint مجرد تكرار لا داعى منه.

الداله perpSlop قمت بإضافتها فعلا و هى الداله getLineSlope حيث انك تريد الـ slope للخط العمودى على الخط الحالى فهذا يعنى وجود الخط العمودى و الذى يعنى ايضا امكانية استدعائك للداله getLineSlope لهذا الخط.

  template <typename S>

قبل شرح معنى السطر السابق اريد ان اريك كيف سيتم استخدامه للنوع خط على سبيل المثال

 

	Line2D[color= #000000;]<[color= #0000ff;]float[color= #000000;]> line;

كما تلاحظ وضعنا بين اسم النوع Line2D اسم النوع float بين قوسين.

المقصود من الكلمه template ان النوع الذى يلى هذه الكلمه و هو فى مثالنا هنا Line2D سيتم تمرير نوع العناصر الخاصه به بشكل ديناميكى و هذا النوع الذى سيتم تمرير سيتم كتابته بدلا من typename T حيث يمكنك تجاهل الكلمه typename فلا مجال لشرحها هنا اما الحرف T فيمثل النوع الذى سيتم تمرير بين القوسين و الذى بدوره سيقوم المترجم بإبدال الكلمه T بالنوع الذى تم تمريره.

يمكنك اعتبار الـ template مثل الـ generics داخل الدوت نت

ان كان الشرح سيئ و هو فى الأغلب كذلك فأرجو ان تعذرنى، و لكن لا يوجد بديل يمكن استخدامه بدلا من الـ templates.

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#54
اقتباس
رأيي أن نعتمد على النظام القياسي للكومبيوتر (الزاوية العليا اليسرى)، فقط لنتجنب أي مشاكل قد تكون مختبئة في المستقبل خاصة إن هنالك تقنيات أخرى بجانب D3D و OpenGL يمكن أن لا تمتلك خيار تغيير نقطة الأصل، ما تعليق مطوّري Java و J2ME على ذلك؟

شخصياً، تعوّدت على هذا النظام لأنه مستخدم منذ زمن MSX صخر

اقتباس
بالطبع نظام الإحداثى الديكارتى للأشكال ثنائية البعد، و لمن لا يعرفه ففيه Y تزيد لاعلى و تنقص لأسفل.

نحن الأن نتكلم عن الرياضيات و ليس الرسم. سيكون من الصعب استخدام نظام احداثيات الشاشه اثناء محاولة تضمين دوال كل نوع.

اقتباس
اذا كنا نتحدث عن الرياضيات فانا مع الاخ محمد علاء.

كما قال الاخ SandHawk ، الافضل هو استخدام (الزاوية العليا اليسرى) كنقطة اصل للاحداثيات .. أي قيم المحور الصادي تزيد كلما اتجهنا لاسفل في مجال الرسوميات .

لكن من الممكن أن نتغاضى عن هذه الان .. الى أن يأتي دور الرسم ، لنرى مايمكننا فعله .

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

اقتباس
و لكن لا يوجد بديل يمكن استخدامه بدلا من الـ templates.

من الافضل كتابتها هكذا حتى تكون واضحة للجميع :

class Point2D <T>
{
T t;
{

اقتباس
ارجو وضع شرح و لو بسيط لنظام الملاحظات الذى سنتبعه لإنى لا اعرفه.

يوجد مثال في اول مشاركة .. عموما .. كتابتك للتوصيف في المشاركة 51 ممتاز .. المهم ان يكون واضح .

والشكر موصول للاخ محمد على المشاركة القيمة رقم 51 . :)

- بالنسبة للدالة التي اقترحها الاخ hunter :

//@ purpose:  calculate the y-intercept of the current line
//@ Parameters:
-point:  any point that belong to the line

   //@ return: the y-intercept
float getYintercept (Point2D point);

هل نضيفها للمواصفات ؟ .. لا أرى حتى الان أي اعتراض .. لذلك ساضيفها .

- اخر نقطة :

@ Rectangle :

الاخ سلوان اقترحها بهذا الشكل :

struct Rectangle
{
T top;
T bottom;
T left;
T right;

}

وهو أكثر مقروئية .. واسهل عند العمل عليه من وجهة نظر شخصية ... بينما تعديل الاخ محمد علاء الاخير :

class Rectangle
{
Point2D<T> top, bottom, left, right;
}

لا أرى أنه يصلح هكذا .. لانه سيحمل قيم مكررة بدون فائدة ، اي أننا أمام مستطيل له أربع نقاط .. الان top هي أي نقطة .. هل هي النقطة اليمين العلوية أو الشمال العلوية ؟

لذلك من الافضل أن يبدو الامر هكذا :

class Rectangle
{
Point2D<T> upperLeft,lowerRight
}

ولكن كما قلت .. ارى أن طريقة الاخ سلوان أفضل ، ولكن الاخ محمد يحاول ان يستفيد من Point2D لتسهيل العمل عندما نحتاج الى Rectangle معرّف على شكل نقاط Point2D .

لذلك وحتى نجمع بين القولين :) ، نكتب :

class Rectangle
{
T top;
T bottom;
T left;
T right;

// purpose : get the upper left corner of this rectangle as new point and return it .
//return : new point with x value = left and y value = top
[ByVal] Point2D<T> getUpperLeftPoint();
// purpose : get the lower right corner of this rectangle as new point and return it .
//return : new point with x value = right and y value = bottom
[ByVal] Point2D<T> getLowerRightPoint();
}

تم تعديل هذه المشاركة بواسطة الشمري في 30 سبتمبر 2009 في 00:51

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#55

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

- سنقوم بعمل Aliasing للنوع Uint32 و سنتعامل معه على مستوى البت، ايضا سنقوم بعمل بعض الدوال التى تسهل التعامل مع هذا النوع، الذى سنطلق عليه HErorr (بالطبع يمكن تغييره لاحقا).

- كل القيم المعاده من الدوال ستكون HError و القيمه الفعليه عليه التى كان سيتم اعادتها من الداله سيتم تمريرها من خلال اخر معامل بمعنى انظر هذه الداله قبل استخدام الـ HError

 

	Point2D[color= #000000;]<T[color= #000000;]> getCenterPoint[color= #000000;]([color= #000000;]);

الداله السابقه ستصبح كالتالى بعد استخدام HError

 

	HError getCenterPoint[color= #000000;]([color= #000000;][out, retval[color= #000000;]] Point2D[color= #000000;]<T[color= #000000;]> p[color= #000000;]);

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

- انا كنت افضل تضمين دوال HError كـ Macros و لكن الأخ الشمرى قال دوال .. يبقى دوال :D

- الثوابت و اسماء الدوال الخاصه بـ HError ستجدها فى الملف الملف HError_Helper.h.

- الثوابت و ارقام الخطأ و ارقام الفئات الموجوده بالمحرك، كذلك ارقام النواه الموجودين بالمحرك ستجدهم بالملف Engine_Codes.h

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

يحتوى النوع HError على 5 مجموعات من الأرقام

- المجموعه الأولى : و مساحتها 1 بت و تمثل نوع الخطأ هل هو نجاح ام فشل.

- المجموعه الثانيه : و مساحتها 1 بت و تمثل درجة الفشل هل هى تحذير ام خطأ قاتل فالتحذير يعنى على سبيل المثال ان الداله التى قامت بإظهار هذا الخطأ هى Obsolete اما حالة خطأ قاتل فهى على سبيل المثال محاولة الدخول على مكان بالذاكره لا يتبع البرنامج او لا توجد مساحه كافيه بالذاكره و هكذا.

- المجموعه الثالثه : و مساحتها 4 بت و تمثل رقم النواه التى ظهر منها الخطأ مثل النواه Kernal او النواه Physcis او النواه Math او Graphics .. و هكذا

- المجموعه الرابعه: و مساحتها 8 بت و تمثل رقم الفئه الموجوده بالنواه التى رقمها موجود بالمجموعه 2 و التى قامت بإحداث الخطأ.

- المجموعه الخامسه : و مساحتها 18 بت و تمثل رقم الخطأ.

هذا شكل النوع HError

 

[color= #007f00;]#ifndef HERROR_HELPER_H

[color= #007f00;]#define HERROR_HELPER_H

 

[color= #007f00;]// error status is success

[color= #0000ff;]const [color= #0000ff;]int ErrorStatus_Success  [color= #000000;]= [color= #ff0000;]0;

[color= #007f00;]// error status is failed

[color= #0000ff;]const [color= #0000ff;]int ErrorStatus_Failed   [color= #000000;]= [color= #ff0000;]1;

 

[color= #007f00;]// failed code is warning

[color= #0000ff;]const [color= #0000ff;]int Failed_Warnning [color= #000000;]= [color= #ff0000;]0;

[color= #007f00;]// failed code is fatal error

[color= #0000ff;]const [color= #0000ff;]int Failed_Fatal [color= #000000;]= [color= #ff0000;]1;

 

[color= #0000ff;]struct HError

[color= #000000;]{

	HError[color= #000000;]([color= #0000ff;]unsigned [color= #0000ff;]int value[color= #000000;]);

 

	[color= #0000ff;]void setErrorStatus[color= #000000;]([color= #0000ff;]int ID[color= #000000;]);

	[color= #0000ff;]void setFailedType[color= #000000;]([color= #0000ff;]int ID[color= #000000;]);

	[color= #0000ff;]void setCore[color= #000000;]([color= #0000ff;]int ID[color= #000000;]);

	[color= #0000ff;]void setTypeID[color= #000000;]([color= #0000ff;]int ID[color= #000000;]);

	[color= #0000ff;]void setErrorNumber[color= #000000;]([color= #0000ff;]int ID[color= #000000;]);

 

	[color= #0000ff;]int  getErrorStatus[color= #000000;]([color= #000000;]);

	[color= #0000ff;]int  getFailedType[color= #000000;]([color= #000000;]);

	[color= #0000ff;]int  getCore[color= #000000;]([color= #000000;]);

	[color= #0000ff;]int  getTypeID[color= #000000;]([color= #000000;]);

	[color= #0000ff;]int  getErrorNumber[color= #000000;]([color= #000000;]);

 

	[color= #007f00;]// return getErrorStatus

	[color= #007f00;]// used to compare with ErrorStatus_* constant

	operator [color= #0000ff;]int[color= #000000;]([color= #000000;]);

 

[color= #0000ff;]private[color= #000000;]:

	[color= #0000ff;]unsigned [color= #0000ff;]int err_value;

[color= #000000;]};

 

[color= #007f00;]#endif // HERROR_HELPER_H

و هذه هى بعض الأكواد التى وضعتها للنواه الخاصه بالنظام

 

[color= #007f00;]#ifndef ENGINE_CODES_H

[color= #007f00;]#define ENGINE_CODES_H

 

[color= #0000ff;]const [color= #0000ff;]int Core_Kernal   [color= #000000;]= 0x1;

[color= #0000ff;]const [color= #0000ff;]int Core_Math     [color= #000000;]= 0x2;

[color= #0000ff;]const [color= #0000ff;]int Core_Physics  [color= #000000;]= 0x3;

[color= #0000ff;]const [color= #0000ff;]int Core_Graphics [color= #000000;]= 0x4;

[color= #0000ff;]const [color= #0000ff;]int Core_AI       [color= #000000;]= 0x5;

 

 

[color= #0000ff;]const [color= #0000ff;]int Core_Kernal_Files   [color= #000000;]= 0x1;

 

 

[color= #0000ff;]const [color= #0000ff;]int Core_Math_Math      [color= #000000;]= 0x1;

[color= #0000ff;]const [color= #0000ff;]int Core_Math_Point2D   [color= #000000;]= 0x2;

[color= #0000ff;]const [color= #0000ff;]int Core_Math_Line2D    [color= #000000;]= 0x3;

[color= #0000ff;]const [color= #0000ff;]int Core_Math_Rect      [color= #000000;]= 0x4;

[color= #0000ff;]const [color= #0000ff;]int Core_Math_Circle    [color= #000000;]= 0x5;

[color= #0000ff;]const [color= #0000ff;]int Core_Math_Triangle  [color= #000000;]= 0x6;

[color= #0000ff;]const [color= #0000ff;]int Core_Math_Vector2D  [color= #000000;]= 0x7;

[color= #0000ff;]const [color= #0000ff;]int Core_Math_Matrix3x3 [color= #000000;]= 0x8;

 

[color= #007f00;]#endif // ENGINE_CODES_H

فى مشاركه سابقه قام الأخ muqawem بالتنبيه ان الداله getPerpendicularPoint الموجوده بالنوع Line2D اصبح وجودها لا داعى منه و يوجد بديل افضل، و على اعتبار ان المحرك فى الإصدار الثانى له فبالتالى لا يمكن التعديل على الواجهه الخاصه به و لكن كل ما يمكننا عمله هو تحديد ان هذه الداله Obsolete و هذا الأمر قد يتم كالتالى

 

HError getPerpendicularPoint[color= #000000;]( Line2D[color= #000000;]<T[color= #000000;]> l, Point2D[color= #000000;]<T[color= #000000;]> retval[color= #000000;])

[color= #000000;]{

	retval [color= #000000;]= null;

 

	HError hError;

 

	hError.[color= #808000;]setErrorStatus [color= #000000;]( ErrorStatus_Failed [color= #000000;]);

	hError.[color= #808000;]setFailedType [color= #000000;]( Failed_Warnning [color= #000000;]);

	hError.[color= #808000;]setCore [color= #000000;]( Core_Math [color= #000000;]);

	hError.[color= #808000;]setTypeID [color= #000000;]( Core_Math_Line2D [color= #000000;]);

	hError.[color= #808000;]setErrorNumber [color= #000000;]( 0x1 [color= #000000;]); [color= #007f00;]// this number will mean method is Obsolete

 

	[color= #0000ff;]return hError;

[color= #000000;]}

و لإختبار حالة الداله بعد الإستدعاء كالتالى

 

 

Line2D[color= #000000;]<[color= #0000ff;]float[color= #000000;]> l;

Point[color= #000000;]<2D[color= #000000;]> p;

 

HError ret [color= #000000;]= l.[color= #808000;]getPerpendicularPoint[color= #000000;](p[color= #000000;]);

 

[color= #0000ff;]if [color= #000000;]( ret [color= #000000;]== ErrorStatus_Failed [color= #000000;])

[color= #000000;]{

	[color= #0000ff;]if [color= #000000;]( ret.[color= #808000;]getFailedType[color= #000000;]([color= #000000;]) [color= #000000;]== Failed_Fatal [color= #000000;])

		[color= #007f00;]// shutdown the application immediately

	[color= #0000ff;]else

		[color= #007f00;]// error is warning, get the error code and see what it mean

[color= #000000;]}

توجد العديد من الأفكار و الأساليب الخاصه بهذا النوع من تتبع الأخطاء و لكن لا يسعنى الوقت لشرحهم جميعا (على سبيل المثال لم اصنع GetLastError و SetLastError خاصه بالمكتبه مع انها ستنفع) و ايضا نظام اظهار رسائل الخطأ و التعامل معهم.

فى المرفقات الكود الخاص بـ HError كذلك الملف Engine_Codes.h و ملف الـ main الذى يحتوى على اختبار لـ HError

Test_HError.rar

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 30 سبتمبر 2009 في 01:01

مدونتي: C++ Tips and Tricks

#56
اقتباس
ولكن كما قلت .. ارى أن طريقة الاخ سلوان أفضل ، ولكن الاخ محمد يحاول ان يستفيد من Point2D لتسهيل العمل عندما نحتاج الى Rectangle معرّف على شكل نقاط Point2D .

لذلك وحتى نجمع بين القولين ، نكتب :

...

ولكن ال Set يجب أن تكون لنقطتين فقط Upper Left و ال Lower Right، يعني كل إثنين نقطة وليست أربع قيم منفصله

بمعنى أوضح لإنشاء مربع يتم إدخال نقطتين!

#57
اقتباس
بمعنى أوضح لإنشاء مربع يتم إدخال نقطتين!

نعم .. الصيغة النهائية ستكون هكذا :

( مثال على int ) :

class Rectangle
{
// هذه قيم وليست نقاط .. من يريد يستخدم نقاط ينظر الى الدوال في الاسفل
int top;
int bottom;
int left;
int  right;

// purpose : get the upper left corner of this rectangle as new point and return it .
//return : new point with x value = left and y value = top
[ByVal] Point2D<T> getUpperLeftPoint();
// purpose : get the lower right corner of this rectangle as new point and return it .
//return : new point with x value = right and y value = bottom
[ByVal] Point2D<T> getLowerRightPoint();

setUpperLeftPoint([IN] Point2D point)
setLowerRightPoint([IN] Point2D point)
}

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#58
الشمري كتب:
class Rectangle
{
Point2D<T> upperLeft,lowerRight
}

هذا فعلا ما اقصده و لكن كتبتها بشكل خاطى.

float getYintercept (Point2D point);

ما الهدف منها حيث انى لم افهم الشرح جيدا ؟

الأفضل داخل المستطيل استخدام النوع Point2D حيث اننا قد نحتاج لإستخدام بعض الدوال بداخله و بالتالى سنحتاج لإنشاء نسخه مؤقته منه للتعامل معه نفس الكلام سيتكرر مع بعض الدوال الاخرى داخل المستطيل.

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#59
اقتباس
- كل القيم المعاده من الدوال ستكون HError و القيمه الفعليه عليه التى كان سيتم اعادتها من الداله سيتم تمريرها من خلال اخر معامل بمعنى انظر هذه الداله قبل استخدام الـ HError

هنا أتوقف كثيرا ..

تعرف أننا سنخسر كثيرا ميزة اعادة الكائن من خلال return بدلا من البارمتر .

أفضّل أن أكتب شيء كهذا :

print (image.getCenter().x )
بدلا من هذا 
Point p;
image.getCenter(p);
print p.x

لذلك وكحل وسط .. اقترح أن يكون هناك طريقة اخرى غيراعادة الخطأ عن طريق return .. مثلا نستخدم كائن لاستقبال الاخطاء وتكديسها .. ويمكنها أن تحوي على دالة لاعادة اخر خطأ حصل .. ودالة لاعادة الخطأ المقترن باسم دالة معينة ( الخطأ الذي وقع بسبب الدالة XYZ) .

يمكننا أن نستفيد أمرين :

- لانستخدم استثناءات .. ونتحاشى عيوبها مع لغة السي بلس .

- لانعيد الاخطاء عن طريق RETURN بل يوجد كائن يحمل الاخطاء ويقتنصها ويديرها ويعيدها لنا بشكل جميل عن الطلب .

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

تم تعديل هذه المشاركة بواسطة الشمري في 30 سبتمبر 2009 في 01:15

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#60
اقتباس
هنا أتوقف كثيرا ..
\

توقف أكثر بكثير

لأن فعلا الخسارة سوف تكون كبيره.

اقتباس
لذلك وكحل وسط .. اقترح أن يكون هناك طريقة اخرى غيراعادة الخطأ عن طريق return .. مثلا نستخدم كائن لاستقبال الاخطاء وتكديسها .. ويمكنها أن تحوي على دالة لاعادة اخر خطأ حصل .. ودالة لاعادة الخطأ المقترن باسم دالة معينة ( الخطأ الذي وقع بسبب الدالة XYZ) .

أو من الممكن (كإقتراح آخر) إضافة باراميتر (إختياري) من أجل إرجاع الأخطاء فيه.

مثلا:

Point2D<T> p getCenterPoint([out, retval] HError err);
#61
اقتباس
الأفضل داخل المستطيل استخدام النوع Point2D حيث اننا قد نحتاج لإستخدام بعض الدوال بداخله و بالتالى سنحتاج لإنشاء نسخه مؤقته منه للتعامل معه نفس الكلام سيتكرر مع بعض الدوال الاخرى داخل المستطيل.

يمكنك استخدام الدالتين getUpperLeftPoint و getLowerRightPoint ، وممكن تكونان inline .. حيث طريقة الاخ سلوان أسهل في أحيان كثيرة مثل :

هذه اكثر مقروئية
if(point.x > rect.left && point.x < rect.right )
if(point.y > rect.top && point.y < rect.bottom )
there is collision .

هذه تحدث التباس على قارئ الكود
if(point.x > rect.upperLeft.x && point.x < rect.lowerRight.x)
if(point.y > rect.upperLeft.y && point.y < rect.lowerRight.y)
there is collision .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#62
اقتباس
أو من الممكن (كإقتراح آخر) إضافة باراميتر (إختياري) من أجل إرجاع الأخطاء فيه.

اقتراح جيد اذا كان التنفيذ ممكن .. ولكن قد يكون يسبب اضافة بارمتر اضافي في كل دالة وهذا اراه غير مستساغ .

اذا كنا نستطيع أن نستخدام كائن مثل ErrorManager ( يكون متواجد بشكل دائم أثناء تهيئة المحرك ) ، ويكون هو المسؤال عن الاخطاء .. مثال :

Point2D<T> getPerpendicularPoint( Line2D<T> l)
{

retval = null;
HError hError;
hError.setErrorStatus ( ErrorStatus_Failed );
hError.setFailedType ( Failed_Warnning );
hError.setCore ( Core_Math );
hError.setTypeID ( Core_Math_Line2D );
hError.setErrorNumber ( 0x1 ); // this number will mean method is Obsolete

Manager.getErrorManager.addError(hError,"Lin2D.getPerpendicularPoint");
assert(false);

else
return point;
}

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

لاأعرف

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#63
اقتباس
يمكنك استخدام الدالتين getUpperLeftPoint و getLowerRightPoint ، وممكن تكونان inline .. حيث طريقة الاخ سلوان أسهل في أحيان كثيرة

اسهل فى كتابة الكود و يسهل قرائتها و اسرع فى التنفيذ ايضا.

انا مع طريقة الاخ سلوان.

اقتباس
أو من الممكن (كإقتراح آخر) إضافة باراميتر (إختياري) من أجل إرجاع الأخطاء فيه.

اقتراح افضل و هو بدل من اعادة القيمه بـ return اعادتها كمعامل.

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

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

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

اقتباس
اذا كنا نستطيع أن نستخدام كائن مثل ErrorManager ( يكون متواجد بشكل دائم أثناء تهيئة المحرك ) ، ويكون هو المسؤال عن الاخطاء

فكره ممتازه.

فعلا هذا ما نحتاج له ErroManager.

و لكن لى تعليق واحد عليه لا داعى لان يحتفظ بكل رسائل الخطأ يكفى اخر واحده فقط.

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

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

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 30 سبتمبر 2009 في 01:34

مدونتي: C++ Tips and Tricks

#64

بالنسبة للتعامل مع الأخطاء:

إن كنا سنتكلم عن الطريقة الصحيحة في ++C فتلك هي الإستثناءات، ولكن نظراً لطبيعة تطبيقات الزمن الحقيقي فإن الأداء يأتي في المرتبة الأولى بالتأكيد، exceptions أبطئ من إعادة رسائل خطأ، ليست أبطأ كثيراً ولكنها أبطأ على كل حال.

ولكن لا أحب تحديد طريقة واحدة ومنع الطريقة الأخرى تماماً، لأن الإثنين صحيحين لغوياً، ولكل منهم مزاياه:

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

- أما مزايا الإستثناءات فهي إنها تستطيع العمل من داخل مشيّد الصنف (constructor) وكذلك دوال الـ operators والـ functor في حين تعجز رسائل الخطأ عن ذلك، كذلك يمكن للإستثناء أيقاف البرنامج بالكامل إن لم يكن هنالك من تعامل مع الخطأ لذلك فهو مناسب للأخطاء الكبيرة أو غير المتوقعة، عيب الإستثناءات إنها أبطأ من رسائل الخطأ.

بدل إختيار أحدها، أقترح إعتماد التوصيات التالية:

1. تطبيق مبدأ الوقاية خير من العلاج عن طريق الوقاية ضد الأخطاء الشائعة، مثلاً استخدام المؤشرات الذكية بدل المؤشرات الإعتيادية أو كتابة/استخدام أكواد لا يمكن أن تسبب أي استثناءات exception-safe وهكذا.

2. استخدام رسائل الخطأ للأخطاء ذات الخطر المنخفض أو الأخطاء التي يمكن تكرّر حصولها كثيراً أو عندما يكون زمن التنفيذ مهم جداً (time critical) في الكود المعني.

3. استخدام الاستثناءات للأخطاء الكبيرة التي من النادر حصولها حسب ما يراه المطوّر، واستخدامها داخل المشيّدات عند الضرورة.

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

تم تعديل هذه المشاركة بواسطة SandHawk في 30 سبتمبر 2009 في 03:19

#65
اقتباس
كود

float getYintercept (Point2D point);

ما الهدف منها حيث انى لم افهم الشرح جيدا ؟

عن طريق هذه الداله سنوجد الجزء المقطوع من محور الصادات

#66

سؤال

هل من الممكن تعديل الدالة

void Move(T distance);

في الفئة Point2D إلى

void MoveToPoint (Point2D<T> point)

الايميل غير صحيح

يرجى تصحيح الايميل برسالة لأحد مدراء المنتدى

#67
ahmad_n3na3 كتب:
سؤال

هل من الممكن تعديل الدالة

void Move(T distance);

في الفئة Point2D إلى

void MoveToPoint (Point2D<T> point)

أظن أنه لايقصد أن يعمل setPoint ، لكن يقصد اضافة الى النقطة ..

مثال :

Point p(10,20);

p.move(5);

// now

// p.x = 15

// p.y = 25

أما MoveToPoint .. سنضيفها ولكن باسم setPoint .. وذلك من أجل توحيد طريقة التسمية .. بين الكلاسات

	
		 // add fixed distance to current point axises
	void move( T distance );


	   void setPoint([IN] Point2D other)

اقتباس
بدل إختيار أحدها، أقترح إعتماد التوصيات التالية:

1. تطبيق مبدأ الوقاية خير من العلاج عن طريق الوقاية ضد الأخطاء الشائعة، مثلاً استخدام المؤشرات الذكية بدل المؤشرات الإعتيادية أو كتابة/استخدام أكواد لا يمكن أن تسبب أي استثناءات exception-safe وهكذا.

2. استخدام رسائل الخطأ للأخطاء ذات الخطر المنخفض أو الأخطاء التي يمكن تكرّر حصولها كثيراً أو عندما يكون زمن التنفيذ مهم جداً (time critical) في الكود المعني.

3. استخدام الاستثناءات للأخطاء الكبيرة التي من النادر حصولها حسب ما يراه المطوّر، واستخدامها داخل المشيّدات عند الضرورة.

اذا ما رأيكم لو استخدمنا الاستثناءات في حزمة io ( الحزمة المسؤولة عن الملفات ) ، حيث أن الاخطاء قاتلة هنا ( لو لم يكن الملف موجود لن يعمل البرنامج ) ، وفي الغالب نحتاج لأن نقوم بالفحص في كل مرة نفتح الملف ، وفي حزمة الصور image ، حيث سنواجه مشاكل مع الصور الغير مدعومة أو تملك format غير مدعوم . وفي حال فحص الكائن هل هو NULL أو لا . اذا كان null ننشئ استثناء .

وبقية الامور نتركها لرسائل الأخطاء ..

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

لكن بالنسبة للاستثناء .. في السي بلس بلس يمكن أن نستخدم

#ifdef ANDALUS_USE_EXCEPTION
#define THROW(X) throw X
#else
#define THROW(X) 
#endif

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

تم تعديل هذه المشاركة بواسطة الشمري في 30 سبتمبر 2009 في 15:39

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#68

إقتراح

إذا من الممكن عمل overload لهذه الدالة

 void move( T distance );

وذلك إذا أردنا عمل زيادة غير خطية (linear) للنقطة

لتكون الدالة

 void move( T distanceX,T distansceY );

للعلم أنا أبني المحرك بالجافا J2SE

الايميل غير صحيح

يرجى تصحيح الايميل برسالة لأحد مدراء المنتدى

#69
اقتباس
للعلم أنا أبني المحرك بالجافا J2SE

سنقوم معاً ببناء نسخة الجافا J2SE ، حتى تكون نسخة موحدة .. سيتم توزيع المهام ، بعد أن ننتهي من المواصفات ان شاء الله .

بالنسبة للـ overload ، لايتم كتابته أثناء المواصفات ، يمكن للمبرمج أن يقوم بذلك وذلك بهدف عدم الاكثار من Specifications .

يا أخوان :

فقط لندفع الحوار للأمام :

- سنستخدم الاستثناءات في الجافا و لغات الدوت نت .

- في السي بلس :

- سنستخدم نظام رسائل الأخطاء في المحرك بشكل افتراضي ، ونستخدم كائن ErrorManager لتنظيم وقنص الاخطاء .

- سنستخدم الماكرو THROW الموضح في الأعلى ، في أجزاء المحرك الأخرى ( باستثناء الحزمة core) بالاضافة لرسائل الاخطاء .. حتى نعطي المبرمج الحرية باستخدام أي الطريقتين ، ويمكنه اعادة بناء المترجم لو أراد استخدم الاستثناءات ويقوم بتفعيل الاستثناءات .

سنقوم بهذا بشكل مؤقت حتى ننتهي من المحرك ثم نراجع هذا الموضوع بالتفصيل

void openImage( )

{

retval = null;

HError hError;

hError.setErrorStatus ( ErrorStatus_Failed );

hError.setFailedType ( Failed_Warnning );

hError.setCore ( Core_Image );

hError.setTypeID ( Core_Image_Open );

hError.setErrorNumber ( 0x1 ); // this number will mean Image Not Found

Manager.getErrorManager.addError(hError");

THROW( FileNotFoundException)

return Image;

}

تم تعديل هذه المشاركة بواسطة الشمري في 30 سبتمبر 2009 في 16:13

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#70

تقريباً المواصفات شبه مكتملة لأغلب الكلاسات :

Rectangle - Point2D - Line2D - Triangle - Circle - Math

سيتم تجميعها في ملفات نصية بسيطة ، ورفعها على svn واضافة الرةابط هنا ان شاء الله .

من الان ، يمكن الحديث عن الكلاس Vector2D ، اذا انتهينا منه ننتقل الى Matrix .

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

لايجب أن نكثر منها :) حتى لانضيع في مرحلة Implementation ، نركز على الأهم ونترك المهم :) ، حتى نحتاجه :-) .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#71

دائما اكون غير موجود فى وقت النقاش الجدى

اعرف ان النقاط التى سأتكلم عنها الان قد تم الحسم فيها و لكن يمكن اعتبار ما سأقوله فكره يمكن الإستعانه بها فى وقت اخر

اخ سلوان

مقاله مفيده جدا و افكار جميله.

لنتكلم عن الإستثناءات بشكل مختصر : يقوم المستخدم بالقسمه على الصفر فيقوم المترجم بتنفيذ العمليه فيقوم الـ CPU برمى استثناء (Hardware Exception) فيقوم نظام التشغيل بعمل raise للإستثناء فيقوم المترجم بمعالجة هذا الإستثناء (تحديد نوعه و احضار معلومات عنه من نظام التشغيل) و عمل احتواء له داخل الفئه الخاصه بهذا الإستثناء بعدها يقوم بالبحث عن الجزء المتعلق بالتعامل مع الإستثناء و هو الكود الموجود فى الأغلب عند catch.

يوجد نوعين من الإستثناءات و هم Hardware Exception و Software Exception، اما النوع الأول و الذى يقوم الـ CPU برميه مثل القسمه على الصفر و التعامل مع عنصر فى مصفوفه غير موجود او ما يسمى Index out of range و غيرهم.

ما اقوله ان نظام التشغيل يتيح لنا دوال التعامل مع الإستثناءات و بالتالى يمكن لنا بناء فئه خاصه بـ Fatal Exception او Hardware Exception حيث ان بعد حدوثها المحرك لن يعمل بشكل سليم و ستظهر نتائج غير متوقعه. اما غير ذلك من اخطاء فيمكن التعامل مع الـ Error Codes او يمكن استخدام الفئه الخاصه بالإستثناءات التى صنعنها حيث انها ستكون اسرع من نظام الإستثناءات داخل المترجم لإن وقتها نظام الإستثناءات داخل المترجم سيكون غير مفعل و نحن نستقبل الإستثناءات من نظام التشغيل مباشرة و نتعامل معه بإستخدام __try و __except و __finally.

بالطبع الكلام السابق نظرى اى لم يسبق لى تنفيذه و لكنى قرئته داخل الـ msdn و هذا مثال لـ handling OS Exceptions.

و هذا موضوع يتكلم بشكل مفصل عن التعامل مع الإستثناءات داخل نظام التشغيل.

اقتباس
أظن أنه لايقصد أن يعمل setPoint ، لكن يقصد اضافة الى النقطة ..

كلام صحيح اخى الشمرى فانا فعلا اقصد تحريك النقطه بشكل ثابت على محورى X و Y و بقيمه ثابته.

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#72

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

هناك نقطة أريد أن استوضحها

بالنسبة للفئة polygon

اقتباس
- أصناف ( Classes ) هذه المرحلة ومواصفات ( Specification ) كل صنف :

* Math

* Point2D

* Line2D

* Rectangle

* Circle

* Triangle

* Polygon

* Vector2D

* Matrix3

* Random

هل ستؤجل لما بعد ال Vector والMatrix

أما ليست مهمة لهذه المرحلة

الايميل غير صحيح

يرجى تصحيح الايميل برسالة لأحد مدراء المنتدى

#73

الفئة polygon تم تأجيلها لإضافتها لمحرك الرسم على ما اعتقد

مدونتي: C++ Tips and Tricks

#74

جزاك الله خيرا عل التوضيح

الايميل غير صحيح

يرجى تصحيح الايميل برسالة لأحد مدراء المنتدى

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

لايجب أن نكثر منها حتى لانضيع في مرحلة Implementation ، نركز على الأهم ونترك المهم، حتى نحتاجه :-)

حاولت قدر الإمكان جعلها بسيطه و حذفت منها كم كبيير من الدوال و ها هى

 

[color= #0000ff;]class Vector2

[color= #000000;]{

[color= #0000ff;]public[color= #000000;]:

	[color= #0000ff;]float x, y;

 

	Vector2[color= #000000;]([color= #000000;]);

	Vector2[color= #000000;]([color= #0000ff;]float coords[color= #000000;][[color= #ff0000;]2[color= #000000;]][color= #000000;]);

	Vector2[color= #000000;]([color= #0000ff;]float x, [color= #0000ff;]float y[color= #000000;]);

 

	Vector2 add     [color= #000000;]([color= #0000ff;]const Vector2 rhs[color= #000000;]);

	Vector2 subtract[color= #000000;]([color= #0000ff;]const Vector2 rhs[color= #000000;]);

	Vector2 muliply [color= #000000;]([color= #0000ff;]float scalar[color= #000000;]);

	[color= #0000ff;]float   multiply[color= #000000;]([color= #0000ff;]const Vector2 rhs[color= #000000;]);

 

	Vector2 add_chain     [color= #000000;]([color= #0000ff;]const Vector2 rhs[color= #000000;]); [color= #007f00;]// +=

	Vector2 subtract_chain[color= #000000;]([color= #0000ff;]const Vector2 rhs[color= #000000;]); [color= #007f00;]// -=

 

	[color= #0000ff;]bool equal   [color= #000000;]([color= #0000ff;]const Vector2 rhs[color= #000000;]);

	[color= #0000ff;]bool notequal[color= #000000;]([color= #0000ff;]const Vector2 rhs[color= #000000;]);

 

	[color= #0000ff;]void normalize[color= #000000;]([color= #000000;]); [color= #007f00;]// normalize vector

 

	[color= #0000ff;]float length[color= #000000;]([color= #000000;]); [color= #007f00;]// get vector length

	operator [color= #0000ff;]float[color= #000000;]*[color= #000000;]([color= #000000;]); [color= #007f00;]// get start point as array of floats

 

	Vector2 rotate[color= #000000;]([color= #0000ff;]float t[color= #000000;]); [color= #007f00;]// rotate vector

[color= #000000;]};
اقتباس
تقريباً المواصفات شبه مكتملة لأغلب الكلاسات :

Rectangle - Point2D - Line2D - Triangle - Circle - Math

سيتم تجميعها في ملفات نصية بسيطة ، ورفعها على svn واضافة الرةابط هنا ان شاء الله .

حيث ان المواصفات مكتوبه على هيئة pseudo code فلا داعى لوضعها على svn يمكن وضعها هنا كمرفقات و يقوم كل فريق بوضعها داخل الـ svn الخاصه بنسخة المشروع التى يعمل عليها كنسخه حقيقة جاهزه للتضمين.

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 30 سبتمبر 2009 في 20:57

مدونتي: C++ Tips and Tricks

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…