OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 02:10

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Построение графиков
СообщениеДобавлено: Вторник, 01 Июль, 2008 23:39 

Зарегистрирован: Вторник, 01 Июль, 2008 23:34
Сообщения: 5
о_0 Что это значит о_0

Среди списка модулей я таких зверей не нашёл :(

Короче мне надо построить график тригонометрической функции [ abs(sinx) ], а как это сделать в Blackbox я не имею понятия после многочасового чтения различных мануалов. Вроде надо использовать OpenBezier, но как передать значения функции DrawPath я опять не понимаю :(

Короче я в отчаинии ухожу спать :cry:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Вторник, 01 Июль, 2008 23:58 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Что ж Вы так мучаетесь :-)

Речь была о компонентах из коллекции:
http://www.zinnamturm.eu/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Среда, 02 Июль, 2008 00:56 

Зарегистрирован: Вторник, 01 Июль, 2008 23:34
Сообщения: 5
Поставил компанент lib, но разобраться не смог :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Среда, 02 Июль, 2008 01:06 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Я как-то делал модуль Canvas для простого рисования на отображении, он в составе подсистемы Stern:
download/file.php?id=178

Вот пример использования полилинии:
Код:
   PROCEDURE SetPoint(VAR ap: ARRAY OF Ports.Point; x,y : INTEGER; n: INTEGER);
   BEGIN
         ap[n].x := x; ap[n].y := y;
   END SetPoint;

   PROCEDURE Draw*;
   VAR p: ARRAY 10 OF Ports.Point;
   BEGIN
       SternCanvas.SetBgColor(100,100,1);
      (*подготовка массива точек*)
      SetPoint(p, 10,5, 0);
      SetPoint(p, 40,20, 1);
      SetPoint(p, 80,10, 2);
      SetPoint(p, 160,20, 3);
      SetPoint(p, 200,30, 4);
      SetPoint(p, 180,80, 5);
      SetPoint(p, 120,100, 6);
      SetPoint(p, 80,110, 7);
      SetPoint(p, 40,50, 8);
      SetPoint(p, 10,30, 9);
      SternCanvas.Path(p, 0, SternCanvas.red, SternCanvas.openBezier);
      SternCanvas.Path(p, 0, SternCanvas.blue, SternCanvas.openPoly);
   END Draw;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Среда, 02 Июль, 2008 05:26 

Зарегистрирован: Пятница, 02 Декабрь, 2005 14:35
Сообщения: 210
Откуда: Россия, Томск
Простой пример на сложение двух синусоид (два варианта). Используется модуль упрощенной графики Info21sysTPGraphics. Кривая y=f(x) строится микроотрезками прямой процедурой LineTo. Ширина рисунка - 300 точек.
Код:
MODULE  СборGrm10; 
   IMPORT  Gr := Info21sysTPGraphics, Math;

   PROCEDURE Окр( x: REAL): INTEGER;
   BEGIN
      RETURN SHORT( ENTIER( x + 0.5 ) )
   END Окр;
         
   PROCEDURE Do*;
      VAR  i, k, x, y: INTEGER;
   BEGIN Gr.Clear;   
      Gr.SetColor( 0 ); Gr.SetBkColor( 15 );
      Gr.MoveTo( 0, 70 );
      FOR i := 0 TO 300 DO
         y := 70 - Окр( 15 * Math.Sin( i / 3 ) +
            40 * Math.Sin( i / 30 ) );
         x := i; Gr.LineTo( x, y )
      END;
      Gr.MoveTo( 0, 180 );
      FOR i := 0 TO 300 DO
         y := 180 - Окр( 10 * Math.Sin( i / 1.3 ) +
            30 * Math.Sin( i / 16 ) );
         x := i; Gr.LineTo( x, y )
      END;
      Gr.String(80, 15, "Сложение синусоид");
      Gr.Open
   END Do;

END СборGrm10.

(Q) СборGrm10.Do 

   Здесь показано сложение синусоид с разными периодами и амплитудами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Среда, 02 Июль, 2008 11:14 

Зарегистрирован: Вторник, 01 Июль, 2008 23:34
Сообщения: 5
Сделал с помошью подсистем Bubel, Util и Plot. Работает :lol:

Всё слишком просто. Всем спасибо за код, мб поможет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Четверг, 03 Июль, 2008 12:00 

Зарегистрирован: Среда, 02 Июль, 2008 21:10
Сообщения: 4
вы не могли бы написать как построить график вида y=asinx подробно наскольно это возможно, я никак не могу разобраться в программе!за ранее спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Пятница, 04 Июль, 2008 14:28 

Зарегистрирован: Четверг, 03 Июль, 2008 21:51
Сообщения: 2
Добрый день. Ознакомилась с различными документациями ,описаниями по Black BOX ,но практически построить график функции y=d*x^2+f не смогла . :cry: :cry:

Вроде бы надо использовать подсистему Plot ,но как практически строить (из мануала не поняла).Огромная просьба помочь в написании кода этой задачи. Очень жаль ,что просидела бессоные ночи и в отчаянии потеряла надежду :( ,что смогу одолеть эту программу :cry: Заранее благодарна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Пятница, 04 Июль, 2008 15:32 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Я с подсистемой Plot не знаком. Поэтому приведу пример, как построить график функции y=d*x^2+f с помощью подсистемы Canvas.

1. В новом модуле SternObx1 создал процедуру Draw* (см. ниже исходный текст модуля).
2. Открыл пустую форму и в меню выбрал Stern, Вставить холст. Отображение холста появилось на форме.
3. В свойстве link отображения указал SternObx1.Draw и нажал OK.

Всё.

Исходный текст модуля:
Код:
MODULE SternObx1;

   IMPORT SternCanvas;

   (* y=d*x^2+f  *)
   (* начало координат располагается в левом верхнем углу *)
   
   CONST
      d = 1; f = 1;
      scale = 500; (* масштабный коэффициент для ординаты *)
   
   PROCEDURE Y (x: INTEGER) : INTEGER;
   BEGIN
      RETURN d*(x*x)+f
   END Y;

   PROCEDURE SetPoint(VAR ap: ARRAY OF SternCanvas.Point; x: INTEGER; n: INTEGER);
   BEGIN
         ap[n].x := x; ap[n].y := Y(x) DIV scale;
   END SetPoint;

   PROCEDURE Draw*;
   VAR p: ARRAY 10 OF SternCanvas.Point;
   BEGIN
       SternCanvas.SetBgColor(200,200,200);
      (*подготовка массива точек*)
      SetPoint(p, 20, 0);
      SetPoint(p, 40, 1);
      SetPoint(p, 60, 2);
      SetPoint(p, 80, 3);
      SetPoint(p, 100, 4);
      SetPoint(p, 120, 5);
      SetPoint(p, 140, 6);
      SetPoint(p, 160, 7);
      SetPoint(p, 180, 8);
      SetPoint(p, 200, 9);
      SternCanvas.Path(p, 0, SternCanvas.blue, SternCanvas.openPoly);
   END Draw;

END SternObx1.


P.S. Подсистема Canvas требует наличие подсистемы Abf. Привожу ссылки для скачивания.

Подсистема Abf: http://store.oberoncore.ru/BlackBox/com ... 0070730.7z
Подсистема Canvas: download/file.php?id=178


Вложения:
SternObx1.gif
SternObx1.gif [ 28.72 КБ | Просмотров: 16476 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Пятница, 04 Июль, 2008 17:13 

Зарегистрирован: Четверг, 03 Июль, 2008 21:51
Сообщения: 2
Проверила :) , работает программа отлично ,помогли подсиситемы ABF и ваш модуль Canvas.

Большое спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Пятница, 04 Июль, 2008 17:15 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Уважаемые,

а скажите, пожалуйста, откуда у стольких человек сразу такой одинаковый интерес к построению таких графиков? :-)

Учебные задания какие-то (но ведь лето)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Пятница, 04 Июль, 2008 17:28 

Зарегистрирован: Среда, 02 Июль, 2008 21:10
Сообщения: 4
да это практика , дали программу и сказали разбирайтесь,а через 2 недели принесите построенный график,вот и мучеемся!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Пятница, 04 Июль, 2008 17:37 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
На случай, если кому нужен пример с подсистемой Lib.
Код:
MODULE TestPlot;

   IMPORT LibPlotters, Ports, Log := StdLog;

      (*  y = a*x^2 + b*x + c  *)

   TYPE
      Plot = LibPlotters.Plotter;

   CONST
      SHIFT = 0.1; (*шаг смещения переменной X*)

   PROCEDURE DrawPlot (a, b, c, minX, maxX: INTEGER);
      VAR
         plot: Plot;
         minY, maxY, X, Y, shiftX, shiftY: REAL;
         n: INTEGER;
   BEGIN

      (*создаем новый график и открываем окно с ним*)
      plot := LibPlotters.dir.NewPlotter('');
      LibPlotters.OpenAux(plot, 150, 100, TRUE, 'График функции y = a*x^2 + b*x + c ');

      (*вычисляем максимальное и минимальное значения шкалы Y*)
      IF a > 0 THEN
         minY := - b / (2 * a);
         maxY := a * maxX * maxX + b * maxX + c;
      ELSE
         maxY := - b / (2 * a);
         minY := a * maxX * maxX + b * maxX + c
      END;

      plot.Scale(minX - 1, maxX + 1, minY - 1, maxY + 1);

      (*определяем размеры ячейки сетки координат*)
      shiftX := ENTIER((maxX - minX) / 10);
      shiftY := ENTIER((maxY - minY) / 10);

      (*рисуем сетку координат*)
      plot.Grid(minX - shiftX, maxX + shiftX, shiftX, minY - shiftY, maxY + shiftY, shiftY, - 2, Ports.grey12, FALSE);

      (*рисуем шкалу X*)
      plot.Xaxis(minX, maxX, 1, 5, 2, 0, {});

      (*рисуем шкалу Y*)
      plot.Yaxis(minY, maxY, 1, 5, 0, 0, TRUE, {});

      (*добавляем точки на график и их координаты значения в StdLog*)
      X := minX;
      Y := a * X * X + b * X + c;
      Log.Clear;

      WHILE X <= maxX DO
         Log.Ln;
         Log.RealForm(X, 5, 2, 0, 8FX); Log.String("  "); Log.RealForm(Y, 5, 2, 0, 8FX);
         plot.Point(X, Y, 0, 0, 1, 0, 1, Ports.blue);
         X := X + SHIFT;
         Y := a * (X * X) + b * X + c
      END;

      (*обнавляем график*)
      plot.Update
   END DrawPlot;

   PROCEDURE Do*;
   BEGIN
(*Нарисуем несколько графиков*)
      DrawPlot(1, 2, 0, - 14, 10);
      DrawPlot(-2, 3, 1, - 14, 10);
      DrawPlot(4, 5, 2, -5, 5);
   END Do;

END TestPlot.

 TestPlot.Do


Графики хорошо масштабируются при изменении размеров окна.
Ссылка на подсистему Lib: http://www.zinnamturm.eu/downloadsIN.htm#Lib


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Пятница, 04 Июль, 2008 17:54 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Что-то я модуль подсистемой назвал. Либо это что-то значит, либо одно из двух :)

Кстати, о птичках. Я скопировал вышеприведённый пример "СборGrm10" в свой BlackBox, и компилятор не смог откомпилировать - русские буквы оказались каким-то "не такими". Проблема только с браузером Opera 9.50, а копирование из окна Internet Explorer'а прошло нормально.

Загадка природы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Пятница, 04 Июль, 2008 22:50 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Иван Кузьмицкий писал(а):
Что-то я модуль подсистемой назвал. Либо это что-то значит, либо одно из двух :)
Ветер дует повсеместно...
Цитата:
Кстати, о птичках. Я скопировал вышеприведённый пример "СборGrm10" в свой BlackBox, и компилятор не смог откомпилировать - русские буквы оказались каким-то "не такими". Проблема только с браузером Opera 9.50, а копирование из окна Internet Explorer'а прошло нормально.

Загадка природы.

Всё правильно. Там скопировалось... склероз, по-моему сразу в юникод, а компилятор не понимает идентификаторы в юникоде.

P.S. Хе-хе... масштабирование предпросмотра картинок на форуме заработало...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Суббота, 05 Июль, 2008 06:20 

Зарегистрирован: Пятница, 02 Декабрь, 2005 14:35
Сообщения: 210
Откуда: Россия, Томск
Борис Рюмшин писал(а):
Всё правильно. Там скопировалось... склероз, по-моему сразу в юникод, а компилятор не понимает идентификаторы в юникоде.


