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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2010, 22:18   #1
Tonik_A
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 23
Вопрос Canvas - оси координат, масштаб

Здравствуйте, пожалуйста, помогите дописать программу! Нужно сделать оси координат и масштаб.
Программа строит график, я задал функцию, организовал цикл, теперь не могу построить оси в Canvas и решить проблему с масштабом.
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit3: TEdit;
    Label3: TLabel;
    Edit4: TEdit;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
  x,y:integer;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
const e=2.72;
var a,t1,t2,shag,z,itoe,i,nakop:real;
begin
nakop:=0;
a:=StrToFloat(Edit1.Text);
t1:=StrToFloat(Edit2.Text);
t2:=StrToFloat(Edit3.Text);
shag:=StrToFloat(Edit4.Text);
shag:=abs(shag);
repeat/// Тут цикл, к первому пределу прибавляет шаг, записывает в переменную nakop, как переменная станет равна второму пределу цикл прервётся.
///Отметка точки.
x:=Trunc(a*(exp(t1*ln(e)))); /// Считаю x.
y:=Trunc(a*t1*(exp(t1*ln(e)))); /// Считаю y.
Form1.Canvas.MoveTo(x,y); /// Отмечаю полученные значения на графике.
nakop:=t1+shag+nakop;
until nakop=t2;
end;
 
end.
-------------------------
Спасибо.
Tonik_A вне форума Ответить с цитированием
Старый 05.07.2010, 23:02   #2
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

Оси
Код:
Form1.Canvas.MoveTo(Form1.Canvas.Width div 2,0);
Form1.Canvas.LineTo(Form1.Canvas.Width div 2,Form1.Canvas.Height);
Form1.Canvas.MoveTo(0 div 2,Form1.Canvas.Height div 2);
Form1.Canvas.LineTo(Form1.Canvas.Width,Form1.Canvas.Height div2);
Правда прийдётся чуток изменить систему показа графика:
ноль будет равен [Form1.Canvas.Width div 2;Form1.Canvas.Height div2]
отрицательные значения для х и у рисуются левее от нуля, и ниже нуля, соответственно.
ZaRDaK вне форума Ответить с цитированием
Старый 05.07.2010, 23:27   #3
Tonik_A
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 23
По умолчанию Спасибо

Спасибо. А как правильно вставить это в программу?
Если есть возможность, вставьте, пожалуйста.
Tonik_A вне форума Ответить с цитированием
Старый 06.07.2010, 09:05   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Глупый вопрос: А не проще взять TChart и пользоваться уже готовым и отлаженным стандартным компонентом?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.07.2010, 09:56   #5
Alex_Almaty
 
Регистрация: 05.07.2010
Сообщений: 6
По умолчанию

есть пример кода, который строит оси и разметкутолько масштаб подправь, он в пикселах.
Код:
procedure DrawXOY(Img:TImage);
var x0,y0,dx,dy,x1,y1:integer;
    f:boolean;
begin
  x0:=Img.Width shr 1;
  y0:=Img.Height shr 1;
  dx:=20;
  dy:=20;
  x1:=x0;
  y1:=y0;
  f:=false;
  with Img.Canvas do
   begin
    MoveTo(x0,y0);
    LineTo(x0+Img.Width,y0);
    LineTo(x0-Img.Width,y0);
    LineTo(x0,y0+Img.Height);
    LineTo(x0,y0-Img.Height);
     repeat
      x1:=x1+dx;
      if (x1>Img.Width) then f:=true
      else
       begin
        MoveTo(x1,y0-3);
        LineTo(x1,y0+3);
       end;
     until f;
     f:=false;

     repeat
      x1:=x1-dx;
      if (x1<0) then f:=true
      else
       begin
        MoveTo(x1,y0-3);
        LineTo(x1,y0+3);
        TextOut(x1-2,y0+2,IntToStr(x1-x0));
       end;
     until f;
     f:=false;

     repeat
      y1:=y1+dy;
      if (y1>Img.Height) then f:=true
      else
       begin
        MoveTo(x0-3,y1);
        LineTo(x0+3,y1);
       end;
     until f;
     f:=false;
     repeat
      y1:=y1-dy;
      if (y1<0) then f:=true
      else
       begin
        MoveTo(x0-3,y1);
        LineTo(x0+3,y1);
        TextOut(x0+2,y1-3,IntToStr(y0-y1));
       end;
     until f;
   end;
end;
пользуйся, мб поможет
Alex_Almaty вне форума Ответить с цитированием
Старый 06.07.2010, 11:40   #6
Tonik_A
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 23
Вопрос

