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

كل من يعرف هذه الدوال فليكتبها الله لايهينه

مغلق
بدأه السهم الناري في 30 سبتمبر 2003 · 6 رد · 875 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

الحمد لله والصلاة والسلام على رسول الله أما بعد:

أخواني الكرام أرغب في سؤالكم هذه المرة عن دوال جاهزة في مكتبة c/c++ تقوم بعملية الرسم( مستقيمات).

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

يا ليت تكون الدوال مع طريقة الاستخدام ( عدد المدخلات والمخرج أن وجد وطريقة الإعلان عن الدالة واستدعائها ).

يا ليت تساعدون ولو بالقليل من المعلومات.

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

أخوكم السهم الناري.

اللهم علمنا ما ينفعنا وأنفعنا بما علمتنا أنك أنت العليم الحكيم

سبحان الله وبحمده سبحان الله العظيم

لاحول ولاقوة الا بالله( كنز من كنوز الجنة ).

#2

السلام عليكم,

يا أخي يمكنك استعمال GDI لدلك ففيها API تسمى LineTo وأخرى تسمى

MoveToEx .

إن الدالة الأولىتأخد 3 بارامتر نكتبها كالتالي :

LineTo(HDC hdc,int xend,int yend)

ف HDC هو الهاندل ل Device context الدي نريد أن نرسم عليه أم xend و yend يمثلان مراكز النقطة التي ينتهي عندها السطر أما نقطة بداية السطر فنحددها بالدالة الثانية

MoveToEx(HDC hdc,int xstart,int ystart,LPPOINT lpPoint)

الأول كالسابق xstart ystart هما يحددان نقطة البداية للسطر أما الأخير فهو مؤشر من نوع POINT يستعمل لتخزين النقطة السابقة وإدا كنا لا نهتم بالنقطة السابقة يمكن أن نعطيه قيمة NULL.

فإدن إدا أردنا رسم سطر نستعمل MoveTo لتدهب بنا إلى نقطة البداية ثم نستعمل LineTo لترسم الخط.

إلى اللقاء

#3

أعتقد أن الأخ chik أوفي بالغرض, لكن أمر المداخل والمخارج التي تحثت عنها يبقى غامضاً, هل سألت نفسك ماذا يحدث بالداخل؟!! إن Lineto هو تطبيق لألغوريتم Bresenham أو Midpoint Algorithm وهو أيضاً مستخدم في رسم الدوائر على أشكالها.

بالنسبه لباقي المنحنيات فهناك الغورثمات أخرى لتطبيقها: كـspline, Bezier واخرون.. أنه موضوع ممتع أنصحكم بتعلمه :)

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

#4

اسف لم أجد لدي كود "صافي" لرسم خط, ذلك لأني غيرت فيه بعض الأمور (قلتلكم:)!!), هنا كود يمثل ألغورثم برزنهام:

void Gfx_Vertual_Dump::flat_line (int _x1, int _y1, double _z1, int _x2, int _y2, double _z2, Gfx_Color _color, Active_Type _type) {

double dx, dy;

double dz, dz2;

double i, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2;

double CurrentX;

double CurrentY;

double CurrentZ;

CurrentX = _x1;

CurrentY = _y1;

CurrentZ = _z1;

dx = _x2 - _x1;

dy = _y2 - _y1;

dz = _z2 - _z1;

x_inc = (dx < 0) ? -1 : 1;

l = abs(dx);

y_inc = (dy < 0) ? -1 : 1;

m = abs(dy);

z_inc = (dz < 0) ? -1 : 1;

n = abs(dz);

dx2 = l * 2;

dy2 = m * 2;

dz2 = n * 2;

if ((l >= m) && (l >= n)) {

err_1 = dy2 - l;

err_2 = dz2 - l;

for (i = 0; i < l; i++) {

if (buffer[CurrentX][CurrentY].situation != BOUNDARY) {

buffer[CurrentX][CurrentY].set_pixel(CurrentX + minX, CurrentY + minY, CurrentZ, _color, _type);

if (polygon->transp_ena) buffer[CurrentX][CurrentY].transp_ena = true;

}

if (err_1 > 0) {

CurrentY += y_inc;

err_1 -= dx2;

}

if (err_2 > 0) {

CurrentZ += z_inc;

err_2 -= dx2;

}

err_1 += dy2;

err_2 += dz2;

CurrentX += x_inc;

}

} else if ((m >= l) && (m >= n)) {

err_1 = dx2 - m;

err_2 = dz2 - m;

for (i = 0; i < m; i++) {

if (buffer[CurrentX][CurrentY].situation != BOUNDARY) {

buffer[CurrentX][CurrentY].set_pixel(CurrentX + minX, CurrentY + minY, CurrentZ, _color, _type);

if (polygon->transp_ena) buffer[CurrentX][CurrentY].transp_ena = true;

}

if (err_1 > 0) {

CurrentX += x_inc;

err_1 -= dy2;

}

if (err_2 > 0) {

CurrentZ += z_inc;

err_2 -= dy2;

}

err_1 += dx2;

err_2 += dz2;

CurrentY += y_inc;

}

} else {

err_1 = dy2 - n;

err_2 = dx2 - n;

for (i = 0; i < n; i++) {

if (buffer[CurrentX][CurrentY].situation != BOUNDARY) {

buffer[CurrentX][CurrentY].set_pixel(CurrentX + minX, CurrentY + minY, CurrentZ, _color, _type);

if (polygon->transp_ena) buffer[CurrentX][CurrentY].transp_ena = true;

}

if (err_1 > 0) {

CurrentY += y_inc;

err_1 -= dz2;

}

if (err_2 > 0) {

CurrentX += x_inc;

err_2 -= dz2;

}

err_1 += dy2;

err_2 += dx2;

CurrentZ += z_inc;

}

}

if (buffer[CurrentX][CurrentY].situation != BOUNDARY) {

buffer[CurrentX][CurrentY].set_pixel(CurrentX + minX, CurrentY + minY, CurrentZ, _color, _type);

if (polygon->transp_ena) buffer[CurrentX][CurrentY].transp_ena = true;

}

}

#5

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

#6

السلام عليكم,

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

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

هدا مجرد رأيي مع احترامي لجميع آراء الآخرين.

إلى اللقاء.

#7

شكرا لكل من سااهم هنا .

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

ممكن كود بسيط ليرسم خطا مستقيما مثلا.

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

شكرا والى الللقاء.

انتظر ردكم بفارغ الصبر.

اللهم علمنا ما ينفعنا وأنفعنا بما علمتنا أنك أنت العليم الحكيم

سبحان الله وبحمده سبحان الله العظيم

لاحول ولاقوة الا بالله( كنز من كنوز الجنة ).

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

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

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

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

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

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