• 0
commando161

مشروع رسم المعادلات الرياضية

سؤال

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

مرحبا اخوتى الاعزاء :wub: ,

فى الايام الماضية , اثناء تعلمى Qt مع ++C , كان هناك فكرة برنامج فى مخى منذ ايام تعلمى لـ Visual Basic و هى فكرة برنامج لرسم المعادلات الرياضية , لكن مستواى لم يكن بالمستوى المطلوب لعمل مثل هذا البرنامج .

الان , بعد تعلمى Qt و ++C بمستوى يسمح لى بالمشاركة (و ليس كتابة البرنامج كاملا) فى برنامج مثل هذا لرسم المعادلات .

ندخل فى تفاصيل الموضوع ,,,

اسم البرنامج : EquPlotter (قابل للتغيير مع المناقشة)

اللغة : ++C

لغة الواجهة : اتمنى ان تكون الانجليزية لنضعه فى مواقع مثل SF.net

هدف البرنامج : ادخال معادلة رياضية و يقوم الحاسب برسمها على نافذة البرنامج

المكونات :

  1. GUI
  2. Parser
  3. Graph Engine

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

العلاقات بين المكونات :

GUI -> Parser -> Graph Engine -> GUI

العلاقات سوف تكون بالشكل اعلاه , يعنى المعادلة تأخذ من الواجهة ثم تدخل على الـ Parser ليحولها الى شكل رياضى ثم تذهب الى الـ Graph Engine ليرسمها ثم يعرض الناتج على الواجهة مرة اخرى .

المطلوب الان , نريد تصميم مبدئى للبرنامج , يعنى الاصناف Classes و العلاقات بينها و الوراثة .

نتمنى المشاركة من جميع الاعضاء و لو حتى بفكرة تفيد العمل دون تنفيذ . :happy:

اطيب المنى :)

0

شارك هذا الرد


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

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

  • 0

فكرة جديدة وجدا جميلة :angry:

واريد ان انظم للمشروع ولكن معترض على الواجهة بالإنجليزي فأنا لا أعرف اللغة الإنجليزية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
لغة الواجهة : اتمنى ان تكون الانجليزية لنضعه فى مواقع مثل

اخى محمد

انا قلت اتمنى , يعنى غير محدد + المشروع كله قابل للمناقشة غير جزئين : اللغة C++ , Qt

فكرة جديدة وجدا جميلة :angry:

واريد ان انظم للمشروع ولكن معترض على الواجهة بالإنجليزي فأنا لا أعرف اللغة الإنجليزية

ايه اللى مزعلك بس , عامل لى الوش ده عشان ترعبنى يعنى :P :wub: :wink:

0

شارك هذا الرد


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

طيب معترض على اسم البرنامج بالإنجليزي وشرايك نسميه (رسمع) اختصار لرسم معادلات

وأحب اقوم بخطوة رقم 2

2-محرك لتحويل شكل المعادلات من شكلها النصى الذى يدخله المستخدم الى شكل رياضى يفهمه البرنامج

طبعا بعد الموافقة على تغيير الإسم وسوف اكون معك للنهاية

تم تعديل بواسطه مصفوفة
0

شارك هذا الرد


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

يعنى الاخ محمد (مصفوفة) سيتولى Parser

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

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

النقطة 0 :

وضع تصميم مبدئى للبرنامج , مخطط للاصناف و العلاقات بينها

0

شارك هذا الرد


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

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

الحمدالله وبعد نقاش مطول على الماسنجر انا واخي احمد عصام و اخي عمر العادل

فإننا خرجنا بالقرارات التالية

1- اسم البرنامج ( EquPlotter )

2- الواجهة سوف تكون باللغة الإنجليزية وفي حال امكن فإننا سوف نقوم بصنع ملفات ترجمة للمشروع

3- الإتفاق على فئات المكونات التي حددها الأخ عمر في بداية الموضوع

4- البدء بعد يومين

5- الإنتهاء بعد 4 ايام (مع حدوث نسبة تاخير قد تصل الى يومين زيادة)

6-تقسيم المهام

ا-سأتولى انا موضوع مستكشف المعادلات (parser)

ب- والأخ احمد عصام الواجهة (GUI)

