الشبكة العربية لمطوري الألعاب

مبتدئ  عابرة مشاركة 1

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

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





باستخدام الدالة

gr.DrawRectangle(Pens.Black, square.pMediodGroup.coverageleft, _
   square.pMediodGroup.coveragetop, square.pMediodGroup.coveragewidth, _
   square.pMediodGroup.coverageheight)


ورسمت دائرة حول الحدود كما يتضح بالصورة


http://www.mixq8.com/uploads/uploads12/elp2.JPG

باستخدام الدالة
Dim pn As New Pen(Color.Yellow)
Dim rect As New Rectangle(square.pMediodGroup.coverageleft, _
   square.pMediodGroup.coveragetop, square.pMediodGroup.coveragewidth, _
   square.pMediodGroup.coverageheight)
gr.DrawEllipse(pn, rect)


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

وأريد الآن تحويل هذا المستطيل إلى منحنى مغلق حول حدود المجموعة

خبير مدير وسام البهنسي مشاركة 2

(إن كان فهمي للسؤال صحيحاً) المشكلة تكمن في طريقة عمل DrawEllipse. فهو يرسم الإهليلج _ضمن_ المستطيل المحيط، وليس حوله (وهو المطلوب في حالتك). لذلك يجب استنتاج قيمة يتم إضافتها إلى أبعاد المستطيل المحيط الممرر للدالة بحيث عندما يتم رسم الإهليلج ضمن هذا المستطيل الموسع فإن الإهليلج يحوي المستطيل الأصلي.

هذه العملية غير مباشرة.. هناك شخص سأل سؤالاً مشابهاً هنا:
http://mathforum.org/library/drmath/view/54859.html

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

معامل الإهليلج العرضي الجديد = نصف عرض المستطيل المحيط القديم
معامل الإهليلج الطولي الجديد = نصف طول المستطيل المحيط القديم

عرض المستطيل المحيط الجديد = 2 * الجذر التربيعي لـ (2 * مربع معامل الإهليلج العرضي الجديد)
طول المستطيل المحيط الجديد = 2 * الجذر التربيعي لـ (2 * مربع معامل الإهليلج الطولي الجديد)



Rectangle rc; // We assume that this contains the old bounding rectangle
double a = rc.Width / 2.0;
double b = rc.Height / 2.0;
double halfWidth = Math.Sqrt(2 * a * a);
double halfHeight = Math.Sqrt(2 * b * b);

Rectangle rcNew = new Rectangle(posx,posy,halfWidth*2,halfHeight*2);

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  عابرة مشاركة 3

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

هذه خريطة لمجموعة من الشوارع والميادين لمنطقة ما
ممثلة بمجموعة من النقاط والمستقيمات
النقاط للميادين
والمستقيمات للشوارع التي تربط بينها
وقد انتهيت من برمجة تجميع الميادين بشوارعها في مجموعات مختلفة حسب الغورذيم استخدمته لهذا الغرض
ينقصني الاخراج فقط برسم منحنى حول المجموعات
ومعلوماتي ضحلة جدا في هذا المجال

خالص امتناني


خبير مدير وسام البهنسي مشاركة 4

آاه عفواً...

في هذه الحالة فالحل يبدأ بإيجاد الـ convex hull (المحيط المحدب وآسف للترجمة). كمرجع، يمكن البدء من هنا:
http://softsurfer.com/Archive/algorithm_0109/algorithm_0109.htm

ثم يمكن استخدام خوارزمية لرسم منحني يمر من النقاط المستخرجة من الـ convex hull. يمكن اعتماد منحني Catmul-Rom حيث أنه يملك هذه الخاصية.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  عابرة مشاركة 5

شكرا جزيلا للمساعده

بارك الله فيك

مبتدئ  عابرة مشاركة 6

صباح الخير
كنت أقرأ عن الخوارزمية
convex hull

ووجدت بعض الأكواد الجاهزة
vb.net 2005
http://vb-helper.com/howto_2005_convex_hull.html
+
vb ver.6
http://vb-helper.com/howto_convex_hull.html

ورغم أني أعمل عى البيئة 2003 ولكن قرأت الكود وأحاول أن اترجمة على برنامجي
لكن، لم افهم لماذا ساحتاج..
Catmul_ROM

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

اكرر شكري وامتناني

خبير مدير وسام البهنسي مشاركة 7

في Feb 11, 2007 17:20، عقد عابرة حاجبيه بتفكير وقال:

لكن، لم افهم لماذا ساحتاج..
Catmul_ROM


لقد ذكرت منحني Catmul/Rom كمثال عن المنحنيات التي تمر بكل نقاط التحكم المحددة لها. لأن بعض المنحنيات (كـ Bezier مثلاً) لا تمر بنقاط تحكمها. على كل، هناك توابع جاهزة في NET. قد تغنيك عن اللجوء لحل خارجي (أقول قد).
لمزيد من التفاصيل، أنصح بقراءة هذه المقالة (ممكن رؤية بقية المقالات عن طريق رابط المقالات العلمية على الشريط الأيمن):
http://www.agdn-online.com/papers/netcurves.htm

وفي Feb 11, 2007 17:20، قال عابرة متحمساً:

في برنامجي يجب ان احسب محيط كل مجموعة
في حالة المستطيل وكل الاشكال الهندسية لا مشكلة
المشكلة تظهر هنا حيث الرسم منحينات!


هذا هو سبب قولي أنك "قد" تكتفي بالحل المتوفر في مكتبة +GDI. لأن هذه مكتبة رسوميات بالدرجة الأولى وليس حسابات رياضية عامة. مما يعني أنك أمام إحدى خيارين:
1- معرفة نوع المنحني المستخدم في DrawCurve ومن ثم استخدام صيغته الرياضية لحساب طوله.
2- الاعتماد على منحني ذو طريقة رسم وحساب طول معروفة وتجاهل ما تقدمه +GDI تماماً.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز