Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2017, 16:02   #1
Vyacheslav.
Форумчанин
 
Регистрация: 22.10.2017
Сообщений: 113
Сообщение График функции.

Здравствуйте! Помогите пожалуйста.
Нужно при помощи image1.Canvas добавить в программу вывод плавного графика функции. Но сначала выполняется табуляция функции. Не понимаю как сделать это.. у меня просто прямую линию выводит..
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    GroupBox1: TGroupBox;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    Memo1: TMemo;
    MainMenu1: TMainMenu;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    Image1: TImage;
    N6: TMenuItem;
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    //procedure N6Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
  a1=400;
  b1=200;

var
  Form1: TForm1;
  I:integer;
  y,x: real;
implementation

{$R *.dfm}

procedure TForm1.N3Click(Sender: TObject);
begin
Memo1.Clear;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.N5Click(Sender: TObject);
begin
Memo1.Clear;
end;

procedure TForm1.N2Click(Sender: TObject);
var x,y,h,a,b:real;
cod:integer;
str1,str2:string;
begin
memo1.Lines.Add('X F(x)');
val(edit1.text,a,cod);
val(edit2.text,b,cod);
val(edit3.text,h,cod);
x:=a;
while x<=b+h/2 do
  begin
    y:=sin(x)+1;
    str(x:8:2, str1);
    str(y:8:3, str2);
    if CheckBox1.Checked then memo1.Lines.Add(str1+str2);
    x:=x+h;
  end;
end;

procedure TForm1.N6Click(Sender: TObject);
begin
with image1.Canvas do
begin
  image1.Canvas.FillRect(ClientRect);
  pen.color:=clRed;
  moveTO(0,b1); lineto(2*a1,b1);
  moveTO(a1,0); lineto(a1,2*b1);
  for i:=-a1 to a1 do
  begin
    y:=sin(x*pi*i/a1);
    pixels[i+a1,b1-round(180*y)]:=clNavy;
    application.ProcessMessages;
    end;
end;
end;

end.
Вложения
Тип файла: rar Zad6.rar (175.8 Кб, 6 просмотров)
Vyacheslav. вне форума Ответить с цитированием
Старый 23.11.2017, 18:19   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

what?

Вложения
Тип файла: 7z uCanvasUtils.7z (1.9 Кб, 11 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 24.11.2017, 15:10   #3
Vyacheslav.
Форумчанин
 
Регистрация: 22.10.2017
Сообщений: 113
По умолчанию

Ну и что это?
Vyacheslav. вне форума Ответить с цитированием
Старый 24.11.2017, 16:56   #4
Aptyp
Пользователь
 
Регистрация: 21.03.2007
Сообщений: 12
По умолчанию

Чувак, сложно даже передать насколько ты всё делаешь неправильно.


Первое, прими к сведению: даже когда делаешь быстрый проект, чтобы протестировать что-то всегда давай нормальные говорящие имена компонентам и переменным. А тем более, если ты выкладываешь свой код на форум и просишь в нём разобраться. Никто не хочет разбираться в твоих N1, N2, a1, a2... Причём именна компонентов начинай с типа этого компонента, к примеру кнопка может называтся "buttonDoSmth" / "btnDoSmth" / "bDoSmth". Хотя бы как последний вариант. Я ленивый и так деалю, хотя считаю, что лучше 3 первые буквы отвести под тип компонента будет оптимальнее всего. И переменным не стесняйся давать полные имена. К примеру не a1, a2, а MinXValue и MaxXValue и цикл у тебя получится вида:
Код:
for x := MinXValue to MaxXValue do
	begin
		y := f( x );
...

Второе: забудь про метод TCanvas.Pixels. Это самый медленный способ что-либо нарисовать. Максимум для чего его можно использовать, так это получить ну или установить цвет какого-то пикселя ЕДИНОРАЗОВО, ни в коем случае не в цикле и не у всей картинки. Самое простое для работы с изображениями, не самый быстрый, но в подавляющем большинстве случаев подойдёт, это воспользоваться методом ScanLine (Google в помощь, примеров куча). Но в твоём случае график – это ломанная линия с набором координат, которые между собой нужно соединить линиями. Самый простой способ – это поставить указатель первой точки методом MoveTo и дальше идти по следующим точкам методом LineTo. Но у TCanvas есть замечательный метод на этот случай PolyLine, в который ты передаёшь массив точек TCanvas.Polyline( const Points: array of TPoint ) и он рисует их мгновенно, так как работает напрямую через WinApi. У тебя должно получиться что-то вроде этого:

Код:
var Pixels: Points: array of TPoint;
...
SetLength( Pixels, MaxXValue - MinXValue );
i := 0;
for x := MinXValue to MaxXValue do
	begin
		y := f( x );
		Pixels[ i ] := Point( x, y );
		Inc( i );
	end;
imgGraph.Canvas.Polyline( Pixels );
Ещё нужно тебе учесть, что координатная плоскость на картинке начинается в верхнем левом углу и перевёрнута вертикально.


Третье: использовать Application.ProcessMessages для долгих операций в том числе и рисования не стоит. Приложение не должно подвисать. Все долгие операции нужно выносить в поток. Но! Не работу непосредственно с компонентами, в том числе и рисование на них. Так как это всё равно будет выполняться в основном потоке. Если нужно что-то нарисовать на компоненте, но это требует времени – рисуешь это всё в потоке на TBitMap, а уже готовую картинку методом TCanvas.Draw рисуешь где нужно.
Aptyp вне форума Ответить с цитированием
Старый 24.11.2017, 17:01   #5
Aptyp
Пользователь
 
Регистрация: 21.03.2007
Сообщений: 12
По умолчанию

И ещё: учись сам разбираться. min@y™ дал тебе модуль, в котором реализовано рисование графика. Далеко, конечно, не самый лучший вариант, но вполне рабочий и правильно вполне читаемо написанный. Исходя из него ты вполне мог бы решить свой вопрос сам.

Последний раз редактировалось Aptyp; 24.11.2017 в 17:03.
Aptyp вне форума Ответить с цитированием
Старый 24.11.2017, 17:08   #6
Vyacheslav.
Форумчанин
 
Регистрация: 22.10.2017
Сообщений: 113
По умолчанию

Цитата:
Сообщение от Aptyp Посмотреть сообщение
И ещё: учись сам разбираться. min@y™ дал тебе модуль, в котором реализовано рисование графика. Далеко, конечно, не самый лучший вариант, но вполне рабочий и правильно вполне читаемо написанный. Исходя из него ты вполне мог бы решить свой вопрос сам.
В колледже дали 2 задачи чисто набрать(перепечатать), 1 где строится график функции, другая - табулирование функции. И дали задание объеденить их. Как - не понятно, комментариев к задаче не было, препод сказала что это же элементарно, но как мы без комментариев должны понять что canvas делает..
Vyacheslav. вне форума Ответить с цитированием
Старый 24.11.2017, 17:43   #7
Vyacheslav.
Форумчанин
 
Регистрация: 22.10.2017
Сообщений: 113
Сообщение

Цитата:
Сообщение от Aptyp Посмотреть сообщение
Чувак, сложно даже передать насколько ты всё делаешь неправильно.
как учат, так и делаем..
быстро все развивается, а программа обучения отстает, да и метод у препода фиговый.. чтобы понять что вы написали, нужно, наверное... книжку прочитать.
Изображения
Тип файла: jpg depositphotos_127902868-stock-illustration-male-avatar-and-explosion-brain.jpg (45.7 Кб, 110 просмотров)
Vyacheslav. вне форума Ответить с цитированием
Старый 24.11.2017, 19:14   #8
Aptyp
Пользователь
 
Регистрация: 21.03.2007
Сообщений: 12
По умолчанию

Ну так в чём проблема? Читай книжки, благо не такое трудное занятие. А что делает тот или иной класс и какие у него методы и свойства нужно смотреть в документации. Твой пример:
http://docwiki.embarcadero.com/Libra...Canvas_Methods

Да и что не понятно из сказанного мной?
Aptyp вне форума Ответить с цитированием
Старый 24.11.2017, 20:53   #9
Vyacheslav.
Форумчанин
 
Регистрация: 22.10.2017
Сообщений: 113
По умолчанию

Цитата:
Сообщение от Aptyp Посмотреть сообщение
Ну так в чём проблема? Читай книжки, благо не такое трудное занятие.
ну так если я хочу заняться web-программированием, а в колледже учат delphi и заставляют делать задачи... причем метод обучения фиговый..
Vyacheslav. вне форума Ответить с цитированием
Старый 24.11.2017, 21:29   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от Vyacheslav. Посмотреть сообщение
ну так если я хочу заняться web-программированием, а в колледже учат delphi и заставляют делать задачи... причем метод обучения фиговый..


Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 24.11.2017 в 21:33.
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построить график функции y=x^2. График строится из отрезков и алгоритма Брезенхема Robert_ Помощь студентам 0 20.02.2017 22:37
Затабулировать функцию. график указанной функции и график касательной к ней в точке с абсциссой AntonKalinin01 Помощь студентам 0 26.05.2013 07:18
Bывести на экран монитора и напечатать таблицу значений аргумента и функции, а также график функции средствами Exel IgorMyakota Помощь студентам 1 24.11.2012 02:46
Построить график функции F(x) на заданном интервале с заданным шагом и вывести значения х и функции F(x) в таблицу в графическом р Proskurina Паскаль, Turbo Pascal, PascalABC.NET 8 12.11.2012 21:57
график функции Максикок Помощь студентам 2 02.12.2010 21:33