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

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

رائج
بدأه فريق الأندلس في 27 سبتمبر 2009 · 177 رد · 11,907 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#26

انا لا احبذ الوراثه داخل الفئات الرياضيه فهى ستعطى كود اضافى داخل الذاكره لا داعى له حيث اننا لن نقوم بعمل upcast او downcast من shape إلى circle و العكس

ايضا احب تذكير الاخوه ان هذا المحرك هو محرك العاب 2D و ليس 3D

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

 

[color= #0000ff;]struct Circle

[color= #000000;]{

   Vector2D center;

   [color= #0000ff;]double Radius;

[color= #000000;]};

كما تروا ان النوع Vector2D و مع انه اشمل و اعم من النقطه و لكن لا محل له من الإعراب داخل هذا النوع حيث بعد فتره من الزمن من الممكن ان تسأل نفسك ... لماذا استخدمت Vector بدلا من الـ Point مع ان الـ Point توضح المعنى اكثر.

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

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

#27

لا اعتقد ان استخدام Shape مجرد بيروقراطية كما قال الاخوان رغم اني احترم وجهة نظرهم

نحن نتكلم عن محرك و ليس عن بريمج صغير انظروا حولكم لجافا و لسي شارب و كيوت

و كمثال كائن الرسم في دوت نت يطلب فرشاة Brush وهناك عده انواع من الفراشي مثل

SolidBrush

TextureBrush

LinearGradientBrush

HatchBrush

و بالنهاية ستجد ان دالة الرسم تطلب فرشاة من نوع Brush و هو الفئة المجردة

public void FillPolygon( Brush brush,  PointF[] points,   FillMode fillMode)

:wink:

يجب ان يكون اساس المحرك جيد و صحي ليتم تحسينه و تطويره بشكل سلس

تحياتي

#28

ما هي الفكرة بالضبط من وراثة الاشكال الرياضية من shape؟ ماللذي سيحتوي عليه هذا الكلاس الاب لكل الاشكال؟

#29

أعتقد إن المكان الوحيد الذي تكون لوراثة الأشكال فائدة عملية فيه هو عند دخول الفيزياء في الموضوع، حيث جميع الأشكال ترث من Shape الذي يمتلك الخواص الفيزيائية المشتركة، ولكن ذلك مبكّر جداً للمناقشة، وعلى كل حال ستكون تلك مهمة محرك/مكتبة الفيزياء بمعزل عن محرّكنا.

اقتباس
الكلاسات Rectangle و Circle هي كلاسات موروثة من الكلاس Shape

لاننا سنحتاج لاحقا لرسم بعض الاشكال و بالتالي بدلا من تطبيق ال Overloading ستكون هناك دالة واحده للرسم ايا كان الشكل

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

ولذلك لن نحتاج إلى إجراء رسم أي شكل عدا المستطيل! ما رأيك؟ :happy:

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

بالنسبة للـ Quad فكما قلت سيعتمد على طريقة الرسم المتبعة في المحرك، انسوا أمره الآن. :)

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

كحل لمشكلة Point2D (ومشاكل أخرى مرتبطة :wink: ) ما رأيكم بإنشاء Template يتضمن عدداً من عناصر البيانات يتراوح بين 2 و 4، من أي نوع، بحيث يستخدم هذا الـ Template لتمثيل Point2D و Point3D وحتى Point4D بالـ float/int/double/... بهذا الشكل:

 
   typedef point2<float> Point2Df;
	typedef point2<int> Point2D;
	typedef point2<int> Sizei;
	typedef point2<float> Sizef;
	typedef point3<float> Point3Df;
	... etc

أعتقد إن Irrlicht حل المشكلة بطريقة مشابهه.

أما أنواع البيانات التي تتضمن عمليات خاصة مثل Vector فتلك تكتب مستقلة بالطبع.

تم تعديل هذه المشاركة بواسطة SandHawk في 28 سبتمبر 2009 في 04:55

#30
اقتباس
ما هي الفكرة بالضبط من وراثة الاشكال الرياضية من shape؟ ماللذي سيحتوي عليه هذا الكلاس الاب لكل الاشكال؟

اهلا بك اخي

وضحت الفكرة في ردي السابق

بالنسبة لكلامنا يعتمد على نظرة كل شخص فانا اتكلم عن المحرك الرسومي و اتكلم عن المربع و الدائرة كاشكال بالامكان رسمها

و بالتالي سيحتوي الكلاس على دوال عامة لكل الاشكال مثل دالة الرسم التي يتم اعادة تعريفها override

في كل كلاس

بعض الاخوان يتكلمون عن المربع فيزيائيا او مجرد تركيب struct من اربع نقاط مثل ماهو موجود في GDI وهنا لا حاجة للوراثة فعلا

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

ولذلك لن نحتاج إلى إجراء رسم أي شكل عدا المستطيل أصلاً! ما رأيك؟

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

طبعا اؤيدك في ان الكلام سابقا لوقته عن الرسم بما اننا نتكلم عن ال core

تحياتي

#31

ماشاء الله .. خلية نحل :) ..

اقتباس
و بالتالي سيحتوي الكلاس على دوال عامة لكل الاشكال مثل دالة الرسم التي يتم اعادة تعريفها override

في كل كلاسبعض الاخوان يتكلمون عن المربع فيزيائيا او مجرد تركيب struct من اربع نقاط مثل ماهو موجود في GDI وهنا لا حاجة للوراثة فعلا

بالظبط .. أعتقد هنا صارت الامور واضحة .

@ مقاوم :

اقتباس
أرجو تقبل اعتذاري على فصلي للمواضيع واكن بسبب تشتت افكاري .

لاتعتذر :) .. ستتضح الامور مع الوقت ..

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

الخطوة الاولى دائما هدفها استخراج Classes و Interfaces و Relations-ships .

@ سلوان :

اقتباس
أعتقد إن المكان الوحيد الذي تكون لوراثة الأشكال فائدة عملية فيه هو عند دخول الفيزياء في الموضوع، حيث جميع الأشكال ترث من Shape الذي يمتلك الخواص الفيزيائية المشتركة، ولكن ذلك مبكّر جداً للمناقشة، وعلى كل حال ستكون تلك مهمة محرك/مكتبة الفيزياء بمعزل

عن محرّكنا.

أوافقك تماما .

أما بالنسبة للـ Template فسنناقشها في الخطوة التالية .. عن كتابة مواصفات كل كلاس .

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#32
الكون كتب:
هذا الكلام يقودنا لمسألة مهمة عن المحرك هل سيكون المحرك ايزومتري فقط ام سيكون المحرك حاصل على جهاز عرض يوفر دوال رسم على الشاشة

طبعا اؤيدك في ان الكلام سابقا لوقته عن الرسم بما اننا نتكلم عن ال core

حالياً جميع الألعاب ثنائية الأبعاد على PC و XBOX و PS3 (على الأقل) الموجودة في السوق تستخدم مبدأ الرسم الأيزومتري، لسبب واحد، وهو الحصول على دعم بطاقة الشاشة الكامل وليس هنالك حل آخر، عندما ترسم يدوياً أي شكل حتى وإن كان مستطيلاً، فإنك تستخدم المعالج المركزي، وليس لكارد الشاشة دور إلا في عمليتي Blit و Flip. (أحد أسباب بطئ GameMaker؟)

ولكن لنؤجل النقاش في هذه النقطة لحين مناقشة الرسم. :D

#33

الخطوة الثانية :كتابة مواصفات Specification للأصناف Classes التي سيستخدمها المستخدم النهائي :

هذه الأصناف التي توصّلنا اليها ، وهي التي سنعتمدها في النسخة الأولى من المحرك للحزمة core

  • Math
  • Point2D
  • Line2D
  • Rectangle
  • Circle
  • Triangle
  • Polygon
  • Vector2D
  • Matrix3
  • Random

- جميعها كلاسات عادية Classes ولايوجد وراثة أو تعدد واجهات هنا .

- الان نريد كتابة مواصفات كل كلاس ، بحيث أن أي مبرمج بأي لغة برمجية سيفهم الهدف منها في الخطوة الثالثة بكتابة الكود .

- نتبع الترتيب الموضح في الأعلى ، أهم شيء أن يكون matrix و random في اخر القائمة لانهما أكثر الكلاسات تعقيد في هذه المرحلة .

- يتم كتابة الدوال Methods الخاصة بكل كلاس مع Members ويتم استثناء الدوال المعروفة مثل setters و getters ، وتم كتابة الاعضاء members , أيضا يتم في هذه المرحلة توضيح نوع كل Members .

- لايتم كتابةfunction overloading اذا لم تكن مهمّة ، للاحتفاظ بمساحة لدوال اخرى اهم .

- لايتم كتابة operator overloading كما هو في السي بلس ، انما يكتب كاسم مثل : دالة الضرب في المتجه هي ( multiply ) بدلا من علامة الضرب ( * ) وذلك لتوضيح المواصفات ، وعند عمل implementation ، نستخدم operator overloading في السي بلس ونستخدم أسماء methods المعتادة في الجافا .

تم تعديل هذه المشاركة بواسطة الشمري في 28 سبتمبر 2009 في 06:35

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#34

رأيي :) :

