• 0
هاني الأتاسي

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

سؤال

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


x^2 + y^2 = r^2

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

22 إجابة على هذا السؤال .

  • 0

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


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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

:P :P

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

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

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

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

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

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

وهيك ...

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحبا هاني..

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

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

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

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

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

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

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

(0,r)

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

(r,0)

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

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

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

x^2 + y^2 = r^2

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

:o

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

بفرض الزاوية 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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

1.2 1.4353 3.14

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

صح هاني ؟

سلام ...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

DEVELOPER.NET .... ;) ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

.

.

.

.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

أخ هاني

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

}

}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

نص البرنامج /

#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;
}
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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 المطروحة أو المضافة تمثل أصغر وحدة نتعامل معها

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

أنتظر الحل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

: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);
}
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .