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

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

بدأه Omar Eladel في 8 أكتوبر 2008 · 41 رد · 12,389 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

مرحبا اخوتى الاعزاء :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:

اطيب المنى :)

#2

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

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

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

مدونة دوال

كيوتي العربي

#3
Omar Eladel كتب:
لغة الواجهة : اتمنى ان تكون الانجليزية لنضعه فى مواقع مثل

اخى محمد

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

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

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

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

#4

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

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

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

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

تم تعديل هذه المشاركة بواسطة مصفوفة في 8 أكتوبر 2008 في 22:54

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

مدونة دوال

كيوتي العربي

#5

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

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

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

النقطة 0 :

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

#6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

تم تعديل هذه المشاركة بواسطة مصفوفة في 9 أكتوبر 2008 في 02:20

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

مدونة دوال

كيوتي العربي

#7

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

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

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

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

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

وفقكم الله

#8

الفئة 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

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

مدونة دوال

كيوتي العربي

#9

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

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

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

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

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

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

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

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

 

[color= #0000ff;]class LineEdit[color= #000000;]:[color= #0000ff;]public QLineEdit

[color= #000000;]{

	[color= #0000ff;]public[color= #000000;]:

		LineEdit[color= #000000;](QWidget[color= #000000;]* [color= #000000;]=[color= #ff0000;]0[color= #000000;]);

[color= #000000;]}

 

LineEdit[color= #000000;]::[color= #808000;]LineEdit[color= #000000;](QWidget[color= #000000;]* parent[color= #000000;])[color= #000000;]:

QWidget[color= #000000;](parent[color= #000000;])

[color= #000000;]{

	QStringList s;

	s[color= #000000;]<<[color= #A31515;]"([0-9e(pi)[color= #A31515; font-weight: bold;]+[color= #A31515; font-weight: bold;]-[color= #A31515; font-weight: bold;]/[color= #A31515; font-weight: bold;]*x[color= #A31515; font-weight: bold;]([color= #A31515; font-weight: bold;])[color= #A31515; font-weight: bold;],]|(sin[color= #A31515; font-weight: bold;]()|(cos[color= #A31515; font-weight: bold;]()|(acos[color= #A31515; font-weight: bold;]()|(asin[color= #A31515; font-weight: bold;]()|(tan[color= #A31515; font-weight: bold;]()|(atan[color= #A31515; font-weight: bold;]()
|(log[color= #A31515; font-weight: bold;]()|(logb[color= #A31515; font-weight: bold;]()|(log10[color= #A31515; font-weight: bold;]()|(abs[color= #A31515; font-weight: bold;]())*";

	QRegExpValidator [color= #000000;]*v[color= #000000;]=[color= #0000ff;]new QRegExpValidator[color= #000000;](QRegExp[color= #000000;](s[color= #000000;][[color= #ff0000;]0[color= #000000;]][color= #000000;]),[color= #0000ff;]this[color= #000000;]);

	setValidator[color= #000000;](v[color= #000000;]);

[color= #000000;]}

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

 

 

[color= #0000ff;]class Mparse[color= #000000;]:[color= #0000ff;]public QObject

[color= #000000;]{

	Q_OBJECT

 

	[color= #0000ff;]public[color= #000000;]:

		Mparse[color= #000000;]([color= #0000ff;]const QString[color= #000000;]& equation,QWidget[color= #000000;]* parent[color= #000000;]=[color= #ff0000;]0[color= #000000;]);

 

		[color= #007f00;]//... etc

 

[color= #000000;]};

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

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

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

QStringList* equation;

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

QStringList equation;

و :

 

 

[color= #000000;]([color= #000000;]*equation[color= #000000;])[color= #000000;][[color= #ff0000;]4[color= #000000;]][color= #000000;]=[color= #000000;]([color= #000000;]*equation[color= #000000;])[color= #000000;][[color= #ff0000;]6[color= #000000;]][color= #000000;]+[color= #000000;]([color= #000000;]*equation[color= #000000;])[color= #000000;][[color= #ff0000;]5[color= #000000;]][color= #000000;]+[color= #000000;]([color= #000000;]*equation[color= #000000;])[color= #000000;][[color= #ff0000;]1[color= #000000;]][color= #000000;]+[color= #A31515;]"with(Math){"[color= #000000;]+[color= #000000;]([color= #000000;]*equation[color= #000000;])[color= #000000;][[color= #ff0000;]2[color= #000000;]][color= #000000;]+[color= #000000;]([color= #000000;]*equa
tion[color= #000000;])[color= #000000;][[color= #ff0000;]0[color= #000000;]][color= #000000;]+[color= #000000;]([color= #000000;]*equation[color= #000000;])[color= #000000;][[color= #ff0000;]3[color= #000000;]][color= #000000;]+[color= #A31515;]"}";

 

QScriptValue Y[color= #000000;]=engine.[color= #808000;]evaluate[color= #000000;]([color= #000000;]([color= #000000;]*equation[color= #000000;])[color= #000000;][[color= #ff0000;]4[color= #000000;]][color= #000000;]);

عدلها الى :

 

 

equation[color= #000000;][[color= #ff0000;]4[color= #000000;]][color= #000000;]=equation[color= #000000;][[color= #ff0000;]6[color= #000000;]][color= #000000;]+equation[color= #000000;][[color= #ff0000;]5[color= #000000;]][color= #000000;]+equation[color= #000000;][[color= #ff0000;]1[color= #000000;]][color= #000000;]+[color= #A31515;]"with(Math){"[color= #000000;]+equation[color= #000000;][[color= #ff0000;]2[color= #000000;]][color= #000000;]+equation[color= #000000;][[color= #ff0000;]0[color= #000000;]][color= #000000;]+equation[color= #000000;][
3[color= #000000;]][color= #000000;]+[color= #A31515;]"}";

 

QScriptValue Y[color= #000000;]=engine.[color= #808000;]evaluate[color= #000000;](equation[color= #000000;][[color= #ff0000;]4[color= #000000;]][color= #000000;]);

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

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

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

سلام.

#10

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

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

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

[color= #007f00;]#include <QApplication>

[color= #007f00;]#include "parse.h"

[color= #007f00;]#include <QDebug>

 

[color= #0000ff;]int main[color= #000000;]([color= #0000ff;]int argc,[color= #0000ff;]char[color= #000000;]* argv[color= #000000;][[color= #000000;]][color= #000000;])

[color= #000000;]{

	QApplication app[color= #000000;](argc,argv[color= #000000;]);

 

	[color= #0000ff;]int sinTable[color= #000000;][[color= #ff0000;]8[color= #000000;]][color= #000000;]=[color= #000000;]{[color= #ff0000;]0,[color= #ff0000;]30,[color= #ff0000;]45,[color= #ff0000;]60,[color= #ff0000;]90,[color= #ff0000;]180,[color= #ff0000;]270,[color= #ff0000;]360[color= #000000;]};

 

	Mparse p;

	p.[color= #808000;]setText[color= #000000;]([color= #A31515;]"sin(x)"[color= #000000;]);

	[color= #007f00;]//p.show();

	p.[color= #808000;]setEq[color= #000000;]([color= #000000;]);

 

	[color= #0000ff;]for [color= #000000;]([color= #0000ff;]int i[color= #000000;]=[color= #ff0000;]0; i[color= #000000;]<[color= #ff0000;]8; i[color= #000000;]++[color= #000000;])

    [color= #000000;]{

		[color= #0000ff;]float x [color= #000000;]= [color= #000000;](sinTable[color= #000000;][i[color= #000000;]] [color= #000000;]* [color= #ff0000;]3.14159[color= #000000;])[color= #000000;]/[color= #ff0000;]180 ;

		p.[color= #808000;]setX[color= #000000;](x[color= #000000;]);

		p.[color= #808000;]setY[color= #000000;]([color= #000000;]);

		qDebug[color= #000000;]([color= #000000;]) [color= #000000;]<<[color= #A31515;]" sin( "[color= #000000;]<< sinTable[color= #000000;][i[color= #000000;]] [color= #000000;]<< [color= #A31515;]" ) = " [color= #000000;]<<p.[color= #808000;]getY[color= #000000;]([color= #000000;]);

     [color= #000000;]}

 

	[color= #0000ff;]return app.[color= #808000;]exec[color= #000000;]([color= #000000;]);

 

[color= #000000;]}

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

CONFIG += console

سلام.

#11

هذا هو ملف الهيدر 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 في 11 أكتوبر 2008 في 02:36

#12

حصلت تعديلات فى ملف الـ 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

#13

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

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

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

post-132119-1223814191_thumb.png

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

EquPlotter.rar

#14

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

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

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

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

post-132119-1223997099_thumb.png

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

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

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

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

EquPlotter.rar

#15

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

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

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

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

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

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

[color= #0000ff;]void GraphEngine[color= #000000;]::[color= #808000;]drawFunction[color= #000000;]([color= #000000;])

[color= #000000;]{

 

    QPen DrawPen[color= #000000;](plotColor,[color= #ff0000;]1[color= #000000;]);

    Painter[color= #000000;]-[color= #000000;]>setPen[color= #000000;](DrawPen[color= #000000;]);

 

 

	QList[color= #000000;]<QPolygonF[color= #000000;]> list;  [color= #007f00;]// holds list of Polygons .

 

	[color= #0000ff;]bool pointIsUndefined[color= #000000;]=false;  [color= #007f00;]// indicate there is a point where function is undefined.

 

    QPolygonF Curve;  

 

 

    Parser.[color= #808000;]setEq[color= #000000;]([color= #000000;]);

 

    [color= #0000ff;]if [color= #000000;](Parser.[color= #808000;]isValid[color= #000000;]([color= #000000;]) [color= #000000;]== [color= #ff0000;]1[color= #000000;])

    [color= #000000;]{

        QMessageBox[color= #000000;]::[color= #808000;]warning[color= #000000;]([color= #0000ff;]this, tr[color= #000000;]([color= #A31515;]"EquPlotter"[color= #000000;]),tr[color= #000000;]([color= #A31515;]"Error in equation"[color= #000000;]),QMessageBox[color= #000000;]::[color= #808000;]Ok[color= #000000;]);

		return;

    [color= #000000;]}

 

    [color= #0000ff;]else

    [color= #000000;]{

		[color= #0000ff;]int count[color= #000000;]=[color= #ff0000;]0;

        [color= #0000ff;]for [color= #000000;]([color= #0000ff;]double x[color= #000000;]=start; x[color= #000000;]<=end; count[color= #000000;]++[color= #000000;])

        [color= #000000;]{

 

            Parser.[color= #808000;]setX[color= #000000;](x[color= #000000;]);

			Parser.[color= #808000;]setY[color= #000000;]([color= #000000;]);

 

            [color= #0000ff;]if [color= #000000;](Parser.[color= #808000;]isDefined[color= #000000;]([color= #000000;]) [color= #000000;]== [color= #ff0000;]1[color= #000000;])

            [color= #000000;]{

				[color= #0000ff;]if[color= #000000;]( pointIsUndefined [color= #000000;]== [color= #0000ff;]true [color= #000000;])

				[color= #000000;]{

					list.[color= #808000;]append[color= #000000;](Curve[color= #000000;]);

					Curve.[color= #808000;]clear[color= #000000;]([color= #000000;]);

					pointIsUndefined[color= #000000;]=false;

				[color= #000000;]}

 

				Curve [color= #000000;]<< QPointF[color= #000000;](x[color= #000000;]*scale, [color= #000000;]-Parser.[color= #808000;]getY[color= #000000;]([color= #000000;])[color= #000000;]*scale[color= #000000;]);

            [color= #000000;]}

 

			[color= #0000ff;]else

			[color= #000000;]{

				pointIsUndefined[color= #000000;]=true;

				qDebug[color= #000000;]([color= #000000;]) [color= #000000;]<<[color= #A31515;]"Undefined x = "[color= #000000;]<<x;

			[color= #000000;]}

 

 

			[color= #0000ff;]if [color= #000000;]( count [color= #000000;]== [color= #000000;]-start[color= #000000;]*[color= #ff0000;]10 [color= #ff0000;]-1[color= #000000;])

				x[color= #000000;]=[color= #ff0000;]0;

			[color= #0000ff;]else	

				x [color= #000000;]+[color= #000000;]= [color= #ff0000;]0.1;

        [color= #000000;]}

 

		list.[color= #808000;]append[color= #000000;](Curve[color= #000000;]);

    [color= #000000;]}

 

 

	[color= #0000ff;]for[color= #000000;]([color= #0000ff;]int i[color= #000000;]=[color= #ff0000;]0;i[color= #000000;]<list.[color= #808000;]count[color= #000000;]([color= #000000;]);i[color= #000000;]++[color= #000000;])

	[color= #000000;]{	

		qDebug[color= #000000;]([color= #000000;]) [color= #000000;]<<[color= #A31515;]"i: "[color= #000000;]<<i;

		Painter[color= #000000;]-[color= #000000;]>drawPolyline[color= #000000;](list.[color= #808000;]at[color= #000000;](i[color= #000000;])[color= #000000;]);

	[color= #000000;]}

 

    [color= #007f00;]//Check (0,0)

    Painter[color= #000000;]-[color= #000000;]>setPen[color= #000000;](QPen[color= #000000;](QBrush[color= #000000;](Qt[color= #000000;]::[color= #808000;]red[color= #000000;]),[color= #ff0000;]2[color= #000000;])[color= #000000;]);

    Painter[color= #000000;]-[color= #000000;]>drawText[color= #000000;](QPoint[color= #000000;]([color= #ff0000;]0,[color= #ff0000;]0[color= #000000;]), [color= #A31515;]"Zero"[color= #000000;]);

    [color= #007f00;]//End Check

    setPixmap[color= #000000;]([color= #000000;]*Plotter[color= #000000;]);

[color= #000000;]}

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

post-60254-1224075330_thumb.png

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

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

post-60254-1224074590_thumb.png

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

 

			[color= #0000ff;]if [color= #000000;]( count [color= #000000;]== [color= #000000;]-start[color= #000000;]*[color= #ff0000;]10 [color= #ff0000;]-1[color= #000000;])

				x[color= #000000;]=[color= #ff0000;]0;

			[color= #0000ff;]else	

				x [color= #000000;]+[color= #000000;]= [color= #ff0000;]0.1;

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

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

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

تم تعديل هذه المشاركة بواسطة SudaNix في 15 أكتوبر 2008 في 16:01

#16

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

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

بارك الله فيك

#17

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

1/x-1.34223

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

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

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

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

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

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

مدونة دوال

كيوتي العربي

#18

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

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

#19

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

تماشيا مع العصر فقد تم تطوير 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

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

مدونة دوال

كيوتي العربي

#20

السلام عليكم

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

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

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

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

اسف جدا

وفقكم الله

EquPlotter.rar

#21

عملك جميل جدا

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

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

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

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

الباقي جميل .

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

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

مدونة دوال

كيوتي العربي

#22

مصفوفة ،

بارك الله فيك ، لقد جربت الدالة 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 في 19 أكتوبر 2008 في 18:17

#23

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

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

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

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#24

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

فكرة جميلة

#25

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

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

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

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

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

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

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

مدونة دوال

كيوتي العربي

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