أول نقطة نحتاج للحديث عنها ، هي ما أثارها الاخ سلوان :

اقتباس
ما رأيكم بإنشاء Template يتضمن عدداً من عناصر البيانات يتراوح بين 2 و 4،

هل نستخدم Template أو Generic ؟

أوافق على هذا الاقتراح .

- الكلاس Math يحتوي الدوال التالية وكلها static ( لن أكتب المواصفات لأنها معروفة للجميع عمل كل دالة ) :

class Math

{

static double cos([iN] double value)

static double sin([iN] double value)

static double tan([iN] double value)

static double log([iN] double value)

static double sqrt([iN] double value)

static double floor([iN] double value)

static double ceil([iN] double value)

static double toDegrees([iN] double rad)

static double toRadian([iN] double degree)

}

- الكلاس Point2D يبدو بهذا الشكل :

class Point2D < T >

{

T x,y;

- Constructors

- Setters & Getters

// @Purpose : is this point equal to ( in the same location) other point

// @Parameters:

// - other : other point .

// @return :

// true : if this point is equal to other point .

// false : otherwise

boolean equals([iN] Point2D other)

// @Purpose : assign other point to this point ( make them equal)

// @Parameters:

// - other : other point .

void assign([iN] Point2D other)

}

@ ملاحظة : في السي بلس نستخدم Operator overloading أما الدوال الموجودة في الاعلى مثل assign فتستبدل بـ = ، أما equals فستسبدل بـ != و == .

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

اذا في اضافة على الكلاسين السابقين .. أو ننتقل الى Line2D Rectangle Circle .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#36

لماذا فئات ؟ لماذا لا تكون struct ?

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

داخل مكتبة الرياضيات لابد ان تتم المور بأسرع ما يمكن و بشكل بسيط و لنترك التعقيد لمحرك الفيزياء و الرسم.

اولا لا داعى لعمل accessor داخل الـ struct الموجوده بمحرك الرياضيات لإن الأعضاء public بالطبيعه و هذا يتيح التعامل معها بشكل مباشر.

الفئه Math

 

[color= #007f00;]#define PI       3.14159265358979323846

[color= #007f00;]#define E        2.71828182845904523536

 

[color= #007f00;]#define ToDegree(RAD) ((RAD * 180) / PI)

[color= #007f00;]#define ToRadian(DEG) ((DEG * PI ) / 180)

 

[color= #0000ff;]struct Math

[color= #000000;]{

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

[color= #000000;]};

و هذه هى النقطه

 

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

[color= #0000ff;]struct Point2D

[color= #000000;]{

	T x, y;

 

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

 

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

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

[color= #000000;]};

و هذا هو الخط

 

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

[color= #0000ff;]struct Line2D

[color= #000000;]{

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

 

	[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;]// is point in line

 

	[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;]// is line is part of me

 

	[color= #0000ff;]double getLineLenght[color= #000000;]([color= #000000;]) const;         [color= #007f00;]// get line size

 

        [color= #0000ff;]bool   IsStraightLine[color= #000000;]([color= #000000;]) const;        [color= #007f00;]// is line is straight line

 

	[color= #0000ff;]void   Increase[color= #000000;](T value[color= #000000;]);             [color= #007f00;]// increase line by fixed value

 

	[color= #0000ff;]void   Decrease[color= #000000;](T value[color= #000000;]);             [color= #007f00;]// decrease line by fixed value

 

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

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

[color= #000000;]};

و هذا هو المستطيل (شكل رباعى الأضلاع)

 

[color= #0000ff;]enum RectType

[color= #000000;]{

	Square.

	[color= #808000;]Rect,

	Parallelogram,

	Other

[color= #000000;]};

 

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

[color= #0000ff;]struct Rectangle

[color= #000000;]{

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

 

	[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;]) const;

 

	[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;]) const;

 

	[color= #0000ff;]double    getSize[color= #000000;]([color= #000000;]) const;

 

        RectType  getType[color= #000000;]([color= #000000;]) const;

 

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

	Tringle[color= #000000;]<T[color= #000000;]>[color= #000000;]* getBoundTringle[color= #000000;]([color= #000000;]) const;

 

	[color= #0000ff;]bool   equal   [color= #000000;]( Rectangle[color= #000000;]<T[color= #000000;]>[color= #000000;]& l[color= #000000;]);

	[color= #0000ff;]bool   Notequal[color= #000000;]( Rectangle[color= #000000;]<T[color= #000000;]>[color= #000000;]& l[color= #000000;]);

[color= #000000;]};

سأضع الباقين بعد العصر ان شاء الله

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

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

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

#37

و هذه هى الدائره

 

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

[color= #0000ff;]struct Circle

[color= #000000;]{

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

	T          Radius;

 

	[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;]) const;

 

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

	[color= #0000ff;]bool IsVectorTangent[color= #000000;]( Vector2D[color= #000000;]<S[color= #000000;]> v[color= #000000;]) const;

 

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

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

 

	T    getCircumference[color= #000000;]([color= #000000;]) const;

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

 

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

	Tringle[color= #000000;]<T[color= #000000;]>[color= #000000;]*   getBoundTringle[color= #000000;]([color= #000000;]) const;

 

	[color= #0000ff;]bool equal   [color= #000000;]( Circle[color= #000000;]<T[color= #000000;]>[color= #000000;]& c[color= #000000;]);

	[color= #0000ff;]bool Notequal[color= #000000;]( Circle[color= #000000;]<T[color= #000000;]>[color= #000000;]& c[color= #000000;]);

[color= #000000;]};

و هذا هو المثلث

 

[color= #0000ff;]enum TringleType

[color= #000000;]{

	Acute,

	Right,

	Obtuse,

[color= #000000;]};

 

[color= #0000ff;]enum AngleSide

[color= #000000;]{

	X,

	Y,

	Z

[color= #000000;]};

 

 

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

[color= #0000ff;]struct Tringle

[color= #000000;]{

	Point2D[color= #000000;]<T[color= #000000;]> x, y, z;

 

	[color= #0000ff;]template [color= #000000;]<[color= #0000ff;]typename S[color= #000000;]> [color= #007f00;]// return value always in radian

	S   getAngle[color= #000000;]( AngleSide side[color= #000000;]) const;

 

	TringleType getType[color= #000000;]([color= #000000;]) const;

 

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

 

	Tringle[color= #000000;]<T[color= #000000;]>[color= #000000;]* SplitFromAngle [color= #000000;]( AngleSide side, [color= #0000ff;]double splitAngle[color= #000000;]) const;

 

	[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;

 

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

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

 

	[color= #0000ff;]bool equal   [color= #000000;]( Tringle[color= #000000;]<T[color= #000000;]>[color= #000000;]& t[color= #000000;]);

	[color= #0000ff;]bool Notequal[color= #000000;]( Tringle[color= #000000;]<T[color= #000000;]>[color= #000000;]& t[color= #000000;]);

[color= #000000;]};

بالنسبه للنوع Polygon فلم اعرف كيف يمكن ان اصفه برمجيا حيث انه قد يكون مثلث او مربع او مستطيل او معين او convex، توجد العديد من الأشكال التى قد يطلق عليها polygon لذا يمكن جعلها base-class لهم جميعا، لهذا ساتركها لكم.

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

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

#38

.

اقتباس
أرجو اضافه ال constants :

PI

E

ك members داخل كلاس ال Math

ان شاء الله .. نسيتها .

اخ علاء :

لانريد استخدام ماكرو .. كل شيء داخل كلاس ، ونستخدم inline في السي بلس .

أما استخدام struct ، فلا أعرف .. عموما لا فرق .

لكن لدي سؤال حول RectType مافائدته بالظبط .

ولماذا Rectangle لانمثله بنقطتين بدلا من خط ؟

أسهل ..

. وبانتظار اراء بقية الاعضاء .

تم تعديل هذه المشاركة بواسطة الشمري في 28 سبتمبر 2009 في 17:58

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#39
اقتباس
لانريد استخدام ماكرو .. كل شيء داخل كلاس ، ونستخدم inline في السي بلس .

لا مشكله لقد اخذتها من كود قديم لدى و لكن يمكن تحويلها.

اقتباس
لكن لدي سؤال حول RectType مافائدته بالظبط .

هى معلومه اضافيه عن نوع الـ Rectangle، فهذا النوع قد يمثل اى شكل رباعى الأضلاع و بالتالى قد تحتاج فى وقت ما معرفة نوع الشكل المتاح معك و للإستخدام مثلا يوجد لديك النوع Circle و على افتراض انه قد تم تطويره ليدعم الـ Ellipse و قمت بإستدعاء الداله getBoundRect و من الـ Rect العائد قمت بإستدعاء الداله getType.

النوع العائد سيحدد لك نوع الدائره فمثلا إذا كان النوع العائد Rect فالدائره هى Ellipse اما اذا كان Square فالدائره هى دائره فعليه.

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

اقتباس
ولماذا Rectangle لانمثله بنقطتين بدلا من خط ؟

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

سأكمل باقى الأنواع بعد المغرب ان شاء الله

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

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

#40
اقتباس
اعرف ان وقت نقاش مكتبة الرياضيات قد انتهى و لكنى نسيت ذكر النوع Curve.

أرى أن نترك ال Curve لنسخة مستقبلية من المحرك، لأنه حسب تصوري ليس من السهل التعامل مع ال Curve يحتاج بعض المعرفه (لم أجرب ولكن حسبما أتوقع)

اقتباس
بالنسبه للنوع Polygon فلم اعرف كيف يمكن ان اصفه برمجيا حيث انه قد يكون مثلث او مربع او مستطيل او معين او convex، توجد العديد من الأشكال التى قد يطلق عليها polygon لذا يمكن جعلها base-class لهم جميعا، لهذا ساتركها لكم.

الPolygon هو ببساطة عبارة عن مصفوفة أو vector لمجموعه من النقاط حيث أن كل نقطة مع النقطة التي تليها تمثل خط.

مثال: النقطة x بعدها النقطة Y بعدها النقطة z الآن يكون لدينا خطين من هذه النقاط الثلاث ، خط من x إلى y ثم خط من y إلى z...

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

سأكمل باقى الأنواع بعد المغرب ان شاء الله

صراحة :) أرى أن يبقى المستطيل عبارة عن مستطيل أو مربع فقط، حيث أن وجود ال polygon سوف يمكننا من تمثيل أي شكل رباعي آخر (وبنفس سهولة تثميله من خلال ال Rect) إذا أنا أميل إلى تمثيل الكائن Rect بنقطتين فقط كما قال الأخ الشمري..

#41

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

أولا كلاس Rect مضلل فعندما اراه سوف اظن انه مربع او مستطيل فقط ولن يخطر ببالي شكل متواز الاضلاع

لذلك فاما ان يتم فصلها واما ان يتم اختيار اسم اعم.

ثانيا أرجو اضافه هذه ال methods في كلاس ال Line2D

// purpose: calculate the slope of a line given 2 points  
   // Parameters:  P1 is the first point,		   P2 is the second point
   // return: the slope between our 2 points 

   static double slopeBetweenPoints(Point2D P1, Point2D P2);


   // purpose: to determine the slope of the line perpendicular to ourselves  
   // parameters:  slope – the slope of our line  
   // return: the slope of a line perpendicular to us

   static double perpSlope(double slope);


   // purpose: to determine whether two lines are perpendicular  
   // Parameters:  slope1 – the slope of the first line, slope2 – the slope of our second line  
   // return : true if the lines are perpendicular, else false 

   bool arePerp(double slope1, double slope2);


   // purpose: find the point of intersection between two lines  
   // Parameters: L1Point- a 2D point along our first line, L1Slope- the slope of our first line  
   //					  L2Point- a 2D point along our second line, L2Slope- the slope of our second line  
   // return : the point of intersection

   Point2D lineIntersect(Point2D L1Point, double L1Slope, Point2D L2Point, double L2Slope);

ثالثا ارجو شرح IsStraightLine

حيث اني لم افهم معناها وشكرا.

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

#42

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

وكما قلت:

Muhammad alaa كتب:
داخل مكتبة الرياضيات لابد ان تتم المور بأسرع ما يمكن و بشكل بسيط و لنترك التعقيد لمحرك الفيزياء و الرسم.

لقد قمت بتعديل جزء من الكود الذي قدمته لنا، لتبسيطه فقط لا أكثر، مع التذكير إن أوان تقديم الكود لم يحن بعد، لا زلنا في مرحلة Specification. :wink:

لنبدأ، كود Math:

 

[color= #007f00;]#define PI 3.14159265358979323846

[color= #007f00;]#define E 2.71828182845904523536

 

[color= #007f00;]// Making both a constant gets rid of Macro/Inline

[color= #007f00;]#define ToDegree 57.295779f

[color= #007f00;]#define ToRadian 0.0174532f

 

[color= #007f00;]// Float is the standard type that games and graphics use, double is rarely used, 

[color= #007f00;]// probably because both CPU/GPU run float operations faster.

[color= #007f00;]// leaving these in double, would mean most of their usage involves casting twice, 

[color= #007f00;]// which is not recommended for realtime applications.

[color= #0000ff;]struct Math

[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= #000000;]};

بالنسبة للـ Rectangle:

 

[color= #007f00;]// Rectangles are practical in their most basic form (a rectangle)

[color= #007f00;]// no real practical value in having other forms in this stage.

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

[color= #0000ff;]struct Rectangle

[color= #000000;]{

    T top;

    T bottom;

    T left;

    T right;

 

    [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;]) const;

 

    [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;]) const;

 

    [color= #007f00;]// Height and width are more useful than Size

    T getHeight[color= #000000;]([color= #000000;]) const;

    T getWidth[color= #000000;]([color= #000000;]) const;

 

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

    Tringle[color= #000000;]<T[color= #000000;]>[color= #000000;]* getBoundTringle[color= #000000;]([color= #000000;]) const; [color= #007f00;]// What's the practical use?

 

    [color= #0000ff;]bool equal [color= #000000;]( Rectangle[color= #000000;]<T[color= #000000;]>[color= #000000;]& l[color= #000000;]);

    [color= #0000ff;]bool Notequal[color= #000000;]( Rectangle[color= #000000;]<T[color= #000000;]>[color= #000000;]& l[color= #000000;]);

[color= #000000;]};

اما Circle:

 

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

[color= #0000ff;]struct Circle

[color= #000000;]{

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

    T Radius;

 

    [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;]) const;

 

    [color= #007f00;]// Vectors don't have a position, they are only concerned in representing direction 

    [color= #007f00;]// thus tangent does not apply.

    [color= #007f00;]// template <typename S>

    [color= #007f00;]// bool IsVectorTangent( Vector2D<S> v) const;

 

    [color= #007f00;]// It should be Line2D instead of Vector2D (probably a typo)

    [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;]) const;

 

    T getCircumference[color= #000000;]([color= #000000;]) const;

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

 

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

    Tringle[color= #000000;]<T[color= #000000;]> getBoundTringle[color= #000000;]([color= #000000;]) const; [color= #007f00;]// what's the practical value?

 

    [color= #0000ff;]bool equal [color= #000000;]( Circle[color= #000000;]<T[color= #000000;]>[color= #000000;]& c[color= #000000;]);

    [color= #0000ff;]bool Notequal[color= #000000;]( Circle[color= #000000;]<T[color= #000000;]>[color= #000000;]& c[color= #000000;]);

[color= #000000;]};

بالنسبة لـ Triangle:

 

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

[color= #0000ff;]struct Tringle

[color= #000000;]{

    Point2D[color= #000000;]<T[color= #000000;]> p1, p2, p3; [color= #007f00;]// X, Y, Z will cause confusion

 

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

 

    [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;

 

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

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

 

    [color= #0000ff;]bool equal [color= #000000;]( Tringle[color= #000000;]<T[color= #000000;]>[color= #000000;]& t[color= #000000;]);

    [color= #0000ff;]bool Notequal[color= #000000;]( Tringle[color= #000000;]<T[color= #000000;]>[color= #000000;]& t[color= #000000;]);

[color= #000000;]};

انا متأكد إن المشروع سيستفيد من خبرتك الرياضية عندما تشتد الصعاب. :happy:

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

بالنسبة للـ curve فأوافق على إن إوانه لم يحن بعد.

#43
bool equal   ( Tringle<T>& t);
	bool Notequal( Tringle<T>& t);

ما الفائدة من وجود دالتين ؟

الا تكفي دالة واحده و القيمة المعادة هي بمثابة يساوي او لا يساوي

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

#44
الكون كتب:
bool equal   ( Tringle<T>& t);
	 bool Notequal( Tringle<T>& t);

ما الفائدة من وجود دالتين ؟

الا تكفي دالة واحده و القيمة المعادة هي بمثابة يساوي او لا يساوي

على الأكثر لأن هاتين الدالتين ستتحولان إلى == و != operators في ++C و #C.

#45

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

اخ muqawem اعتذر بشده عن وجود الداله IsStraightLine داخل النوع Line حيث انه من المفترض وجودها داخل Curve و ليس Line و لكن دائما ما سيوجد اناس نشطين مثلك و مثل الأخ SandHawk و باقى الأعضاء لتصحيح اخطائى و تنبيهى فشكرا لكم.

بالنسبه لإقتراحاتك بخصوص الدوال

   static double slopeBetweenPoints(Point2D P1, Point2D P2);
   static double perpSlope(double slope);
   bool arePerp(double slope1, double slope2);
   Point2D lineIntersect(Point2D L1Point, double L1Slope, Point2D L2Point, double L2Slope);

بشكل عام يفضل استخدام النوع float على double كما ذكر الأخ SandHawk

اقتباس
Float is the standard type that games and graphics use, double is rarely used,

probably because both CPU/GPU run float operations faster.

الدوال السابقه هى فكره جيده و ستساعد كثيرا فيما بعد و التالى هو ملاحظاتى عليهم

بالنسبه للداله الأولى: لا يوجد تعليق عليها.

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

بالنسبه للداله الثالثه : تمرير الخط نفسه سيجعل عملية حساب وجود التعامد اسهل كثيرا من عمليه حساب وجود التعامد بإستخدام الـ slopes، فى الواقع انا لا اعرف كيف ستتم هذه العمليه بإستخدام الـ slopes.

بالنسبه للداله الرابعه : مره اخرى تمرير الخط نفسه سيجعل اكتشاف مكان التقاطع اسهل من عملية اكتشاف التقاطع بإستخدام الـ slopes.

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

بالنسبه للتعديلات:

1 - الفئه Math : لا تعليق.

2 - الفئه Rectangle:

لاحظت ان اغلب الاعضاء اتفقوا على ان هذا النوع سيمثل مربع او مستطيل لذا فلا يوجد داعى من وجود الداله getType

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

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

بالنسبه للداله getBoundTringle بصراحه لا اذكر لماذا كتبتها و لكن اتى بذهنى هدف لها وقت كتابتها و لم اهتم وضع ملاحظات لها، يمكن حذفها حتى يظهر داعى لها.

نقطه اخيره و هى سؤال حيث انى لاحظت انه تم حذف المؤشرات من داخل الأنواع فلما ؟؟

3 - الفئه Circle:

بالنسبه للداله IsVectorTangent نعم لديك حق لكن يبدو انى احتاج فعلا انا انام 20 ساعه حتى اركز قليلا :blush: .

بالنسبه لمعامل الداله IsLineTangent فعلا هو خطأ كتابى فانا اقصد Line2D و ليس Vector2D.

بالنسبه للداله getBoundTringle فقد شرحت وجهه نظرى بالاعلى (داخل النوع Rectangle).

أضافة جديده : يمكن اضافة الداله IsLineIntersect داخل هذه الفئه و الهدف منه معرفة اذا ما كان خط ما يقطع الدائره ام لا.

4 - النوع Triangle: لا توجد ملاحظات و لكن يوجد اطراء على تغيريك لمسمى النقاط فهو بالفعل جميل و لقد استغرقت حوالى ربع ساعه افكر فى اسم لهم و لم اعرف فشكرا لك :D .

اقتباس
يبدو لي إنك كتبت كل شيء بإعتبار إن الرياضيات هنا رياضيات بحتة

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

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

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

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

#46

ملاحظة صغيرة :

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

1- نستخدم class بدل struct أثناء كتابة المواصفات .. وعند كتابة الكود يمكن التغيير .

2- نستخدم كلمتي [iN] عندما يكون البارمتر للقراءة فقط ( نستخدمها للكائنات في الغالب ) ، و [OUT] عندما يكون البارمتر للكتابة أي أنه مرر باستخدام عنوانه .. أي أننا لانستخدم Pointers أو References ..طبعا لايجب أن تكون IN و OUT في كل بارمتر .. نضعها في البارمتر المهم فقط .. والذي قد يكون مبهماً . ( يعني لانريد أن نرى نجوم :D )

3- عند انشاء مصفوفة مثلا .. نرمز لها بالرمز [ ] ولانستخدم pointer ، حتى تكون الأمور واضحة للجميع ,

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

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

@ Math : بعد تعديلات الأخ محمد علاء و المقاوم و سلوان .. أعتقد أنه شبه مكتمل ومتفقين عليه .

@ Point2D : أعتقد أنها مكتملة الان ,

@ Rectangle : أوافق على تصوّر الاخ محمد علاء ، ولكن بعد التعديلات التي اقترحها الاخ خلدون ومقاوم وسلوان أي نستخدم أربع نقاط لتمثيل الرباعي وبالتالي نحذف getType وتوابعها ولكن كنت أتمنى يوجد وصف ولو مختصر لبعض الدوال .. حتى تكون الصورة واضحة .. لدي سؤال حول هذه الدوال .. :

getBoundCircle : هل المقصود .. الحصول على دائرة تحيط بالمستطيل من الخارج .

getBoundTringle : نعلّقها الان .. الى أن تثبت فائدتها :) .

IsLineInRect : هل المقصود أن يكون الخط داخل المستطيل تماما أو يقطعه ؟ .. أيضا لابد من كتابة وصف لها ( ماذا تعمل .. ومتى تعيد true ومتى تعيد false )

getSize : لم أفهم المقصود ، حجم المستطيل .. أم مساحته area أم شيء اخر ؟

اقترح اضافة هذه الدالة الى Rectangle :

//@Purpose : check if this rectangle is valid .
//@Return :	true : if left < right and bottom > top  ( we suppose that the original point is upper left  so  Y-axes value increases from top to bottom ?!) 
bool isValid()

@ Line2D :

أتمنى كتابة وصف كامل لجميع الدوال التالية حتى تكون الصورة واضحة للجميع : ( ماذا تعمل .. ومتى تعيد true ومتى تعيد false )

IsLineInMe IsStraightLine

أما اقتراح الاخ مقاوم :

slopeBetweenPoints lineIntersect arePerp

أوافق عليها .. أما الدالة perpSlop لم أفهمها .. ( لا أحب الرياضيات كثيرا :) ) ..

وأوافق على التعديلات التي اقترحها الاخ محمد :

اقتباس
بالنسبه للداله الأولى: لا يوجد تعليق عليها.

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

بالنسبه للداله الثالثه : تمرير الخط نفسه سيجعل عملية حساب وجود التعامد اسهل كثيرا من عمليه حساب وجود التعامد بإستخدام الـ slopes، فى الواقع انا لا اعرف كيف ستتم هذه العمليه بإستخدام الـ slopes.

بالنسبه للداله الرابعه : مره اخرى تمرير الخط نفسه سيجعل اكتشاف مكان التقاطع اسهل من عملية اكتشاف التقاطع بإستخدام الـ slopes.

ويمكن عمل Method overloading أثناء implementation .. ولكن في المواصفات يجب أن نكتب البارمترات بشكل أوضح .

@Triangle :

أوافق على التعديلات التي أجراها الاخ سلوان على اقتراح الاخ محمد .. التبسيط شيء جيد :-) .

@Circle :

أتمنى كتابة مواصفات الدوال .. وأهمها :

getCircumference

IsLineTangent

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

انتهينا !

المطلوب الان كتابة مواصفات الدوال المهمة التي لايوجد لها وصف .. حتى يمكننا اعتمادها .. لنغلق ملف هذه الكلاسات .. وننتقل الى vector و matrix .

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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

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

أما Matrix فيجب أن لانطرح شيء الان ، قبل أن يكتمل vector تماما .. حيث أن هناك أسئلة بخصوص matrix وكيف سنبنيها .. وعلى أي نظام .. وبالتالي قد يحصل لخبطة بتداخل المواضيع .

- بالنسبة بـ Polygon :

كما قالا الاخ خلدون :

اقتباس
الPolygon هو ببساطة عبارة عن مصفوفة أو vector لمجموعه من النقاط حيث أن كل نقطة مع النقطة التي تليها تمثل خط.

ولكن هذا لوحده لايكفي اذا لم تكن هناك عمليات بهذا الكلاس ..

كان لدي فكرة سابقة بأن يكون هناك كلاس اسمه Mesh2D ان وافقتم طبعا .. سيظهر في مراحل متقدمة .. لتخزين الرؤوس و الوانها وااحدثيات الاكساء للرسم عن طريق المثلثات .. لرسم أشكال ثنائية الابعاد معقدة .

أما Polygon لن نحتاجه في الغالب الا في الفيزياء المتقدمة أو اكتشاف التصادم وماشابه ذلك .. لن نحتاجه في الرسم ، سيعرف ذلك من جرب OpenGL و D3D وأي محرك ألعاب :) .

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

واذا لم توجد المواصفات يتم تعليقه مؤقتاً .

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#48

فقط إضافه صغيره إلى ال Line2D

//@ 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);
#49

هناك سؤال :

مانظام الاحداثيات الذي سنتعامل معه ، هل محور y يتزايد كلما اتجهنا لأسفل ، كما في GDI و Direct3D .

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

بطريقة أخرى :

هل تكون نقطة الاصل للاشكال هي النقطة اليسرى العلوية .

أم النقطة اليسرى السفلية .

قد نحتاج للاجابة على هذا السؤال لتنفيد بعض المهام في core ,

getYintercept :

لايوجد عندي اعتراض أو موافقة .. :)

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#50

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

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

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

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

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

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

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