ج-والأخ عمر الرسم(Graph Engine( )

7-سوف يصدر البرنامج برخصة GPL

8-تفاصيل البرنامج

ه- ان المعادلات سوف تكون بلغة ecmascript بإدارة من Qt اذا بإمكانك قول ان هذا المشروع هو تكملة لدروس QtScript

ب-سوف يكون الرسم على pixmap لسرعة التعامل معها وحفظها على جهاز الكمبيوتر بجميع الصيغ ماعذا gif بالإضافة الى ذلك يمكنك التجول في الرسم عن طريق تحريك ورقة الرسم بالفأرة

ج-الواجهة سوف تكون mainWindow بدون الإستعانة بال designer

في حال اي تغير سوف يتم ابلاغكم

تم تعديل بواسطه مصفوفة
0

شارك هذا الرد


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

شكرا لك اخى محمد على مشاركتك فى المشروع ,,,,

بس انا لن استطيع البدء فى محرك الرسم الا فى جزئية واحدة و هى انشاء الـ Widget التى ستحتوى على الـ 2 pixmaps

الاولى التى تحتوى على مكان رسم المعادلة , و الاخرى تحتوى على المحورين X & Y

لكن امامى مشكلة فى فكرة عمل المحاور X & Y متحركين ,, كيف سيتم عملها بطريقة Drag & Drop ؟

شئ اخر , لن استطيع البدء فى نواة الرسم نفسها الا بعد الانتهاء من الـ Parser

وفقكم الله

0

شارك هذا الرد


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

الفئة Mparse

هذه الفئة لإدخال الدوال وإخراج قيم ص(y)

وهي ترث من QLineEdit وتحتوي نظام حماية مدخلات عالي الجودة بالإعتماد على regexp و لايعني انها مضمونة 100%

ولكنها تدعم عدم ادخال قيم ودوال من غير التي يدعمها البرنامج وتدعم تكرارها داخل بعضها البعض بشكل لانهائي

=====================

الدوال والمتغيرات المدعومة

x
pi
e
sin()
cos()
tan()
atan()
acos()
asin()
logb(,)
log()
log10()
abs()

المعاملات

*
/
+
-

غير الدوال والتوابث والمعاملات السابقة فإن مربع النص لا يقبلها .

مثال تكوين دالة

logb(10,sin(3,14159)

نفترض لو انك قمت بالقسمة على 0 او كان ماتحت جذور الدرجة الموجبة عدد سالب او ان القيمة log ذات الأساس غير 0 لها القيمة 0 ماذا يحدث في هذه الحالة

تقوم الدالة isDefined() بإرسال القيمة 0 اي ان القيمة عند نقطة x غير معرفة وبالعكس ترسل القيمة 1 .

لو ان المستخدم قام بنسيان اقفال القوس النهائي وهو الغالب حيث مربع النص لايسمح لك بالوقوع في أخطاء غيرها

فإن الذي يحدث هو التالي الدالة isValid() ترسل القيمة 0

دوال أخرى

void setX(double x);

void setY();

الأولى لإدخال قيمة x

والثانية تقوم بسحب قيمة y بعد حسابها من ecmascript الى c++

دوال مستقبل الإشارات

void setEq(); لنقل المعادلة من مربع النص الى ecmascript حيث يتم تحليلها هناك

غير كذا اتمنى لكم دوام التوفيق

الملفين بالمرفقات

انتقلت المسؤلية مني انا

الى الأخوين احمد وعمر

بسرعة لا تتأخروا :P

Mparse.zip

0

شارك هذا الرد


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

عمل رائع اخي مصفوفة :wink: ،،

على الرغم من اني لم افهم جيدا جزيئة الـ ECMAScript :blush:

لكن لدي ملاحظة بسيطة ، وهي ان الـ Parser يجب ان يكون فئة لحالة وغير موروثة من QLineEdit.

الواجهة يجب ان تكون منفصلة عن الـ Parser ، حيث تقوم بارسال المعادلة المدخلة كـ string الى الـ Parser .

لماذا نفعل كذا ؟ لعدة اسباب ..

منها فصل المكونات عن بعضها ،ايضا علاقة التوارث هنا غير صحيحة 100% فالـ Parser ليس LineEdit، وكذلك بسبب اننا سوف نعمل تكرار داخل الفئة الخاصة برسم المعادلة ، وفي كل مرة يجب ان نمرر قيمة x الى الـ Parser والذي يجب ان يعيد لنا قيمة y ، وهذه المشكلة قد قمت بحلها عبر السكربت فجزاك الله خيرا.

ما هو التعديل الذي اقترحه ؟

انشاء فئة تسمى LineEdit بحيث تكون مخصصة لاستقبال المعادلة .

انسخ الكود
  1.  
  2. [color= #0000ff;]class[/color] LineEdit[color= #000000;]:[/color][color= #0000ff;]public[/color] QLineEdit
  3. [color= #000000;]{[/color]
  4. [color= #0000ff;]public[/color][color= #000000;]:[/color]
  5. LineEdit[color= #000000;]([/color]QWidget[color= #000000;]*[/color] [color= #000000;]=[/color][color= #ff0000;]0[/color][color= #000000;])[/color];
  6. [color= #000000;]}[/color]
  7.  
  8. LineEdit[color= #000000;]::[/color][color= #808000;]LineEdit[/color][color= #000000;]([/color]QWidget[color= #000000;]*[/color] parent[color= #000000;])[/color][color= #000000;]:[/color]
  9. QWidget[color= #000000;]([/color]parent[color= #000000;])[/color]
  10. [color= #000000;]{[/color]
  11. QStringList s;
  12. s[color= #000000;]<<[/color][color= #A31515;]"([0-9e(pi)[color= #A31515; font-weight: bold;][/color]+[color= #A31515; font-weight: bold;][/color]-[color= #A31515; font-weight: bold;][/color]/[color= #A31515; font-weight: bold;][/color]*x[color= #A31515; font-weight: bold;][/color]([color= #A31515; font-weight: bold;][/color])[color= #A31515; font-weight: bold;][/color],]|(sin[color= #A31515; font-weight: bold;][/color]()|(cos[color= #A31515; font-weight: bold;][/color]()|(acos[color= #A31515; font-weight: bold;][/color]()|(asin[color= #A31515; font-weight: bold;][/color]()|(tan[color= #A31515; font-weight: bold;][/color]()|(atan[color= #A31515; font-weight: bold;][/color]()
    |(log[color= #A31515; font-weight: bold;][/color]()|(logb[color= #A31515; font-weight: bold;][/color]()|(log10[color= #A31515; font-weight: bold;][/color]()|(abs[color= #A31515; font-weight: bold;][/color]())*"[/color];
  13. QRegExpValidator [color= #000000;]*[/color]v[color= #000000;]=[/color][color= #0000ff;]new[/color] QRegExpValidator[color= #000000;]([/color]QRegExp[color= #000000;]([/color]s[color= #000000;][[/color][color= #ff0000;]0[/color][color= #000000;]][/color][color= #000000;])[/color],[color= #0000ff;]this[/color][color= #000000;])[/color];
  14. setValidator[color= #000000;]([/color]v[color= #000000;])[/color];
  15. [color= #000000;]}[/color]
  16.  

التعديل الاخر ، في الفئة Mparse ، حيث يجب ان تكون دالة البناء مخصصة لاستقبال المعادلة كسلسة نصية.

انسخ الكود
  1.  
  2.  
  3. [color= #0000ff;]class[/color] Mparse[color= #000000;]:[/color][color= #0000ff;]public[/color] QObject
  4. [color= #000000;]{[/color]
  5. Q_OBJECT
  6.  
  7. [color= #0000ff;]public[/color][color= #000000;]:[/color]
  8. Mparse[color= #000000;]([/color][color= #0000ff;]const[/color] QString[color= #000000;]&[/color] equation,QWidget[color= #000000;]*[/color] parent[color= #000000;]=[/color][color= #ff0000;]0[/color][color= #000000;])[/color];
  9.  
  10. [color= #007f00;]//... etc[/color]
  11.  
  12. [color= #000000;]}[/color];
  13.  
  14.  

وبعدها يجب على مستخدم هذه الفئة "الاخ عمر" استدعاء الدالة setX لوضع قيم x ، ثم يستدعي الدالة getY لكي يكون نقطة QPoint تساعده على رسم الشكل.

الدالة setY ، اعتقد انها خاصة بحل المعادلة، لذلك يجب ان تكون دالة private ، ويتم استدعائها من داخل الدالة getY ، وذلك حتى لا نرهق مستخدم الفئة "الاخ عمر" بدوال كثيرة.

اخيرا ، لا يوجد حاجة لانشاء السلسة :

QStringList* equation;

داخل ال Heap ، فيكفي ان تكتب

QStringList equation;

و :

انسخ الكود
  1.  
  2.  
  3. [color= #000000;]([/color][color= #000000;]*[/color]equation[color= #000000;])[/color][color= #000000;][[/color][color= #ff0000;]4[/color][color= #000000;]][/color][color= #000000;]=[/color][color= #000000;]([/color][color= #000000;]*[/color]equation[color= #000000;])[/color][color= #000000;][[/color][color= #ff0000;]6[/color][color= #000000;]][/color][color= #000000;]+[/color][color= #000000;]([/color][color= #000000;]*[/color]equation[color= #000000;])[/color][color= #000000;][[/color][color= #ff0000;]5[/color][color= #000000;]][/color][color= #000000;]+[/color][color= #000000;]([/color][color= #000000;]*[/color]equation[color= #000000;])[/color][color= #000000;][[/color][color= #ff0000;]1[/color][color= #000000;]][/color][color= #000000;]+[/color][color= #A31515;]"with(Math){"[/color][color= #000000;]+[/color][color= #000000;]([/color][color= #000000;]*[/color]equation[color= #000000;])[/color][color= #000000;][[/color][color= #ff0000;]2[/color][color= #000000;]][/color][color= #000000;]+[/color][color= #000000;]([/color][color= #000000;]*[/color]equa
    tion[color= #000000;])[/color][color= #000000;][[/color][color= #ff0000;]0[/color][color= #000000;]][/color][color= #000000;]+[/color][color= #000000;]([/color][color= #000000;]*[/color]equation[color= #000000;])[/color][color= #000000;][[/color][color= #ff0000;]3[/color][color= #000000;]][/color][color= #000000;]+[/color][color= #A31515;]"}"[/color];
  4.  
  5. QScriptValue Y[color= #000000;]=[/color]engine.[color= #808000;]evaluate[/color][color= #000000;]([/color][color= #000000;]([/color][color= #000000;]*[/color]equation[color= #000000;])[/color][color= #000000;][[/color][color= #ff0000;]4[/color][color= #000000;]][/color][color= #000000;])[/color];
  6.  
  7.  

عدلها الى :

انسخ الكود
  1.  
  2.  
  3. equation[color= #000000;][[/color][color= #ff0000;]4[/color][color= #000000;]][/color][color= #000000;]=[/color]equation[color= #000000;][[/color][color= #ff0000;]6[/color][color= #000000;]][/color][color= #000000;]+[/color]equation[color= #000000;][[/color][color= #ff0000;]5[/color][color= #000000;]][/color][color= #000000;]+[/color]equation[color= #000000;][[/color][color= #ff0000;]1[/color][color= #000000;]][/color][color= #000000;]+[/color][color= #A31515;]"with(Math){"[/color][color= #000000;]+[/color]equation[color= #000000;][[/color][color= #ff0000;]2[/color][color= #000000;]][/color][color= #000000;]+[/color]equation[color= #000000;][[/color][color= #ff0000;]0[/color][color= #000000;]][/color][color= #000000;]+[/color]equation[color= #000000;][[/color]
    3[color= #000000;]][/color][color= #000000;]+[/color][color= #A31515;]"}"[/color];
  4.  
  5. QScriptValue Y[color= #000000;]=[/color]engine.[color= #808000;]evaluate[/color][color= #000000;]([/color]equation[color= #000000;][[/color][color= #ff0000;]4[/color][color= #000000;]][/color][color= #000000;])[/color];
  6.  
  7.  

فهي اكثر مقروئية .

ساعود بعد ترجمة وتشغيل البرنامج ،

اي اقتراحات او تعليقات فيما ذكرته يرحب بها ..

سلام.

0

شارك هذا الرد


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

لقد جربت الفئة ، وعملت معي 100% ..

صراحة انا مستغرب من امكانيات السكربت هذا :).

وهذه دالة ملف الـ main لمن يحب ان يجرب البرنامج .

انسخ الكود
  1. [color= #007f00;]#include <QApplication>[/color]
  2. [color= #007f00;]#include "parse.h"[/color]
  3. [color= #007f00;]#include <QDebug>[/color]
  4.  
  5. [color= #0000ff;]int[/color] main[color= #000000;]([/color][color= #0000ff;]int[/color] argc,[color= #0000ff;]char[/color][color= #000000;]*[/color] argv[color= #000000;][[/color][color= #000000;]][/color][color= #000000;])[/color]
  6. [color= #000000;]{[/color]
  7. QApplication app[color= #000000;]([/color]argc,argv[color= #000000;])[/color];
  8.  
  9. [color= #0000ff;]int[/color] sinTable[color= #000000;][[/color][color= #ff0000;]8[/color][color= #000000;]][/color][color= #000000;]=[/color][color= #000000;]{[/color][color= #ff0000;]0[/color],[color= #ff0000;]30[/color],[color= #ff0000;]45[/color],[color= #ff0000;]60[/color],[color= #ff0000;]90[/color],[color= #ff0000;]180[/color],[color= #ff0000;]270[/color],[color= #ff0000;]360[/color][color= #000000;]}[/color];
  10.  
  11. Mparse p;
  12. p.[color= #808000;]setText[/color][color= #000000;]([/color][color= #A31515;]"sin(x)"[/color][color= #000000;])[/color];
  13. [color= #007f00;]//p.show();[/color]
  14. p.[color= #808000;]setEq[/color][color= #000000;]([/color][color= #000000;])[/color];
  15.  
  16. [color= #0000ff;]for[/color] [color= #000000;]([/color][color= #0000ff;]int[/color] i[color= #000000;]=[/color][color= #ff0000;]0[/color]; i[color= #000000;]<[/color][color= #ff0000;]8[/color]; i[color= #000000;]++[/color][color= #000000;])[/color]
  17. [color= #000000;]{[/color]
  18. [color= #0000ff;]float[/color] x [color= #000000;]=[/color] [color= #000000;]([/color]sinTable[color= #000000;][[/color]i[color= #000000;]][/color] [color= #000000;]*[/color] [color= #ff0000;]3.14159[/color][color= #000000;])[/color][color= #000000;]/[/color][color= #ff0000;]180[/color] ;
  19. p.[color= #808000;]setX[/color][color= #000000;]([/color]x[color= #000000;])[/color];
  20. p.[color= #808000;]setY[/color][color= #000000;]([/color][color= #000000;])[/color];
  21. qDebug[color= #000000;]([/color][color= #000000;])[/color] [color= #000000;]<<[/color][color= #A31515;]" sin( "[/color][color= #000000;]<<[/color] sinTable[color= #000000;][[/color]i[color= #000000;]][/color] [color= #000000;]<<[/color] [color= #A31515;]" ) = "[/color] [color= #000000;]<<[/color]p.[color= #808000;]getY[/color][color= #000000;]([/color][color= #000000;])[/color];
  22. [color= #000000;]}[/color]
  23.  
  24. [color= #0000ff;]return[/color] app.[color= #808000;]exec[/color][color= #000000;]([/color][color= #000000;])[/color];
  25.  
  26. [color= #000000;]}[/color]
  27.  

ولمن يعمل على ويندوز يجب ان يضع السطر الاتي في ملف .pro

CONFIG += console

سلام.

0

شارك هذا الرد


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

هذا هو ملف الهيدر Header الخاص بمحرك رسم المعادلات

انسخ الكود
  1.  
  2. #ifndef GRAPHENGINE_H_INCLUDED
  3. #define GRAPHENGINE_H_INCLUDED
  4. #include <QtGui>
  5. #include <QWidget>
  6. #include "parse.h"
  7.  
  8. class GraphEngine : public QLabel
  9. {
  10. Q_OBJECT
  11.  
  12. public:
  13. GraphEngine(QWidget* parent = 0);
  14. void savePlotter(QString);
  15.  
  16.  
  17. private:
  18. void setPlotter(int, int, QColor, QColor);
  19. void setInterval(int ,int);
  20. QLabel* pixmapContainer;
  21. QPixmap* Plotter;
  22. int width, height, start, end;
  23. QColor bgcolor, plotcolor;
  24. Mparse* Parser;
  25.  
  26. public slots:
  27. void drawFunction();
  28. };
  29. #endif // GRAPHENGINE_H_INCLUDED
  30.  

اى تعليقات ارجو اضافتها حتى يتم تغييرها فى المشروع

GraphEngine.rar

تم تعديل بواسطه Omar Eladel
0

شارك هذا الرد


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

حصلت تعديلات فى ملف الـ Header الخاص بالصنف GraphEngine

تم الانتهاء من ملف GraphEngine.cpp لكن يوجد خطئين لم استطع حلهم اطلاقا ,,,

Errors :

GraphEngine.cpp:14: error: no matching function for call to `QPainter::QPainter(QPixmap**)'

GraphEngine.cpp:16: error: no matching function for call to `GraphEngine::setPixmap(QPixmap*&)'

غير هذا , من المفترض ان الصنف يعمل على اكمل وجه

فارجو من يجد الحل يدلنى عليه لأنى لم استطع حله على الاطلاق

حالة المشروع :

1: تم الانتهاء من الصنف Mparse

2: تم الانتهاء جزئيا من الصنف GraphEngine

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

وفقكم الله

EquPlotter.rar

0

شارك هذا الرد


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

لقد تم حل المشكلة بمساعدة من الاخ محمد العبدلى (مصفوفة) ,,, بارك الله فيه

تم ارفاق الملفات الجديدة

لكن ظهرت مشكلة اخرى ,,, و هى فى الصورة

post-132119-1223814191_thumb.png

ارجو ان يساعدنا احد فى الحل

EquPlotter.rar

0

شارك هذا الرد


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

الحمد لله انهيت الهيكل العظمى للصنف GraphEngine بخير , انهيت حوالى 80% من الكود

يتبقى فقط الجزء الخاص برسم الـ Grid و رسم الـمحاور

انا وضعت الكود حتى يبدأ اخى احمد عصام Sudanix العمل على صنف الواجهة الرئيسية

هذا هو شكل برنامج التجربة لتجربة الصنف ,,

post-132119-1223997099_thumb.png

ملحوظة بسيطة : انا اضفت كلمة Zero باللون الاحمر للتأكد من دالة نقل الاحداثيات , ستجدونها فى الكود بين سطرين تعليق

اخى احمد , انا اضفت دالة setEquation لافصل تعاملك مع صنف Mparse الخاص بـعمل Parsing للمعادلات المدخلة

لكن هناك شئ غريب , عند ادخال معادلة خاطئة لا يتم اعطاء رسالة خطأ بوجود خطأ ما

البرنامج فى المرفقات ,,,

EquPlotter.rar

0

شارك هذا الرد


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

رائع اخي عمر ،،

لكن هناك شئ غريب , عند ادخال معادلة خاطئة لا يتم اعطاء رسالة خطأ بوجود خطأ ما

لان البارسر لا يعطي ذلك :S

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

حيث كل ما اقوم به عند وجود نقطة غير معرفة هو عمل Curve جديد يحوي النقاط التي تلي النقطة غير المعرفة.

وبعد ذلك اقوم برسم كل الـ Curves

انسخ الكود
  1. [color= #0000ff;]void[/color] GraphEngine[color= #000000;]::[/color][color= #808000;]drawFunction[/color][color= #000000;]([/color][color= #000000;])[/color]
  2. [color= #000000;]{[/color]
  3.  
  4. QPen DrawPen[color= #000000;]([/color]plotColor,[color= #ff0000;]1[/color][color= #000000;])[/color];
  5. Painter[color= #000000;]-[/color][color= #000000;]>[/color]setPen[color= #000000;]([/color]DrawPen[color= #000000;])[/color];
  6.  
  7.  
  8. QList[color= #000000;]<[/color]QPolygonF[color= #000000;]>[/color] list; [color= #007f00;]// holds list of Polygons .[/color]
  9.  
  10. [color= #0000ff;]bool[/color] pointIsUndefined[color= #000000;]=[/color]false; [color= #007f00;]// indicate there is a point where function is undefined.[/color]
  11.  
  12. QPolygonF Curve;
  13.  
  14.  
  15. Parser.[color= #808000;]setEq[/color][color= #000000;]([/color][color= #000000;])[/color];
  16.  
  17. [color= #0000ff;]if[/color] [color= #000000;]([/color]Parser.[color= #808000;]isValid[/color][color= #000000;]([/color][color= #000000;])[/color] [color= #000000;]==[/color] [color= #ff0000;]1[/color][color= #000000;])[/color]
  18. [color= #000000;]{[/color]
  19. QMessageBox[color= #000000;]::[/color][color= #808000;]warning[/color][color= #000000;]([/color][color= #0000ff;]this[/color], tr[color= #000000;]([/color][color= #A31515;]"EquPlotter"[/color][color= #000000;])[/color],tr[color= #000000;]([/color][color= #A31515;]"Error in equation"[/color][color= #000000;])[/color],QMessageBox[color= #000000;]::[/color][color= #808000;]Ok[/color][color= #000000;])[/color];
  20. return;
  21. [color= #000000;]}[/color]
  22.  
  23. [color= #0000ff;]else[/color]
  24. [color= #000000;]{[/color]
  25. [color= #0000ff;]int[/color] count[color= #000000;]=[/color][color= #ff0000;]0[/color];
  26. [color= #0000ff;]for[/color] [color= #000000;]([/color][color= #0000ff;]double[/color] x[color= #000000;]=[/color]start; x[color= #000000;]<=[/color]end; count[color= #000000;]++[/color][color= #000000;])[/color]
  27. [color= #000000;]{[/color]
  28.  
  29. Parser.[color= #808000;]setX[/color][color= #000000;]([/color]x[color= #000000;])[/color];
  30. Parser.[color= #808000;]setY[/color][color= #000000;]([/color][color= #000000;])[/color];
  31.  
  32. [color= #0000ff;]if[/color] [color= #000000;]([/color]Parser.[color= #808000;]isDefined[/color][color= #000000;]([/color][color= #000000;])[/color] [color= #000000;]==[/color] [color= #ff0000;]1[/color][color= #000000;])[/color]
  33. [color= #000000;]{[/color]
  34. [color= #0000ff;]if[/color][color= #000000;]([/color] pointIsUndefined [color= #000000;]==[/color] [color= #0000ff;]true[/color] [color= #000000;])[/color]
  35. [color= #000000;]{[/color]
  36. list.[color= #808000;]append[/color][color= #000000;]([/color]Curve[color= #000000;])[/color];
  37. Curve.[color= #808000;]clear[/color][color= #000000;]([/color][color= #000000;])[/color];
  38. pointIsUndefined[color= #000000;]=[/color]false;
  39. [color= #000000;]}[/color]
  40.  
  41. Curve [color= #000000;]<<[/color] QPointF[color= #000000;]([/color]x[color= #000000;]*[/color]scale, [color= #000000;]-[/color]Parser.[color= #808000;]getY[/color][color= #000000;]([/color][color= #000000;])[/color][color= #000000;]*[/color]scale[color= #000000;])[/color];
  42. [color= #000000;]}[/color]
  43.  
  44. [color= #0000ff;]else[/color]
  45. [color= #000000;]{[/color]
  46. pointIsUndefined[color= #000000;]=[/color]true;
  47. qDebug[color= #000000;]([/color][color= #000000;])[/color] [color= #000000;]<<[/color][color= #A31515;]"Undefined x = "[/color][color= #000000;]<<[/color]x;
  48. [color= #000000;]}[/color]
  49.  
  50.  
  51. [color= #0000ff;]if[/color] [color= #000000;]([/color] count [color= #000000;]==[/color] [color= #000000;]-[/color]start[color= #000000;]*[/color][color= #ff0000;]10[/color] [color= #ff0000;]-1[/color][color= #000000;])[/color]
  52. x[color= #000000;]=[/color][color= #ff0000;]0[/color];
  53. [color= #0000ff;]else[/color]
  54. x [color= #000000;]+[/color][color= #000000;]=[/color] [color= #ff0000;]0.1[/color];
  55. [color= #000000;]}[/color]
  56.  
  57. list.[color= #808000;]append[/color][color= #000000;]([/color]Curve[color= #000000;])[/color];
  58. [color= #000000;]}[/color]
  59.  
  60.  
  61. [color= #0000ff;]for[/color][color= #000000;]([/color][color= #0000ff;]int[/color] i[color= #000000;]=[/color][color= #ff0000;]0[/color];i[color= #000000;]<[/color]list.[color= #808000;]count[/color][color= #000000;]([/color][color= #000000;])[/color];i[color= #000000;]++[/color][color= #000000;])[/color]
  62. [color= #000000;]{[/color]
  63. qDebug[color= #000000;]([/color][color= #000000;])[/color] [color= #000000;]<<[/color][color= #A31515;]"i: "[/color][color= #000000;]<<[/color]i;
  64. Painter[color= #000000;]-[/color][color= #000000;]>[/color]drawPolyline[color= #000000;]([/color]list.[color= #808000;]at[/color][color= #000000;]([/color]i[color= #000000;])[/color][color= #000000;])[/color];
  65. [color= #000000;]}[/color]
  66.  
  67. [color= #007f00;]//Check (0,0)[/color]
  68. Painter[color= #000000;]-[/color][color= #000000;]>[/color]setPen[color= #000000;]([/color]QPen[color= #000000;]([/color]QBrush[color= #000000;]([/color]Qt[color= #000000;]::[/color][color= #808000;]red[/color][color= #000000;])[/color],[color= #ff0000;]2[/color][color= #000000;])[/color][color= #000000;])[/color];
  69. Painter[color= #000000;]-[/color][color= #000000;]>[/color]drawText[color= #000000;]([/color]QPoint[color= #000000;]([/color][color= #ff0000;]0[/color],[color= #ff0000;]0[/color][color= #000000;])[/color], [color= #A31515;]"Zero"[/color][color= #000000;])[/color];
  70. [color= #007f00;]//End Check[/color]
  71. setPixmap[color= #000000;]([/color][color= #000000;]*[/color]Plotter[color= #000000;])[/color];
  72. [color= #000000;]}[/color]
  73.  
  74.  

وقد جربتها على الدالة 1/x وعملت بشكل صحيح ، اما مع الدالة tan فلم تعمل ، والسبب هو ان البارسر يتعامل مع جميع النقاط في الدالة tan على انها معرفة :S ، لذلك الصورة تطلع خطا .

post-60254-1224075330_thumb.png

وبخصوص عملية x += 0.1 فهي رائعة لكن سيكون هناك مشكلة بسيطة عندما تكون قيمة x الحالية هي -0.1

فالقيمة التي تليها يفترض ان تكون هي 0 ، لكن الواقع غير كده ، فالقيمة التي ظهرت هي 1.33 كما بالصورة:

post-60254-1224074590_thumb.png

لذلك قمت بحلها كما في الكود السابق:

انسخ الكود
  1.  
  2. [color= #0000ff;]if[/color] [color= #000000;]([/color] count [color= #000000;]==[/color] [color= #000000;]-[/color]start[color= #000000;]*[/color][color= #ff0000;]10[/color] [color= #ff0000;]-1[/color][color= #000000;])[/color]
  3. x[color= #000000;]=[/color][color= #ff0000;]0[/color];
  4. [color= #0000ff;]else[/color]
  5. x [color= #000000;]+[/color][color= #000000;]=[/color] [color= #ff0000;]0.1[/color];
  6.  
  7.  

حيث اننا نعلم عدد التكرارات التي يجب بعدها ان تكون قيمة x=0 .

اخيرا دالة الرسم drawFunction يجب ان تكون في مسلك Thread خاص ، وذلك لانها تاخذ زمن طويل نسبيا ،على الاقل 6 ثواني وانت طالع ..

والى اللقاء ،،

تم تعديل بواسطه SudaNix
0

شارك هذا الرد


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

اخى احمد , حلك رائع , لن انا الان مرهق جدا و عينى تقفل لوحدها من التعب :S

اول لما استيقظ من النوم ان شاء الله سأقرأه بتمعن و تركيز

بارك الله فيك

0

شارك هذا الرد


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

طيب جربها على الدالة

1/x-1.34223

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

انت سوف تجرب القيمة 1.1 ومن ثم 1.2 وبعدها تجرب 1.3 ويليه 1.4 فبذلك لم تجرب القيمة1.34223

فأنت في الحقية لم تجرب القيمة الغير معرفة حتى تتوقع من البارسر انه يرسلك قيمة غير معرفة (لقد قمت بشرحها مليون مرة )

نرجع لمعادلة 1/x فهي بإمكانك حلها لأنها سوف تمر بالصفر حتى لو قمت بتجريب ارقام صحيحة فقط

ونذهب لل tan يا اخواني فهمتكم مليون مرة القيمة الغير معرف هي 1.5707 ومضاعفاتها فيجب ان تجرب هذا الرقم حتى يرسلك قيمة غير معرفة فعندما تجرب 1.5 ثم 1.6 فأين راح الرقم غير معرف فأتمنى انها وصلتلكم المعلومة لإني صراحة تعبت وانا أشرحها

0

شارك هذا الرد


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

اخى محمد , صراحة انا مش فاهم حلك هذا :S

ممكن شرح مبسط و واضح شوية ؟

0

شارك هذا الرد


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

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

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

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

//find the denominator
QStringList Mparse::denom(){
QStringList strs,curr;
QString s,m=eq;
int n=0;
if(!m.contains("/"))return strs;
QRegExp reg("(/\\([^\\(\\)/]+)");
while(n=reg.indexIn(m,n)){
if(n==-1)break;
n += reg.matchedLength();
curr<<reg.cap(1);
}
n=0;
reg=QRegExp("(/[^\\+\\-/\\*\\(\\)]+)");
while(n=reg.indexIn(m,n)){
if(n==-1)break;
n += reg.matchedLength();
curr<<reg.cap(1);
}
foreach(s,curr){
s.remove(0,1);
if(s.contains("("))s.remove(0,1);
if(s.contains("x") && !strs.contains(s))strs<<s;
}
if(m.contains("tan"))strs<<"tan()";
return strs;
}

وانتقلت الراية الآن الى الأخ أحمد

على أمل ان نقبض على عمر

في امان الله

Mparse.rar

0

شارك هذا الرد


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

السلام عليكم

شئ رائع اخى محمد تطوير صنف Mparse ,, بارك الله فيك

انا انهيت صنف الـ GraphEngine ,, المتبقى لكم هو اضافة عمل دالة denom() الجديدة فى صنف MParse لأنى لم اعرف كيف استخدمها

لكن انا الان انهيت الصنف بكل دواله ,, اى تعديل ارجو اضافة بجواره تعليق عن التعديل حتى نستفيد منه

اسف لعدم الدخول على الـ msn , لكن اعذرونى , مشغول فى الدراسة

اسف جدا

وفقكم الله

EquPlotter.rar

0

شارك هذا الرد


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

عملك جميل جدا

لكن دوال مثل scale و تحديد مركز الإحداثيات وأي شيئ قابل لأن يكون qreal فمن الأفضل ان تجعله يستقبل qreal

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

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

او تكون مخرجات برنامج QDataStream فهمت كيف .

الباقي جميل .

وبالنسبة لموضوع setWindow و قائمة الجواسيس فتم حذفهم (حتى لاتهرب) :P

0

شارك هذا الرد


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

مصفوفة ،

بارك الله فيك ، لقد جربت الدالة denom بشكل خفيف وعملت معي بنجاح .

Omar Eladel ،،

جزاك الله خيرا ، ايضا لقد جربت المحرك ، وقام بالرسم بشكل رائع.

ماذا تبقى الان ؟

1- تبقى حل مشكلة النقاط التي تكون فيها الدالة غير معرفة ، مثلا الدالة tan معرفة في جميع قيم x ، ما عدا في النقاط الاتية :

:(

ما هي الحلول المقترحة لهذه المشكلة ؟

اقترح استخدام الدالة الارضية floor function او الدالة السقفية ceiling function وذلك لتقريب الاعداد.

مثلا :

ceil(pi/2) = 2
floor(pi/2) = 1

هل يوجد مشكلة من تنفيذ هذا ؟

2- الشيء المتبقي الاخر هو عمل واجهة للبرنامج وربط المكونات مع بعضها ،، وهذه شغلة بسيطة.

بانتظار مقترحاتكم قبل البدء ..

الى اللقاء ،،

post-60254-1224429326_thumb.png

تم تعديل بواسطه SudaNix
0

شارك هذا الرد


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

حبذا أيضا بعد تصميم الفئة التي تعمل بالتنصيف أو رافسون أن تكون قابلة للإستعمال بسهولة في أي برنامج آخر لتضاف كمكتبة جاهزة في قسم الرياضيات هنا :

مرجع لخوارزميات ببرامجها الخاصة

طبعا بعد إضافته كموضوع جديد لنضيفه كمدخل للفهرس :)

0

شارك هذا الرد


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

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

فكرة جميلة

0

شارك هذا الرد


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

بما ان المحرك يرسم النقاط بمسافة واحد فأقترح تقريب النقاط الغير معرفة الى جزء من 100 للعلم ان البارسر يسمح لك بأربع خانات بعد الفاصلة

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

ومشكلة السرعة كما ذكرت هي المشكلة الرئيسية في عملنا فكل طرق الإلتفاف التي نستخدمها الى الآن

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

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

سائلا المولى التوفيق .

0

شارك هذا الرد


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

اخى Sudanix , انا جعلت الزيادة بمقدار 1 فى الرسم حتى تكون التجربة سريعة , لكن لا مانع من تغييرها او حتى اضافة parameter فى دالة SetPlotter لتحديد دقة الرسم بجعل الزيادة 1 او حتى 0.0001

بالنسبة لموضوع دالة tan , هذه شغلتكم :D لأن مستواى فى الرياضيات قليل (الثانوية العامة فقط) , وفقكم الله فيه

0

شارك هذا الرد


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

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

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