Похоже, так в версии 1.5. А как с этим в 1.6, кто-нибудь знает?? В ней авторы заявили о якобы полной юникодизации ББ!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Суббота, 05 Июль, 2008 07:43 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Я пробовал копировать как в 1.5re026, так и в 1.6-rc5, с Оперой результат одинаковый.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Суббота, 05 Июль, 2008 10:15 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Иван Кузьмицкий писал(а):
Я пробовал копировать как в 1.5re026, так и в 1.6-rc5, с Оперой результат одинаковый.


Подозреваю, что простенькая примочка, конвертирующая CHAR в SHORTCHAR или обратно в выделенном куске текста, просто и удобно решит проблему.

Плюс, возможно, нечто, что поочередно выделяет фрагменты SHORTCHAR в открытом тексте -- подобно сравнению текстов по F9.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Суббота, 05 Июль, 2008 11:47 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Вячеслав Бойко писал(а):
На случай, если кому нужен пример с подсистемой Lib.
...

Для сравнения, как эта задача решается на Питоне ;)
Код:
from numpy import *
from pylab import *

x = arange(0, 10, 0.01)
y = abs(sin(x))

plot(x, y)
show()


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построение графиков
СообщениеДобавлено: Суббота, 05 Июль, 2008 12:43 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
(Если меряться кой-чем - то в GnuPlot-е ещё короче будет :-) тока не в счёте строк щазтье.. особенно если вспомнить про сотни ошибок в Питоновском ядре, про что Губанов как-то рассказывал).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB