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

كيف يمكن رسم منحنى لدالة معينة

مغلق
بدأه sawy في 5 يونيو 2004 · 6 رد · 2,987 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بصراحة لم استطع ان اجد حل لهذه المشكلة :

كيف يمكن رسم منحنى الدالة س2 .

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

#3

الى اخى العزيز / مهند

للاسف لغة الدلفي لا يوجد بها تعبير بديل لكلمة step كما فى الفيجوال بيسك و هذه احدى مشاكلى مع الدلفي .

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

احمد فكرى

صاحب برنامج فكرى فى حل المعادلات

http://www.schoolarabia.net/Schoolarabia_f/index.htm

#4

أخي sawy صحيح أن تعليمة Step غير موجودة .. ولكن يمكنك تدارك ذلك .. بضرب الحد العلوي للحلقة بنسبة التصغير التي تريدها

يعني إذا كان الحد العلوي 500 ونريد قفزة قدرها 0.01نجعله 50000

ثم عند استعمال متحول الحلقة نقسمه على 100

#5

أخي العزيز

المشكلة ليست في الخطوة step لأن الخطوة هي واحد ولا يمكن ان يكون هناك مسافة بين نقطتين أقل من واحد (إحداثيات النقاط على الشاشة أعداد صحيحة حكماً)

المشكلة تظهر لأنك ترسم المنحني على شكل نقاط

لاحظ أنه عند انتقال س من 1 إلى 2 ستنتقل ع من 1 إلى 4

وطبعا رسم هاتين النقطتين لن يعطيك خطا بيانيا

لحل المشكلة عليك رسم خطوط مستقيمة بين النقاط الناتجة عن الدالة

عن طريق

lineto() moveto()

.................

#6
اقتباس
لاحظ أنه عند انتقال س من 1 إلى 2 ستنتقل ع من 1 إلى 4

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

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

#7

هذة شفرة واحد كنت قد عملتة أيام الدراسة , وهو ممتاز

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,math, ComCtrls,Parsor, Menus, ExtDlgs;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit4: TEdit;
    Label4: TLabel;
    Edit5: TEdit;
    Label5: TLabel;
    ProgressBar1: TProgressBar;
    Panel2: TPanel;
    Button1: TButton;
    CheckBox1: TCheckBox;
    UpDown1: TUpDown;
    UpDown2: TUpDown;
    UpDown3: TUpDown;
    UpDown5: TUpDown;
    Edit6: TEdit;
    Edit7: TEdit;
    UpDown4: TUpDown;
    Label6: TLabel;
    Image1: TImage;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    SavePictureDialog1: TSavePictureDialog;
    procedure Button1Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure CheckBox1Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
     private
    { Private declarations }
  public


 function NewX(x:real):integer; // التحويل من إحداثيات النظامية إلى إحداثيات دلفي
 function NewY(y:real):integer;

  function RealX(x:real):real; // يحول من دلفي إلى رياضية ,,( بعكس ذاك)
 function RealY(y:real):real;


  end;

var
  Form1: TForm1;
 Min,Max, // مجال تعويض التابع
xl, yl,  // عاملي تكبير 
 m:real;  // قيمة التزايد أو الخطوة
t:integer;// لعمل تأخير زمني
x,y:real;
 save:boolean=false;
implementation

{$R *.dfm}



///////

function TForm1.NewX(x:real):integer;
begin
   NewX:=round( x+form1.Width div 2);
end;

function TForm1.NewY(y:real):integer;
begin
   NewY:=round((form1.Height div 2)-y);
end;

/// //

function TForm1.RealX(x:real):real;
begin
   RealX:=x-(form1.Width div 2);
end;

function TForm1.RealY(y:real):real;
begin
   Realy:=(form1.Height div 2) -y;
end;







///




procedure TForm1.Button1Click(Sender: TObject);
var
 TheFunction : String;
    Expression  : TExpress;

begin

 TheFunction :=lowercase(Edit6.Text);
  Expression := TExpress.create(self);
   try
    Expression.Expression :=TheFunction;
    if not(Expression.Error) then
         begin


   Min:=StrToFloat(edit1.Text);
   Max:=StrToFloat(edit7.Text);
   if CheckBox1.Checked then
   edit2.Text :=floattostr(form1.Width / (Max*2));

   xl:=StrToFloat(edit2.Text);
   yl:=StrToFloat(edit3.Text);
   m:=StrTofloat(edit4.Text);
    t:=strtoint(edit5.Text);

   ProgressBar1.Visible:=true;
   form1.Repaint;


   form1.Canvas.MoveTo(NewX(Min*xl) ,NewY(expression.TheFunction(Min,0,0)*yl));
   ProgressBar1.Min:=round(Min);
   ProgressBar1.Max:=round(Max);
   x:=Min;


   while x<Max do begin

   if not save then  // عند حفظ الصورة
   if t>0 then
   sleep(t);

   ProgressBar1.Position:=round(x);

   y := expression.TheFunction(x,0,0);



   form1.Canvas.LineTo(NewX(x*xl),NewY(y*yl));
   form1.Canvas.MoveTo(NewX(x*xl) ,NewY(y*yl));
   x:=x+m;
end;
 end
          else
          showmessage('معادلة خاطئة');


  finally
       Expression.Free;
  end;
   ProgressBar1.Visible:=false;


   end;

procedure TForm1.FormPaint(Sender: TObject);

begin


 form1.Canvas.Pen.Color:=clred;

   form1.Canvas.MoveTo(Form1.Width div 2,0);
   form1.Canvas.LineTo(Form1.Width div 2,form1.Height);

   form1.Canvas.MoveTo(0,Form1.Height div 2);
   form1.Canvas.LineTo(form1.Width,Form1.Height div 2);

form1.Canvas.Pen.Color:=clLime;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  
   Form1.Hint:='x: '+FloatToStr(RealX(x)/(xl)) +' . y: '+FloatToStr(Realy(y)/(yl));

end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
   if CheckBox1.Checked then
   edit2.Enabled:=false
else
   edit2.Enabled:=true;
end;

procedure TForm1.N1Click(Sender: TObject);

var x,y:integer;

begin

if SavePictureDialog1.Execute then begin


 save:=true;
 Button1Click(sender);
 ProgressBar1.Min:=0;
ProgressBar1.Max:=form1.Width;
 ProgressBar1.Visible:=true;

for x:= 0 to form1.Width do
for y:= 0 to form1.Height - Panel1.Height do
begin
ProgressBar1.Position:=x;
if form1.Canvas.Pixels[x,y]<>clBlack then
Image1.Canvas.Pixels[x,y]:=form1.Canvas.Pixels[x,y];
end;
image1.Canvas.TextOut(20,20,'Y= '+edit6.Text);
image1.Picture.SaveToFile(SavePictureDialog1.FileName);
ProgressBar1.Visible:=false;
end;
save:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
xl:=StrToFloat(edit2.Text);
   yl:=StrToFloat(edit3.Text);
   m:=StrTofloat(edit4.Text);
   t:=strtoint(edit5.Text);
end;

end.

تم تعديل هذه المشاركة بواسطة ORWA في 10 يونيو 2004 في 11:31

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

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