Цитата:
Сообщение от Stilet Посмотреть сообщение
Глупый вопрос: А не проще взять TChart и пользоваться уже готовым и отлаженным стандартным компонентом?
Я тоже думал использовать TChart, это действительно удобно, но я не уверен, что с помощью TChart можно построить нужную мне функцию.
Попробую, может что и получится.

TO Alex_Almaty
Спасибо за код.

Подскажите, пожалуйста: я строю график из отрезков. Изначально я задаю положение пера. Начало второго отрезка во второй итерации цикла, есть конец первого отрезка, начало третьего отрезка в третьей итерации цикла, есть конец второго отрезка и тд.
Как мне это сделать в коде? Для построения в TChart (если он может так строить) или Canvas.
Tonik_A вне форума Ответить с цитированием
Старый 06.07.2010, 11:46   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Tonik_A, Какую функцию?
Я еще не сталкивался с функциями, которые нельзя построить в Chart'e
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.07.2010, 12:06   #8
Tonik_A
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 23
Вопрос

Я затрудняюсь сказать, что там за график получится.
Я понимаю для TChart'a нужно в тело цикла добавить Chart1.Series[0].AddXY(x,y); а координаты при каждой итерации цикла будут меняться, так?
Код примет следующий вид:
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit3: TEdit;
    Label3: TLabel;
    Edit4: TEdit;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
  x,y:integer;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
const e=2.72;
var a,t1,t2,shag,z,itoe,i,nakop:real;
begin
nakop:=0;
a:=StrToFloat(Edit1.Text);
t1:=StrToFloat(Edit2.Text);
t2:=StrToFloat(Edit3.Text);
shag:=StrToFloat(Edit4.Text);
shag:=abs(shag);
repeat/// Тут цикл, к первому пределу прибавляет шаг, записывает в переменную nakop, как переменная станет равна второму пределу цикл прервётся.
///Отметка точки.
x:=Trunc(a*(exp(t1*ln(e)))); /// Считаю x.
y:=Trunc(a*t1*(exp(t1*ln(e)))); /// Считаю y.
Chart1.Series[0].AddXY(x,y); /// Отмечаю полученные значения на графике.
nakop:=t1+shag+nakop;
until nakop=t2;
end;
 
end.
Программа, текст которой я привёл выше зависает .
Я думаю дело в отметке координат. Я пишу: Chart1.Series[0].AddXY(x,y); устанавливаю первую точку, а вторая точка (конец первого, начало второго отрезка) должна быть во второй итерации цикла. Как это записать в программе?

Последний раз редактировалось Stilet; 06.07.2010 в 13:03.
Tonik_A вне форума Ответить с цитированием
Старый 06.07.2010, 13:10   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
const e=2.72;
var a,t1,t2,shag,z,itoe,i,nakop:real;
begin
nakop:=0;
a:=StrToFloat(Edit1.Text);
t1:=StrToFloat(Edit2.Text);
t2:=StrToFloat(Edit3.Text);
shag:=StrToFloat(Edit4.Text);
shag:=abs(shag);
nakop:=t1;

repeat
 x:=Trunc(a*(exp(t1*ln(e)))); /// Считаю x.
 y:=Trunc(a*t1*(exp(t1*ln(e)))); /// Считаю y.
 Chart1.Series[0].AddXY(x,y); /// Отмечаю полученные значения на графике.
 nakop:=t1+shag+nakop;
until nakop<=t2;
end;
А вообще я не понял выражение (nakop:=t1+shag+nakop...
Не проще ли nakop:=shag+nakop;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.07.2010, 13:25   #10
Tonik_A
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 23
По умолчанию

Спасибо. Проще. Смысл в том, что я к первому пределу t1 прибавляю шаг (shag), сумму коплю в переменной nakop, как nakop станет равна второму пределу (t2) выхожу из цикла.
Если сделать shag + nakop, то копиться начнёт от нуля, а нужно что бы от первого предела.
Что то не строит, наверно не понимает где конец отрезка. А концом первого отрезка у меня должно быть начало второго, как так сделать в цикле?

Последний раз редактировалось Tonik_A; 06.07.2010 в 13:29.
Tonik_A вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оси координат) willhunting Фриланс 6 13.06.2010 17:36
масштаб текста в просмоторщиках lisa3281 HTML и CSS 7 10.04.2009 03:12
TСhart, клик мыши и координаты XY, Определение координат оси при клике мыши Aravild Компоненты Delphi 1 31.01.2009 16:28
Масштаб Листов от разрешения монитора valerij Microsoft Office Excel 20 30.09.2008 20:57
Логарифмический масштаб AfzaL Паскаль, Turbo Pascal, PascalABC.NET 2 03.12.2006 12:16