014 - Разработка программы рисования графика функции двух переменных z = f (x, y)

  1. содержание
  2. Математическая постановка задачи
  3. выполнение
  4. 2. Разработка главной формы Form1
  5. 3. Разработка второстепенной формы Form2
  6. 4. Ввод внутренних переменных в Form2
  7. 5. Ввод внутренних методов в текст модуля "Unit2.pas"
  8. 6. Программирование обработчиков событий клика на кнопках вращения графику в форме Form2
  9. 7. Программирование обработчика события активизации формы Form2
  10. 8. Программирование обработчиков событий вращения графику с помощью мышки
  11. 9. Программирование события клика на кнопке «Показать 3D график ...» из формы Form1.
  12. 10. Запуск приложения на выполнение

В данной работе описано как в отдельной форме реализовать график функции двух переменных

z = f (x, y)

или другими словами график в трехмерном пространстве (3D).

В качестве примера, выбрано функцию

z = sin (x) + cos (y)

Используя данный пример можно создавать собственное программное обеспечение для рисования графиков для других функций двух переменных.

содержание

Условие задачи

Дано формулу функции двух переменных z = sin (x) + cos (y). Разработать приложение, которое рисует график этой функции в отдельной форме.

Дополнительно реализовать поворот графику влево, вправо, вверх, вниз. Также нужно выводить оси X, Y, Z.

Математическая постановка задачи

Построение графика функции двух переменных является задачей, которая математически решена и использует известные формулы вычисления.

График функции двух переменных z (x, y) строится в параллелепипеде с размерами (xx1, xx2), (yy1, yy2), (zz1, zz2).

Для использования поворота системы в 3-мерном пространстве возникает понятие точки (x0, y0, z0), относительно которой происходит поворот системы.

Также возникает понятие углов:

Оползень в точку (x0, y0, z0) с учетом поворота на углы Оползень в точку (x0, y0, z0) с учетом поворота на углы   и   описывается известными соотношениями и описывается известными соотношениями

После перемножения матриц получаем формулу для вычисления:

Рис. 1. Смещение и поворот системы координат

Необходимо определиться, в какой плоскости монитора будут лежать оси координат OX, OY, OZ. Принимаем, что в плоскости монитора лежат оси OX и OY. А вот OZ перпендикулярна экрану.

Координаты рассчитываемый точки (x, y) прижимаются к точке (0, 0) по формулам:

где A, a - коэффициенты перспективы, которые подбираются экспериментально в зависимости от функции.

выполнение

1. Запустить Delphi. Создать проект по шаблону VCL Forms Application

Детальный пример создания проекта описывается здесь . Сохранить проект под произвольным именем. В результате будет создан главную форму программы с именем Form1. Файл главной формы имеет имя "Unit1.pas".

2. Разработка главной формы Form1

Создать главную форму по образцу, как показано на рисунке 2.

Рис. 2. Показать формы Form1

На форме размещается компонент типа TButton, который предназначен для вызова обработчика события отображения графика функции. В результате образуется объект с именем Button1.

С помощью Object Inspector в компоненте Button1 нужно настроить свойство Caption в значение «Показать 3D график ...».

3. Разработка второстепенной формы Form2

Создать форму Form2 как показано на рисунке 3. Эта форма будет отображать график функции. Пример создания новой формы описывается здесь .

Форма Fom2 размещается в модуле "Unit2.pas".

pas

Рис. 3. Вид Form2 вывода графика функции

С палитры Tool Palette на форме размещаются компоненты следующих типов:

  • вкладке Standard четыре компонента типа TButton, представляющих стрелки направлений вращения графику функции. В результате образуется четыре объекта-переменные с именами Button1, Button2, Button3, Button4;
  • вкладке Additional компонент типа TImage, в котором будет отображаться график функции. Создается объект с именем Image1.

С помощью Object Inspector осуществить настройку таких компонентов:

  • в компоненте Button1 свойство Caption = "^";
  • в компоненте Button2 свойство Caption = "v";
  • в компоненте Button3 свойство Caption = "<<";
  • в компоненте Button4 свойство Caption = ">>".

4. Ввод внутренних переменных в Form2

Все внутренние переменные, используемые для организации вывода графику, размещаются в форме Form2. Поэтому, сначала надо активизировать модуль «Unit2.pas».

В модуль формы Form2 в разделе private вводятся следующие внутренние переменные:

  • xx1, xx2, yy1, yy2 - отвечают координатам точек отображаемых на экране монитора;
  • массивы xx и yy которые предназначены для вывода плоскости с 4-х точек. Область определения функции z = f (x, y) разбивается на прямоугольники, на каждом из которых функция экстраполируется с ребрами четырехугольника.

В разделе public вводятся:

  • переменные X_min, Y_min, X_max, Y_max действительного типа, соответствующих реальным координатам параллелепипеда, в котором выводится график функции. Эти переменные заполняются основной формы Form1 экспериментальным путем;
  • переменные alfa, beta действительного типа, отражающие углы наблюдения за графиком функции. Заполняются основной формы Form1;
  • переменные x0, y0, z0 действительного типа. Отражают величины с основной формулы вычисления (см. Математическую постановку задачи)
  • переменная A действительного типа является коэффициентом перспективы и подбирается экспериментально;
  • переменная f_show логического типа, используется для указания того, что нужно перерисовать график в случае изменения положения одного из углов alfa или beta.

После введения переменных в текст программы, фрагмент класса формы Form2 имеет вид:

type

TForm2 = class (TForm) ... private {Private declarations} xx1, xx2, yy1, yy2: integer; xx, yy: array [0 .. 3] of integer; public {Public declarations} // Данные, которые заполняются формы Form1 X_min, Y_min, X_max, Y_max: real; alfa, beta: real; x0, y0, z0: real; A: real; f_show: boolean; ... end;

Переменные из раздела public заполняются формы Form1.

5. Ввод внутренних методов в текст модуля "Unit2.pas"

В текст класса формы Form2 нужно ввести три дополнительные методы:

  • процедуру преобразования системы координат и масштабирование Zoom_XY;
  • функцию func для которой выводится график;
  • процедуру рисования графика функции Show_Graphic.

После введения внутренних методов, фрагмент листинга класса Form2 следующий:

type

TForm2 = class (TForm) ... private {Private declarations} xx1, xx2, yy1, yy2: integer; xx, yy: array [0 .. 3] of integer; // внутренние методы procedure Zoom_XY (x, y, z: real; var xx, yy: integer); procedure Show_Graphic; function func (x, y: real): real; public {Public declarations} // Данные, которые заполняются формы Form1 X_min, Y_min, X_max, Y_max: real; alfa, beta: real; x0, y0, z0: real; A: real; f_show: boolean; end; ...

Листинг процедуры преобразования системы координат следующий:

procedure

TForm2.Zoom_XY (x: Real; y: Real; z: Real; var xx: Integer; var yy: Integer); var tx, ty, tz: real; xn, yn, zn: real; begin tx = (x-x0) * cos (alfa) - (y-y0) * sin (alfa) ty = ((x-x0) * sin (alfa) + (y-y0) * cos (alfa)) * cos (beta) - (z-z0) * sin (beta) tz = ((x-x0) * sin (alfa) + (y-y0) * cos (alfa)) * sin (beta) + (z-z0) * cos (beta) xn = tx / (tz / A + 1); yn = ty / (tz / A + 1); xx = Trunc (Image1.Width * (xn-X_min) / (X_max-X_min)) yy = Trunc (Image1.Height * (yn-Y_max) / (Y_min-Y_max)) end;

Непосредственное вывода графика функции реализованы в процедуре Show_Graphic. Листинг процедуры Show_Graphic следующий.

procedure

TForm2.Show_Graphic; const h = 0.1; h0 = 0 var i, j: integer; canv: TCanvas; begin canv = Image1.Canvas; // полотно для рисования // очистки полотна (канвы) canv.Rectangle (1, 1, Image1.Width, Image1.Height) // рисования осей Zoom_XY (0, 0, 0, xx1, yy1) Zoom_XY (1.2, 0, 0, xx2, yy2) canv.MoveTo (xx1, yy1) canv.LineTo (xx2, yy2) canv.TextOut (xx2 + 3, yy2, 'X'); Zoom_XY (0, 0, 0, xx1, yy1) Zoom_XY (0, 1.2, 0, xx2, yy2) canv.MoveTo (xx1, yy1) canv.LineTo (xx2, yy2) canv.TextOut (xx2 + 3, yy2, 'Y'); Zoom_XY (0, 0, 0, xx1, yy1) Zoom_XY (0, 0, 1.2, xx2, yy2) canv.MoveTo (xx1, yy1) canv.LineTo (xx2, yy2) canv.TextOut (xx2 + 3, yy2-3, 'Z'); // рисования поверхности for j: = 0 to 9 do for i: = 0 to 9 do begin Zoom_XY (h0 + h * i, h0 + h * j, func (h0 + h * i, h0 + h * j), xx [0] yy [0]); Zoom_XY (h0 + h * i, h + h * j, func (h0 + h * i, h + h * j), xx [1], yy [1]); Zoom_XY (h + h * i, h + h * j, func (h + h * i, h + h * j), xx [2], yy [2]); Zoom_XY (h + h * i, h0 + h * j, func (h + h * i, h0 + h * j), xx [3], yy [3]); canv.Polygon ([Point (xx [0] yy [0]), Point (xx [1], yy [1]), Point (xx [2], yy [2]), Point (xx [3] , yy [3])]) end; end;

Поясним некоторые фрагменты кода в процедуре Show_Graphic.

Область определения функции z = f (x, y) разбивается на прямоугольники, на каждом из которых функция экстраполируется с ребрами четырехугольника. Построение четырехугольников на экране реализуется с помощью метода Polygon ().

После очистки канвы происходит рисования осей координат и методом Polygon () выводятся фрагменты поверхности.

При рисовании поверхности, по процедуре Show_Graphic вызывается процедура Zoom_XY (), которая осуществляет преобразование и масштабирование из реальных координат в экранные координаты.

Листинг метода func () следующий.

function

TForm2.func (x: Real; y: Real): real; begin func = sin (x) + cos (y) end;

В этом методе вместо строки

func = sin (x) + cos (y)

можно сделать вставку собственной функции.

6. Программирование обработчиков событий клика на кнопках вращения графику в форме Form2

Вращения графику происходит в момент, когда пользователь делает клик на одной из кнопок расположенных на форме Form2 (компоненты Button1, Button2, Button3, Button4).

Отображение графика зависит от внутренних переменных alfa и beta. Переменная alfa содержит угол поворота относительно оси OZ. Переменная beta содержит значение угла поворота вокруг оси OX.

Поэтому, в обработчиках событий происходит изменение значений alfa и beta на некоторую величину. По желанию, можно установить собственную величину изменения alfa и beta.

Листинг обработчиков событий приведен ниже.

procedure

TForm2.Button1Click (Sender: TObject); begin beta = beta + 0.1; Show_Graphic; end; procedure TForm2.Button2Click (Sender: TObject); begin beta = beta - 0.1; Show_Graphic; end; procedure TForm2.Button3Click (Sender: TObject); begin alfa = alfa + 0.1; Show_Graphic; end; procedure TForm2.Button4Click (Sender: TObject); begin alfa = alfa - 0.1; Show_Graphic; end;

7. Программирование обработчика события активизации формы Form2

В момент вызова формы Form2 имеет выводиться график функции. Поэтому в обработчике события OnActivate формы Form2 вызывается метод Show_Graphic.

procedure

TForm2.FormActivate (Sender: TObject); begin Show_Graphic; end;

8. Программирование обработчиков событий вращения графику с помощью мышки

Для осуществления вращения графику с помощью мышки нужно запрограммировать соответствующие обработчики событий компонента Image1.

Если нажать клавишу мыши и удерживать ее нажатой над компонентом Image1 а затем отпустить, то генерируются такие события (рисунок 4):

  • OnMouseDown - генерируется, когда пользователь делает клик мышкой на компоненте Image1;
  • OnMouseMove - генерируется, когда пользователь перемещает мышь над компонентом Image1 (независимо, или нажата одна из кнопок мышки)
  • OnMouseUp - генерируется, когда пользователь отпускает кнопку мыши при нажатии.

OnMouseDown - генерируется, когда пользователь делает клик мышкой на компоненте Image1;   OnMouseMove - генерируется, когда пользователь перемещает мышь над компонентом Image1 (независимо, или нажата одна из кнопок мышки)   OnMouseUp - генерируется, когда пользователь отпускает кнопку мыши при нажатии

Рис. 4. События OnMouseDown, OnMouseMove, OnMouseUp компонента Image1

Перемещение мышки с нажатой клавишей по компоненту Image1 приводит к изменению углов alfa и beta. Переменная f_show используется для указания обработчике события OnMouseMove, что нужно изменить переменные alfa и beta и перерисовать график.

Листинги обработчиков событий OnMouseDown, OnMouseMove и OnMouseUp приведены ниже.

procedure

TForm2.Image1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin f_show = true; end; procedure TForm2.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); var a, b: real; begin if f_show then begin a: = x - Width div 2; b = y - Height div 2; if a <> 0 then alfa = arctan (b / a) else alfa = Pi / 2; beta = sqrt (sqr (a / 10) + sqr (b / 10)); Show_Graphic; end; end; procedure TForm2.Image1MouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin f_show = false; end;

9. Программирование события клика на кнопке «Показать 3D график ...» из формы Form1.

При клике на кнопке Button1 из формы Form1 имеет выводиться график функции.

Обработчик события клика на кнопке Button1 имеет вид.

procedure

TForm1.Button1Click (Sender: TObject); begin Form2.f_show = false; Form2.x0: = 0; Form2.y0: = 0; Form2.z0: = 0; Form2.A = -8; Form2.alfa: = 10; Form2.beta = 12; Form2.X_min = 3; Form2.X_max = 3; Form2.Y_min = 3; Form2.Y_max = 3; Form2.ShowModal; end;

Как видно из листинга, перед вызовом формы Form2 формируются значения внутренних переменных. Эти значения подбираются экспериментально и могут отличаться для каждой функции.

10. Запуск приложения на выполнение

Теперь можно запустить приложение на выполнение и протестировать его работу (рисунок 5).

Рис Рис. 5. Выполнение приложения

Похожие

Microsoft выпускает неофициальный пакет обновления для Windows 7
Этот сайт может зарабатывать партнерские комиссии по ссылкам на этой странице. Условия эксплуатации , Одним из недостатков использования более старой операционной системы Microsoft является необходимость установки нескольких сотен мегабайт исправлений после загрузки исходной ОС. Раньше Microsoft исправляла эту проблему, выпуская несколько пакетов обновлений в течение срока службы ОС, но в 2011 году Windows 7 получала только
Приложения Mels года: V для Википедии, Word Swag и Windfinder Pro
... назвать своих любимых с 2017 года. Конечно, при нынешней цене 6,99 евро универсальное приложение V для Википедии, безусловно,
Как построить отслеживание звонков с помощью Google Analytics, Twilio и PHP
... вина денег, которые я трачу на рекламу, тратится впустую. Проблема в том, что я не знаю, какая половина. - Джон Уонамейкер Уважаемый Сол Гудман, эсквайр, Прежде всего, мои комплименты за вашу феноменально эффективную рекламу. Я не могу ехать по улицам Альбукерке, сидеть на автобусной остановке или смотреть мои любимые шоу на AMC, не видя ни одного из ваших вездесущих рекламных роликов «Лучше позвони Солу». Судя по, скажем так, «экономичному»
Дамп Facebook, держать друзей: пошаговое руководство
За исключением несогласных, принципиально противостоящих и тех, у кого нет доступа к Интернету, на Facebook сегодня можно найти почти всех, включая вас. И как только вы зарегистрируетесь, вам будет трудно расстаться, потому что теперь у вас есть личные сообщения, приглашения на мероприятия, бесконечные новые детские фотографии и объявления от ваших ближайших друзей, которые меняют жизнь. Это может
Изменить настройки видео в Windows 7
Содержание: Установить или изменить разрешение экрана Отрегулируйте глубину цвета Установите частоту обновления Изменить размер шрифта и размеры символов Эта статья относится к Microsoft Windows 7. Нажмите ниже, чтобы изменить операционную систему. Dell рекомендует: Microsoft предоставила автоматическое устранение
Многоуровневое вредоносное ПО проникает в Google Play
Во всех случаях, которые мы исследовали, конечной полезной нагрузкой был троян мобильного банкинга. После установки оно ведет себя как типичное вредоносное приложение такого рода: оно может предоставлять пользователю поддельные формы входа для кражи учетных данных или данных кредитной карты. Еще один набор вредоносных приложений попал в официальный магазин приложений для Android. Эти приложения, обнаруженные системами безопасности ESET как Android / TrojanDropper.Agent.BKY, образуют новое
Как сделать бота: руководство по вашему первому чат-боту на Python для Telegram
... наша серия чатботов поставляется с пошаговым руководством о том, как сделать бот Telegram. Бот должен уметь показывать курсы валют, показывать разницу между прошлыми и текущими курсами обмена, а также использовать современные встроенные клавиатуры. Теперь давайте перейдем к поиску и узнаем, как делать ботов Telegram. Прочитайте больше: 8 вопросов, которые вы должны задать себе, прежде чем
iPad mini 4 Wi-Fi | 128 ГБ | Космический серый
... во Apple, приобретенное у Harvey Norman, теперь имеет 2-летнюю гарантию . Harvey Norman является авторизованным поставщиком услуг Apple , поэтому, когда вы покупаете у нас, мы продлим вашу 12-месячную гарантию производителя еще на 12 месяцев совершенно бесплатно. См. Полный T & C в harveynorman.ie/applewarranty , В мини больше, чем кажется на первый взгляд. Новый iPad mini 4 дает вам
Эффективные способы исправить ошибку NTLDR отсутствует в Windows 7
Эта проблема Ну, у меня есть проблема, которая не должна возникать в моей операционной системе Windows 7. У меня нет другой операционной системы на моем компьютере. У меня в компьютере 4 жестких диска, один только для ОС (80 ГБ) и 3 диска с данными: два диска объемом 250 ГБ для личных документов и один жесткий диск объемом 1 ТБ для моих резервных копий и игр. Windows 7 загружается нормально, когда я отсоединяю 3 диска с данными и оставляю подключенным только системный диск емкостью
Создание и оформление пользовательского типа контента с помощью Drupal 7
Одна из замечательных новинок Drupal 7 в том, что теперь стало проще настраивать контент вашего сайта. В Drupal 6 вам обычно приходилось использовать модуль CCK (Content Construction Kit) для детального контроля при настройке контента, но он был встроен в ядро ​​для Drupal 7. Drupal 7 теперь является истинной структурой управления контентом (CMF). Drupal 7: все дело в полях Когда вы настраиваете контент в Drupal 7, это включает в себя создание или изменение того, что часто называют
kirupa.com - стиль красивых таблиц с использованием только CSS
Есть вопросы? Обсудите этот учебник HTML5 и CSS с другими на форумах. Тьфу! Eww! Я говорю маме. Убирайся с моей тарелки! Это реакция, которую некоторые из вас, вероятно, испытывают, когда я упоминаю слово «таблицы» в контексте веб-дизайна. Хотя таблицы не используются, когда дело доходит до макета, они все же полезны для табличных вещей, таких как отображение табличных данных

Комментарии

Наличие двух веб-браузеров - не обязательно плохая вещь, но если вы не будете использовать браузер Mozilla, зачем это делать?
Наличие двух веб-браузеров - не обязательно плохая вещь, но если вы не будете использовать браузер Mozilla, зачем это делать? Вы можете легко удалить его в Терминале с помощью приведенной ниже команды. Вам будет предложено ввести пароль для запуска процесса. "sudo apt-get remove firefox" Поздравляем! Вы удалили Mozilla Firefox и установили Google Chrome. Кредит изображения: Mascha
Или получить текст заголовка изображения, прикрепленного к медиа-объекту, связанному с первым событием, которое начинается после даты выпуска статьи?
Или получить текст заголовка изображения, прикрепленного к медиа-объекту, связанному с первым событием, которое начинается после даты выпуска статьи? Используйте The Views Ответ таков: мы можем сделать это так, как мы обычно делаем это в Drupal - с целью. Интеграция представлений перенесена в отдельный проект, поэтому ее необходимо загружать с помощью composer (для composer требуется drupal / graphql_views ) из
Нужен альтернативный инструмент для создания собственных событий?
Нужен альтернативный инструмент для создания собственных событий? Doodle.com - оптимизированное решение , Никто не должен ничего подписывать - они просто нажимают «да», «нет» или, может быть, и подписываются на уведомления, если они хотят. Прощаться" Теперь ваши друзья все еще могут сообщать вам об этом через Facebook, но они не могут поразить вас каждым последним приемом пищи, изображением кота и плейлистом Spotify в свой день.

Наличие двух веб-браузеров - не обязательно плохая вещь, но если вы не будете использовать браузер Mozilla, зачем это делать?
Или получить текст заголовка изображения, прикрепленного к медиа-объекту, связанному с первым событием, которое начинается после даты выпуска статьи?
Нужен альтернативный инструмент для создания собственных событий?