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

------------- مسابقة للجميع ------------

مغلق
بدأه Ayoub JAMAL EL IDRISSI في 30 يناير 2006 · 20 رد · 1,800 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

لن أطيل الكلام

أريد منكم تنفيذ التالي و هو جد بسيط باذن الله

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

المهم اذا لم يكن الكلام مفهوما جيدا فهذه صورة أتمنى ان توضح المطلوب

29_01_06_01_49_28_1138571368test.JPG

آخر أجل لتقديم الأكواد يوم الثلاثاء المقبل و ان شاء الله بعدها يتم الاعلان عن اسم الفائز و كذا مناقشة الأكواد المطروحة او بعضها من أجل الفائدة العامة طبعا مع شرح وافي للفائز لكوده (لتفادي Copy-Past)

كل المشاركات التي تحتوي فقط على كلام دون الكود يتم حذفها تلقائيا

و بالتوفيق للجميع

#2

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

' نستخدم الاستيراد التالي للتمكن من الرسم
Imports system.Drawing.Drawing2D

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ' نقوم بتعريف نسخة من كائن Graphics
        Dim G As Graphics = Me.CreateGraphics
        ' نقوم بإنشاء قلم أزرق لنستخدمه من الرسم 
        Dim Bl As New Pen(Color.Blue, 2)

        ' نقوم برسم النقاط أولا باستخدام الدالة Fillellipse
        ' حيث يكون الوسيط الأول الفرشاة المستخدمة و الثاني المضلع الذي يحدد أبعاد المنطقة التي يتم الرسم فيها
        G.FillEllipse(Brushes.Red, New RectangleF(50 - 2, 50 - 2, 5, 5))
        G.FillEllipse(Brushes.Red, New RectangleF(70 - 2, 150 - 2, 5, 5))
        G.FillEllipse(Brushes.Red, New RectangleF(120 - 2, 180 - 2, 5, 5))
        G.FillEllipse(Brushes.Red, New RectangleF(90 - 2, 220 - 2, 5, 5))
        G.FillEllipse(Brushes.Red, New RectangleF(190 - 2, 250 - 2, 5, 5))
        G.FillEllipse(Brushes.Red, New RectangleF(290 - 2, 150 - 2, 5, 5))
        G.FillEllipse(Brushes.Red, New RectangleF(390 - 2, 100 - 2, 5, 5))

        ' نقوم برسم الخطوط بين النقاط بواسطة الدالة DrawLine
        ' حيث يكون الوسيط الأول القلم الذي أنشأناه سابقا
        ' والثاني نقطة بدء رسم الخط والثالث نقطة نهاية رسم الخط
        G.DrawLine(Bl, New PointF(50, 50), New PointF(70, 150))
        G.DrawLine(Bl, New PointF(70, 150), New PointF(120, 180))
        G.DrawLine(Bl, New PointF(120, 180), New PointF(90, 220))
        G.DrawLine(Bl, New PointF(90, 220), New PointF(190, 250))
        G.DrawLine(Bl, New PointF(190, 250), New PointF(290, 150))
        G.DrawLine(Bl, New PointF(290, 150), New PointF(390, 100))

    End Sub

End Class

وشرح الكود ضمن التعليقات الموجودة ضمن الكود وهذه صورة للنتيجة

30_01_06_03_51_22_1138665082See.JPG

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#4

samerselo:

الأخ crazy-man لا يرد الرسم بصورة أساسية . المراد عمل خوارزمية لحل الفكرة التي كتبها ...

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

الكود بالسي لكن يمكن فيه أخطاء (هو عبارة عن خوارزمية وليس كود بالأصح ) ...

انا كتبت الكود أصلا بالدلفي وجربته لكن الكثيرين قد لا يفهموا الكود لذا قلت اكتب الجزء المهم بالسي

//==========
//points: array of points inserted
//temppoints: temprary array of points to work with
//distance : to calculate the distance between two points
//shortestdis : to save the shortest distance
//npid: index of next point in the array
//DrawLink function to draw link line between the two points
for (i=0;i<n;i++)
{
temppoints=points;
}
npid:=0;
for (i=0;i<n-1;i++ )
{
 temppoint=temppoints[npid];
 temppoints[npid]=temppoints;
 temppoints=temppoint;
 for (j=i+1;j<n;j++)
 {
  distance=
      (temppoints[j].X-temppoints.x)*(temppoints[j].X-temppoints.x)+
      (temppoints[j].y-temppoints.Y)*(temppoints[j].y-temppoints.y);
  if (j==i+1)
   shortestdis= distance;
  if (distance < shortestdis)
    {
     shortestdis=distance;
     npid=j;
    }
 }
 DrawLink(temppoints,temppoints[npid]);
}
//==========

بالامكان استخدام احدى التراكيب في Data structre عوضا عن المصفوفة temppoints والتي ستكون بحجم مصفوفة النقاط المدخلة ...

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

تم تعديل هذه المشاركة بواسطة cipher في 31 يناير 2006 في 17:02

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#5

بسم الله الرحمن الرحيم

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

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

والمشروع مرفق وبه الشرح كامل

Musabaga.zip

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#6

بسم الله الرحمن الرحيم

حقيقة كنت اتوقع اقبالا أكبر على هذه المسابقة البسيطة و التي وضعتها في الأساس كتمهيد لمسابقة أكبر و أعقد شيئا ما لكن للأسف لم أجد سوى 4 ردود :( لذا اظن اني لن أغامر في طرح المسابقة الأخرى و سنكتفي بهذه فقط

المهم دعونا الآن نتكلم نرى من الذي طرح الحل الأمثل :

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

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

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

31_01_06_06_37_04_1138761424moam.JPG

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

أما عن الأخ العزيز Cipher فهو الذي أتى بالحل الأمثل لكن للأسف مكتوب بالسي++ لذا فلن استطيع أن اقول انه هو الفائز رغم انه فعلا الوحيد الذي أتى بالخوارزمية المطلوبة و الحل الجيد :D و لذا سنعتبره ضيف شرف لنا :)

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

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

31_01_06_06_41_05_1138761665Concours.JPG

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

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

و بهذا تنتهي المسابقة دون فائز سوى ضيفنا العزيز Cipher الذي أتى بالحل عن طريق السي++

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

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

-------

السؤال كان كما يلي

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

اذا فلنحاول تحليل السؤال و تجزيئه لأجزاء

اولا لدينا نقطة A و هي نقطة الانطلاق

نقوم باعلانها برمجيا أولا على الشكل التالي :

 Dim StartPoint As Point = New Point(73, 75)

الجزء الثاني هو ان هذه النقطة تحيط بها مجموعة من النقاط اذا بكل بساطة أقوم بانشاء Array من ال Points و ذلك عن طريق هذا الكود البسيط :

Dim OtherPoints(11) As Point

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

الجزء الثالث و المهم هو اننا نريد ربط نقطة الانطلاقة بأقرب نقطة منها و نفس الشئ بالنسبة للنقطة الموالية اذا الأمر الذي سنعكف عليه هو حساب المسافة بين النقطة A و كل نقطة من النقاط المحيطة بها :

اولا نقوم بانشاء فنكشن اسمها مثلا Distance تعيد لنا Integer و هو المسافة بين نقطتين ممررتان اليها و كودها يكون كالتالي :

 Private Function Distance(ByVal FirstPoint As Point, ByVal SecondPoint As Point) As Integer
        Return Math.Abs(FirstPoint.X - SecondPoint.X) + Math.Abs(FirstPoint.Y - SecondPoint.Y)
    End Function

هذه خوارزمية بسيطة لحساب المسافة بين نقطتين و هناك خوارزمية أخرى و هي :

 Private Function Distance(ByVal FirstPoint As Point, ByVal SecondPoint As Point) As Integer
        Return Math.Sqrt(Math.Pow(FirstPoint.X - SecondPoint.X, 2) + Math.Pow(FirstPoint.Y - SecondPoint.Y, 2))
    End Function

اذا الآن بعد أن عرفنا كيفية حساب المسافة بين نقطتين يجب اذا علينا فحص المسافة بين النقطة A و النقاط الاخرى و أخذ أقصر مسافة لذلك سنقوم بانشاء فتكشن نسميها مثلا ClosePoint تعيد لنا Point الأقرب بعد ان نمرر لها مجموعة نقاط و النقطة التي نريد ان نعرف اي نقطة من تلك المجموعة أقرب اليها و سيكون تعريف هذه الفنكشن كالتالي :

 Private Function ClosePoint(ByVal Points() As Point, ByVal ThePoint As Point) As Point
End Function

لكن ليس هذا فقط يجب ان نفكر في أمر آخر ... آه نعم الامر هو انه يجب ان نعلم برنامجنا بأنه اذا مر من نقطة ما معينة فلا يجب عليه العودة اليها :) كيف ذلك اذا ؟

الأمر بسيط أيضا نقوم بانشاء لائحة سوداء للنقاط الممنوع المرور منها :D و ليكن الكود هو التالي :

Dim BlackList() As Point = {StartPoint}

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

اذا لنعد الا الفنكشن ClosePoint لكن لحظة في هذه الفنكشن يجب علينا كل مرة ان نتأكد من أن النقطة التي نريد معرفة المسافة بينها و بين النقطة A موجودة في اللائحة السوداء فاذا ما وجدت نمر الى نقطة اخرى ... لكن كيف يمكننا البحث في اللائحة السوداء ؟؟؟ دعونا ننشأ فنكشن تأخذ كبرامتر نقطة معينة و كذلك مصفوفة نقاط التي ستبحث داخلها :) و تعيد لنا TRUE اذا ما وجدت النقطة في المصفوفة الممررة اليها و FALSE في الحالة المعاكسة و الكود سيكون كالتالي :

Function Search(ByVal What As Point, ByVal Where As Point()) As Boolean
        Dim X As Integer
        For X = 0 To Where.GetUpperBound(0)
            If Where(X).Equals(What) Then
                Return True
            End If
        Next
        Return False
    End Function

أظن ان الكود جد بسيط فنف نمر على جميع نقاط المصفوفة و نقارنها بالنقطة الممررة عن طريق الدالة Equals فاذا وجدت عادت الفنكشن ب TRUE اما اذا لم تجد عادت ب FALSE

الآن أظن ان كل شئ جاهز للعودة الى الفنكشن الرئيسية ClosePoint فقط قبل أن أنسى قم بتعريف متغير من نوع Point خارج الفنكشن ClosePoint بهذا الشكل :

Dim BestPoint As Point

هذا المتغير سنحفظ فيه فقط النقطة الملائمة التي يجب الذهاب اليها

اوكي الآن كل شئ جاهز لنبدأ في الكود الذي سيكون داخل الفنكشن ClosePoint

اولا نعلن المتغير :

Dim ShortestPoint As Integer = Integer.MaxValue

هذا المتغير من أجل متابعة و البحث عن أقصر او اقرب نقطة من النقطة A و لقد وضعت فيه القيمة Integer.MaxValue فقط لأننا سنحتاج مقارنة محتواه في أول مرة مع المسافة التي سنحسبها في اول الأمر المهم لا تشغلو بالكم بها كثيرا فستفهم عند نهاية الفنكشن :)

الآن سوف نقوم بعمل حلقة :

For i As Integer = 0 To Points.GetUpperBound(0)

طبعا كما هو ظاهر هذه الحلقة تمر على جميع النقاط في المصفوفة Points و التي تحتوي كما رأينا على النقاط المحيطة بالنقطة A

If Search(Points(i), BlackList) = False Then

هنا نتأكد اولا من عدم وجود النقطة Points(i) في اللائحة السوداء حتى نكمل الكود فاذا لم توجد نقوم بعمل التالي :

 Dim TheDistance As Integer = Distance(ThePoint, Points(i))

هنا قمنا بانشاء متغير سيحتفظ بالمسافة بين النقطتين من أجل فحص المسافة لاحقا

بعد ذلك

If TheDistance <= ShortestPoint Then

هنا نقوم بمقارنة المسافة المحتفظة في المتغير TheDistance مع المتغير ShortestPoint و الذي يحتوي حاليا على اعلى قيمة للمتغير Integer فاذا كانت المسافة أصغر من او تساوي قيمة المتغير ShortestPoint نقوم بعمل التالي :

                    BestPoint = Points(i)
                    ShortestPoint = TheDistance
                End I
End If
        Next

اولا كما هو ظاهر جعلنا ال BestPoint هي النقطة الحالية من المجموعة

ثم بعد ذلك اصبح المتغير ShortestPoint يساوي المسافة TheDistance

و أخيرا خرجنا من الحلقة و سيكون طبعا المتغير BestPoint يحتوي على اقصر نقطة من النقطة A و المتغير ShortestPoint على اقصر مسافة :)

الأن بقي لنا 4 أسطر و هي :

 ReDim Preserve BlackList(BlackList.GetUpperBound(0) + 1)
        BlackList(BlackList.GetUpperBound(0)) = BestPoint
        StartPoint = BestPoint
        Return BestPoint

السطر الاول نقوم فيه بتوسيع المتغير BlackList بمقدار 1 لكي نضع فيه بعد ذلك النقطة الحالية التي نحن عليها و هي طبعا ال BestPoint حتى لا نعود اليها مرة أخرى

اما السطر الثالث فنقوم بتغيير نقطة الانطلاقة (النقطة A) لتساوي النقطة التي انطلقنا اليها :)

و أخيرا نعيد أقرب نقطة

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

هذا كود بسيط لملأ مصفوفة النقاط المحيطة و كذا رسمها على اداة PictureBox

Private Sub DrawPoints()
        MyBmpPoints = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
        OtherPoints(0) = New Point(108, 197)
        OtherPoints(1) = New Point(183, 130)
        OtherPoints(2) = New Point(177, 192)
        OtherPoints(3) = New Point(180, 46)
        OtherPoints(4) = New Point(325, 160)
        OtherPoints(5) = New Point(158, 281)
        OtherPoints(6) = New Point(310, 81)
        OtherPoints(7) = New Point(277, 267)
        OtherPoints(8) = New Point(48, 266)
        OtherPoints(9) = New Point(235, 72)
        OtherPoints(10) = New Point(335, 242)
        OtherPoints(11) = New Point(122, 34)
        'نرسم النقطة A 
        'باللون الحمر
        MyBmpPoints.SetPixel(StartPoint.X, StartPoint.X, Color.Red)
        For i As Integer = 0 To OtherPoints.GetUpperBound(0)
            MyBmpPoints.SetPixel(OtherPoints(i).X, OtherPoints(i).Y, Color.Black)
        Next
        Me.PictureBox1.Image = MyBmpPoints

    End Sub

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

الآن بقي لنا التنفيذ و سيكون على الشكل التالي :

أضف اداة بوتن مثلا

و ضع في الحدث click الكود التالي

        Dim MyGraphics As Graphics = Me.PictureBox1.CreateGraphics
        MyGraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias

        MyGraphics.DrawLine(New Pen(Color.Blue, 2), StartPoint, ClosePoint(OtherPoints, StartPoint))

السطرين الأولين واضحين و كذلك الثالث :D

السطر الثالث نستخدم دالتنا لنحصل على النتيجة المماثلة للصور :

31_01_06_07_36_11_1138764971crazy.JPG

و هذا هو الكود النهائي اذا ما أردتم استعمال :

 Dim MyBmpPoints As Bitmap
    Dim StartPoint As Point = New Point(73, 75)
    Dim BlackList() As Point = {StartPoint}
    Dim OtherPoints(11) As Point
    Dim BestPoint As Point
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim MyGraphics As Graphics = Me.PictureBox1.CreateGraphics
        MyGraphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        MyGraphics.DrawLine(New Pen(Color.Blue, 1), StartPoint, ClosePoint(OtherPoints, StartPoint))
    End Sub
    Private Function ClosePoint(ByVal Points() As Point, ByVal ThePoint As Point) As Point
        Dim ShortestPoint As Integer = Integer.MaxValue
        For i As Integer = 0 To Points.GetUpperBound(0)
            If Search(Points(i), BlackList) = False Then
                Dim TheDistance As Integer = Distance(ThePoint, Points(i))
                If TheDistance <= ShortestPoint Then
                    BestPoint = Points(i)
                    ShortestPoint = TheDistance
                End If
            End If
        Next
        ReDim Preserve BlackList(BlackList.GetUpperBound(0) + 1)
        BlackList(BlackList.GetUpperBound(0)) = BestPoint
        StartPoint = BestPoint
        Return BestPoint
    End Function
    Private Function Distance(ByVal FirstPoint As Point, ByVal SecondPoint As Point) As Integer
        Return Math.Sqrt(Math.Pow(FirstPoint.X - SecondPoint.X, 2) + Math.Pow(FirstPoint.Y - SecondPoint.Y, 2))
    End Function
    Function Search(ByVal What As Point, ByVal Where As Point()) As Boolean
        Dim X As Integer
        For X = 0 To Where.GetUpperBound(0)
            If Where(X).Equals(What) Then
                Return True
            End If
        Next
        Return False
    End Function

    Private Sub Form4_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        DrawPoints()
    End Sub
    Private Sub DrawPoints()
        MyBmpPoints = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
        OtherPoints(0) = New Point(108, 197)
        OtherPoints(1) = New Point(183, 130)
        OtherPoints(2) = New Point(177, 192)
        OtherPoints(3) = New Point(180, 46)
        OtherPoints(4) = New Point(325, 160)
        OtherPoints(5) = New Point(158, 281)
        OtherPoints(6) = New Point(310, 81)
        OtherPoints(7) = New Point(277, 267)
        OtherPoints(8) = New Point(48, 266)
        OtherPoints(9) = New Point(235, 72)
        OtherPoints(10) = New Point(335, 242)
        OtherPoints(11) = New Point(122, 34)
        MyBmpPoints.SetPixel(StartPoint.X, StartPoint.X, Color.Red)
        For i As Integer = 0 To OtherPoints.GetUpperBound(0)
            MyBmpPoints.SetPixel(OtherPoints(i).X, OtherPoints(i).Y, Color.Black)
        Next
        Me.PictureBox1.Image = MyBmpPoints

    End Sub

اذا كانت هناك اي استفسارات فانا موجود

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

#7

crazy-man:

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

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

في حين طريقتك هي إضافة النقاط المناقشة :D (تفكير سليم).

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

في جزء من الكود فيه خطأ , يجب تعديله ليصبح بالشكل

  if (j==i+1)
  {
   shortestdis= distance;
   npid=j;
  }

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

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#8

الســــلام عليكم

اشكر الاخ ايوبcrazy-man على هذه المبادرة وطرح المسابقة والذى كانا الهدف منها هو تنشيط القسم وكنا نتمنى ان يتفاعل كل الاعضاء لكن لللاسف هذا لم يحصل :(

وشكرا لللاخوة الذين ساهمموا بحلولهم المسابقة انتهت بدون فائز ولكن هناك من اقترب من الحل

اخcipher راحت عليك الجائزة :D كان ممكن تكتب الكود بالc# خيرها فى غيرها :lol:

اخىcrazy-man ننتظر منك مسابقة اخرى ;) :D

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#9

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

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

#10
اقتباس
اخcipher راحت عليك الجائزة  كان ممكن تكتب الكود بالc# خيرها فى غيرها

:( لو بعرف انه في جوائز كنت كتبتها بـ C# ( أمزح ) .

اقتباس
وانا ارحب بعمل المسابقات انت اخترت موضوع دقيق في الرسم

لا أعتقد أن الغرض الأساسي من المسابقة هي الرسم ...

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

الأخ أيوب اختار الرسم لتوضيح الفكرة بشكل افضل ...

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#11
اقتباس
ولكن اكثر الناس هنا تهتم بقواعد البيانا القليل يرسم اذا عمل مسابقة اسال في قواعد البيانات تجد الاف وانا ارحب بعمل المسابقات

الهدف من هذه المسابقات هو الهروب من قواعد البيانات :D

وكما اجابك الاخcipher فالمطلوب كان خوارزمية وليس مجرد رسم خطوط

من يهوى الرسم ولديه القدرة على الابداع يمكنه المشاركة فى هذه المسابقة :D

http://204.157.36.16/index.php?showtopic=86528

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#12

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

#13

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

اخي crazy-man لا تقل هذه اخر مسابقه لقلة المشاركات

بحكم ان اغلب الشباب في هذا الاسبوع عندهم اختبارات

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

ولو ما شارك الا جزء بسيط فان كثير من الشباب سيستفيدون من الافكار المطروحه

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

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

فاتمنى منكم الاستمرار

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#14

هذه بعض الملاحظات:

1- استخدم ArrayList في المرات المقبلة ولا تستخدم المصفوفات العادية، فأنت تبرمج باستخدام VB.NET، ولست تبرمج باستخدام C! أو VB العادية!

2- لست بحاجة لبناء قائمة سوداء: تستطيع عوضا عن ذلك أن تستخدم نفس القائمة وتحذف النقطة التي استعملتها، وبذلك تصغر القائمة!

3- اجعل هذه الوظيفة Static أو Sharred،، ولا تجعلها مرتبطة بالنافذة التي تريد بناءها. (هذا سيساعدك في استعمال هذه الوظيفة بسرعة في أي برنامج آخر دون اللجوء إلى صنع Frame أو Window جديد !

4- طريقة تصميم الطريقة لا تساعد المطور في استعمالها بسهولة، كان من الأفضل أن تجعل المطور يمرر القائمة بأكملها ويحصل على قائمة جديدة مرتبة حسب المطلوب، لا أن نمرر نقطة نقطة! (أقصد بذلك، تنقص الطريقة تسهيل الحصول على النتائج)

هذه قد تفيد، أرجو تحويلها إلى VB.NET أو إلى C#:

 import java.awt.Point;
 import java.util.*;
public class MyMathUtilities {
    public static List<Point> sortPointsByNearestPath(List<Point>scaterredPoints){
   	 //we are creating a new copy of the list, so that we dont
   	 // modify the original!
   	 List<Point>points=new ArrayList<Point>(scaterredPoints);
   	 List<Point>result=new ArrayList<Point>();
   	 // we remove the first point. and add it to the result.
   	 result.add(points.remove(0));
   	 //we loop until all points are used!
   	 while(points.size()>0){
      Point p=getNearestPoint(result.get(result.size()-1), points);
      points.remove(p);
      result.add(p);
   	 }
   	 return result;
    }
    /**Returns the nearest point to a spisific point (base) 
     *from the given list.
     */
    public static Point getNearestPoint(Point base, List<Point>otherPoints){
   	 Point nearest=otherPoints.get(0);
   	 double distance=getDistance(base, nearest);
   	 for (int i = 1; i<otherPoints.size(); i++){
      Point p=otherPoints.get(i);
      double dist=getDistance(base, p);
      if(dist<distance){
     	 distance=dist;
     	 nearest=p;
      }
   	 }
   	 return nearest;
    }
    /**Returns the distance between two points.
     */
    public static double getDistance(Point p1, Point p2){
   	 return Math.sqrt(Math.pow(p1.getX()-p2.getX(),2)+Math.pow(p1.getY()-p2.getY(), 2));
    }
}

الآن يستطيع المطور أن يمرر قائمة بالنقاط، ويستلم عندها قائمة مرتبة يرسمها كيف يشاء!

كل ما في الأمر أن ينادي المطور على :

List<Point> sorted = MyMathUtilities.sortPointsByNearestPath(myPoints);

طبعا الرسم هو موضوع آخر لا علاقة له هنا!

بالتوفيق!

#15

.....

#16

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

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

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

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

#17
اقتباس
2- لست بحاجة لبناء قائمة سوداء: تستطيع عوضا عن ذلك أن تستخدم نفس القائمة وتحذف النقطة التي استعملتها، وبذلك تصغر القائمة!

ملحوظة بسيطة فقط :

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

في أغلب الأحيان لا نريد التغيير في محتويات المعطيات -هذا بشكل عام- ...

مثل نريد الترتيب ( او ربما الرسم ) ابتداءً من النقطة A والتي قد نقوم بتغييرها بطلب العملية أكثر من مرة ...

طبعاً هذا الكلام إن لم يكن التغيير في القائمة المعطاه لا يؤثر أو لا يعنينا ....

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#18

معك حق، الحفاظ على الأصل أمر مهم،، ولهذا أضفت الأسطر الأولى وبذلك تحافظ على الأصل إن أردت:

/we are creating a new copy of the list, so that we dont
    // modify the original!
    List<Point>points=new ArrayList<Point>(scaterredPoints);

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

#19
29_01_06_01_49_28_1138571368test.JPG

أنا أقترح أن ترتب قيم الإحداثيات في مصفوفة (h)

وإستخدام الطريقة

Array.Sort

ثم نأخذ القيمة الصغرى من المصفوفة :)

#20

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

مقالاتي في VB.NET وبرامجي على موقعي الجديد :

#21

هناك الآن موقع مختص فقط بالمسابقات اخي العزيز

و هذا هو العنوان

http://www.vbnetworld.com/Competition

يمكنك المشاركة بعد التسجيل

:)

اخي crazy programmer لما لا تكتب لنا كود بسيط يفي بالغرض و يطبق الطريقة التي طرحتها :)

تم تعديل هذه المشاركة بواسطة Ayoub JAMAL EL IDRISSI في 17 يونيو 2007 في 21:15

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

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