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

سلسلة - شغل مخك (10)

مغلق
بدأه هاني الأتاسي في 11 مايو 2002 · 22 رد · 4,536 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

x^2 + y^2 = r^2

Coding on the Cloud and for the Cloud!

My Blog

#2

مساعدة :: ناقش التابع :

x^2 + y^2 - r^2 داخل الدائرة أم خارج الدائرة???

Coding on the Cloud and for the Cloud!

My Blog

#3

شكرا هاني على هذه السلسة واكثر ما اعجبني هو اسمها (شغل مخك ) :Dوفكرت اسوي قسم خاص بها ولكن ياريت ياشباب لو تسوى الكود بالبيسك يعني لا فيجوال بيسك ولا سي ولا اسمبلي يعني علشان الكل يفهم ايش الموضع ولا ايش رايكم ;)

جديد مدونتي الشخصية http://www.badwi.com

ادعو لنا بظاهر الغيب

MyBooksExchange.jpg

#4

له يامحمد "لا شكر على واجب" .. :o

أنت بس أنتظر حتى تصير 30 حلقة وبعدين نسويلها قسم بس بصراحة أنا ناوي أسمي الحلقة الاخيرة

الحلقة الأخير - فجّر مخك (30)

:P :P

اللغة المتبعة هي تقريبا سي بس مو 100 المية يعني كل المعاملات المستخدمة سهلة مثلا

<< ازاحة على اليمين

>> ازاحة على اليسار

& عملية الضرب المنطقي

| عملية الجمع المنطقي

^ عملية xor منطقية

وهيك ...

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

Coding on the Cloud and for the Cloud!

My Blog

#5

وين الحل على هذا السؤال ياشباب .. ماعت صار أسهل من هيك ..؟؟

ولا بدكم أحط الحل وأريح راسكم ؟؟؟ أخ محمد ليش ماعمتشغل مخك معنا ؟؟

Coding on the Cloud and for the Cloud!

My Blog

#6

مرحبا هاني..

بالواقع أنا ممكن أجاوب السؤال بس عن طريق دراستي لمادة النظم البيانية وليس عن طريق تشغيل مخي!!

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

لنبدأ برسم الربع الأول..

من الزاوية 90 وحتى 0 درجة

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

بفرض كان مركز الدائرة في مركز الإحداثيات أي بالنقطة (0,0)

إذا أول نقطة لدينا هي النقطة

(0,r)

وحسب معلوماتنا فإن الميل في هذا الربع سينحدر للأسفل وسينتهي بالنقطة

(r,0)

أي أن النقطة التالية هي إما

(1,r) or (1,r-1)

نعوض في معادلة الدائرة

x^2 + y^2 = r^2

ونختار النقطة الأقرب للصحة وهكذا نتابع الرسم حتى آخر بكسل

لا أعلم إن كان ما قلته واضحاً!!

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

]

#7

كلامك صحيح ولكن غير ممتاز وإذا كان هذا ما أخذتوه في المادة فوا أسفاه على هيك مادة .. :cool: :cool:

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

Coding on the Cloud and for the Cloud!

My Blog

#8

:o

كلامك مهو مبالغ فيه شوي؟؟؟

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

]

#9

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

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

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

بفرض الزاوية t تتغير من صفر إلى 360 درجة

هناك حلان

الحل الأول:

رسم الدائرة باستخدام المحاور القطبية Polar Coordinates

For t = 0 To 360

Plot ( r , t )

الحل الثاني:

رسم الدائرة باستخدام المحاور الكارتيزية Cartesian Coordinates

For t = 0 To 360

x = r * cos ( t )

y = r * sin ( t )

Plot ( x , y )

مع مراعاة أن t بال degrees

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

#10

أشكرك أخي طارق على المشاركة معنا ..

أنا قصدت عدم استخدام ال real numbers أو float numbers بكلمة أخرى أريد أن يكون الحل كامل باستخدام أعدام صحيحة فقط سالبة أو موجبة ...

أي أنا الأعداد التالي لا يمكن استخدامها :

1.2 1.4353 3.14

ولكن يمنكن استخدام التالية :

-2 -1 0 1 2 وهكذا ....

حلك يعتمد على الجذور وال sin و cos التي كلها تنتج أعداد حقيقية .. وهي عملية بطيئة جدا ..

الدوائر ترسم بطرق أخرى بسرعة جدا عالية .. :)

Coding on the Cloud and for the Cloud!

My Blog

#11

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

يا شباب هاني يقصد خوارزمية midpoint .

صح هاني ؟

سلام ...

#12

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

الأخ الكريم / هاني الأتاسي

حلي الثاني يعتمد على ال sin , cos كما أشرت ولكن لا يعتمد على الجذور

ولكنك لم تتفضل بتقييم الحل الأول

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

#13

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

DEVELOPER.NET .... ;) ..

Coding on the Cloud and for the Cloud!

My Blog

#14

x:R--->0---->-R

y:0--->r------>0

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

x:-R--->0----->R

y:0---->-R---->0

x & y By pixel , Integer Numbers

for x = r to 0

for y = 0 to r

if x^2 + y^2 = r^2 then

'Draw point

end if

next y

next x

for x = 0 to -r

for y = r to 0

if x^2 + y^2 = r^2 then

'Draw point

end if

next y

next x

.

.

.

.

#15

محاولة جيدة أخي نجم .. لكن هذا جدا جدا بطيئ يأنك تمسح نقاط مربع كامل :)

Coding on the Cloud and for the Cloud!

My Blog

#16

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

أخ هاني

أرجو أن تعطينا الحل فنحن جميعا متشوقون لذلك

#17

DrawCircle(int x,int y,int rad)//x is x coordinate of center,y is y coordinate of center,rad is the radious

{

int xcoord, //x-coordinate of pixel

int ycoord; //y-coordinate of pixel

for(int xcoord=0;xcoord<=rad/2;xcoord++)

{

ycoord=sqrt( (rad*rad) - (xcoord*xcoord) );//square root

DrawPixel(xccord+x,ycoord+y);//or whatever function to draw a pixel

DrawPixel(x-xccord,y-ycoord);

DrawPixel(x-xccord,y+ycoord);

DrawPixel(x+xccord,y-ycoord);

}

}

#18

(clock)

#19

أولاً أشكرك على هذا البرنامج ، وآمل أن يكون خطابك للشباب بشيء من الرقة حتى لا يتحطم الشخص .

ثانياً إليك محاولتي وآمل أن تكون صحيحة - كما درستها في الكلية -

نص البرنامج /

#include 
#include 
#include 
#include 
#include 

typedef unsigned char byte;
const int SizeX = 320;
const int SizeY = 200;
const int MidX = 160;
const int MidY = 100;
byte far * const ScreenBase = static_cast(MK_FP(0xA000, 0));

void Circle(int Radius, byte Colour)
{
register int x, y, G, DeltaG1, DeltaG2;

   x = 0;
    y = Radius;
    G = 1 - Radius;
    DeltaG1 = 3;
    DeltaG2 = -2 * Radius + 5;
    byte far *Screen = ScreenBase + x + y * SizeX;
    *Screen = Colour;
    while (x < y)
    {   if (G < 0)
        {   G += DeltaG1;
            DeltaG1 += 2;
            DeltaG2 = DeltaG2 + 2;
            Screen += 1;
        }
        else
        {   G += DeltaG2;
            DeltaG1 += 2;
            DeltaG2 += 4;
            Screen += 1 - SizeX;
            y--;
        }
        x++;
        *Screen = Colour;
    }
}
#20
Y=0

FOR X=R TO 0 STEP -1

  IF X^2 + Y^2 = R^2 THEN DRAW(X,Y)

  Y=Y+1

NEXT X

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

مع العلم أن 1 المطروحة أو المضافة تمثل أصغر وحدة نتعامل معها

ولتكن بالبيكسل أو النقطة ، مع العلم أن المحورين ممثلين بأصغر وحدة

وذلك لكون أنه يجب مسح أحد المحورين بشكل كامل ، وبالتالي

الحل هذا لا يمسح مربع نصف قطره نصف قطر الدائرة

#21

ماهو الحل الصحيح السريع؟ الموضوع قديم و يبدو انه مهجور

أنتظر الحل

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

post-21836-1257612765.gif

before asking: smart questions how-to

#22

في الحقيقة هذه السلسلة جد جد قيمة ووجب تتبيثها في منتدى الخواريزميات B)

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#23

:P

هذه خوارزمية نقطة الوسط أو الـ MidPoint

وهي كالتالي:

DrawCircle( int Radius, int CenterPointX, int CenterPointY)
{
	X = 0;
	Y = Radius;

	P = 5/4 − R
	int K = 0

	For(, X <= Y, K++)
	{
		If( P < 0)
		{
			newX = X + 1;
			newY = Y;
			newP = P + 2 * (X + 1) + 1;
		}

		else
		{
			newX = X + 1;
			newY = Y − 1;
			newP = P + 2 * (X + 1) − 2 * (Y − 1) + 1
		}

		X = newX + CenterPointX;
		Y = newY + CenterPointY;

		Draw(X,Y);
	}
}

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

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

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

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

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