Тут апельсинка

Профиль





Авторизация

Быстрая регистрация через социальные сети

css template

css template

css template

css template



css template




Ваш ник или Email

Ваш пароль



Регистрация

Миничат

В онлайне 0 чел.

Для добавления необходима регистрация или зайти под своим логином.

Опрос

Хотели бы вы сами добавлять вопросы с ответами на сайт?

Да, у меня скопились лишние вопросы с ответами

Я добавлять не буду, но хотелось бы чтоб другие это делали

Я доверяю только администратору этого сайта

Мне ничего не нужно

Умные цитаты

Америка единственная страна в мире, где для заполнения декларации о доходах требуется больше ума, чем для получения этих доходов.
А. Н.
Аватар пользователя Administrator
Работа бабота, сайт который наверное никому толком не нужен, тут наверное надо бы пожаловаться на жизнь, но как то не охото.
Аватар пользователя Administrator

Математика

\lim_{x \rightarrow -\infty}\big(\frac{x+7}{2x-6}\big)^{5x+1}

равен
\infty

Комментарии 0 2018-01-11 00:00:59 5
Аватар пользователя Administrator

Математика

\int_{}^{} \frac{dx}{2x+1}

равен
ln \sqrt{|2x+1|}+C

Комментарии 0 2018-01-10 23:57:08 5
Аватар пользователя Administrator

Математика

\lim_{x \rightarrow \frac{\pi}{2}}\frac{sin \space x}{x}

равен
\frac{2}{\pi}

Комментарии 0 2018-01-10 22:18:56 5
Аватар пользователя Administrator

Математика

\lim_{x \rightarrow \infty}\big(\frac{5x-2}{6x+3})^x

равен 0

Комментарии 0 2018-01-10 22:16:04 5
Аватар пользователя Administrator

Математика

\int_{-1}^2 x^4 \space dx

равен 6,6

Комментарии 0 2018-01-10 22:12:04 5
Аватар пользователя Administrator

Математика

\int_{\pi/2}^\pi 3sin \space x\space dx

равен 3

Комментарии 0 2018-01-10 22:10:00 5
Аватар пользователя Administrator

Математика

\lim_{x \rightarrow \infty}\frac{2x^{2}+6x-1}{x^{2}+2x+5}

равен 2

Комментарии 0 2018-01-08 23:29:06 5
Аватар пользователя Administrator

Prolog Функциональное и логическое программирование

Написать программу для удаления элемента из списка перед всеми найденными указанными значениями

Тема: Работа со списками и бинарными деревьями на языке Prolog.
Цель: Научиться обрабатывать списки и бинарные деревья,
используя механизм рекурсии в среде Visual Prolog 5.2.
Задание: Разработать программу для операций со списками и
бинарными деревьями. Написать программу для удаления
элемента из списка перед всеми найденными указанными
значениями, а также написать программу для замены всех
корней дерева на одинаковые значения. Вывод результата
осуществить в отдельное окно. Реализовать систему
сообщений об ошибках, которые должна выдавать
программа.

Задание. Написать программу для удаления элемента из списка перед
всеми найденными указанными значениями.

1. Теоретическое описание

Списки в языке Prolog
Список – это бинарная структура, представляющая собой
последовательность, состоящую из произвольного числа элементов.
Списком может быть пустой список, не содержащий ни одного
элемента, или структура, имеющая голову и хвост.
Голова – первый элемент списка. Хвост – оставшаяся часть списка без
первого элемента.
Варианты описания списков:
[ ], [ a, b, c ], [ Head | Tail ].
Запись [Н | Т] используется для того, чтобы определить голову и хвост.
Заметим, что употребление имен переменных Н и Т необязательно.
Кроме записи вида [H|T], для выборки элементов используются переменные.
Списки в свою очередь могут состоять из списков, например:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], .. ].
Элементами списка могут быть переменные и константы.
Определение списка
domains
ilist = integer * // список целых чисел
clist = char * // список символов, типа char
predicates
list (ilist) // предикат list работает со списком с именем ilist
list(clist) // предикат list работает со списком с именем clist
Список – частный случай бинарного дерева (описанного ниже),
поэтому ему присущи все свойства и возможны операции, которые можно
производить над ними, например:
- проверки на вхождение элемента в список;
- объединения двух списков;
- вставки элемента (возможны различные вариации на тему
вставки);
- сортировки списка;
- удаления элемента(ов) из списка (возможны различные
вариации на тему удаления);
- выбора элемента из списка (по номеру, по значению и т.д.);
- вычисления длины списка и т.д.

2. Описание программы

Диалоговое окно содержит блок "Ввода информации и формирования
списка элементов" и блок "удаления элемента из списка и вывода
информации" в котором находятся следующие элементы (А.1 Диалоговое
окно программы):
1) Поле "Добавить" выполняет ввод исходных данных для
формирования списка;
2) Поле "Сформированный список" выполняет вывод исходных данных
после добавления всех элементов в список (А.2 Ввод исходных данных);
3) Поле "Удалить" выполняет удаление элемента перед всеми
найденными значениями;
4) Поле "Результат" осуществляет вывод списка элементов после
необходимой обработки запроса (А.3 Вывод данных после обработки).
Кнопки управления:
1) Кнопка "Добавить" выполняет вывод данных в поле "Списка
элементов" (А.2 Ввод исходных данных);
2) Кнопка "Обработать" выполняет вывод обработанных данных в поле
"Вывод результата" (А.3 Вывод данных после обработки);
3) Кнопка "Help" выполняет вызов файла справки программы;
4) Кнопка "Cancel" выполняет завершение работы программы.
Алгоритм работы с приложением:
1) При построении списка необходимо ввести его значение в поле
"Добавить" в противном этом случае программа выдаст пользователю
сообщение об ошибке (А.4 Сообщение об ошибке).
2) Далее необходимо ввести значение элемента, перед которым
необходимо удалить элемент. Если поле останется пустым программа выдаст
пользователю сообщение об ошибке (А.4 Сообщение об ошибке);
3) Для обработки и вывода значений необходимо нажать кнопку
«Обработать»;
4) Для выхода из приложения нажать кнопку «Cancel»;
5) Для получения справки нажать кнопку «Help».

2.1 Логическая или концептуальная модель

В секции clauses мы описываем логику обработки событий диалогового
окна нашей программы.

2.2 Описание предикатов

Обработчик нажатия кнопки idc_dobpb (кнопка «Добавить») предназначен для
добавления и вывода информации в поле «Список». Так же в этом предикате
мы прописываем условие на пустой ввод.
На обработчик кнопки idc_help (кнопка «Помощь») мы подключили файл
справки.
Обработчик кнопки idc_cancel (кнопка «Выход») выполняет выход из
приложения.
Обработчик кнопки idc_dobpb (кнопка «Обработать») выполняет обработку
списка с заданным параметром удаления элементов этого списка.
doblb – хранит значения элементов добавленных в список.
udlb – хранит значение элементов обработанного списка.

3. Текст программы

/*****************************************************************************
Copyright (c) My Company
Project: RGZ2
FileName: RGZ2.PRO
Purpose: No description
Written by: Pavel Ilchin
Comments:
******************************************************************************/
include "sgt2.inc"
include "sgt2.con"
include "hlptopic.con"
%BEGIN_WIN Task Window
/***************************************************************************
Event handling for Task Window
***************************************************************************/
predicates
task_win_eh : EHANDLER
nondeterm del(slist,string,slist)
constants
%BEGIN Task Window, CreateParms, 23:32:34-19.3.2015, Code automatically updated!
task_win_Flags =
[wsf_SizeBorder,wsf_TitleBar,wsf_Close,wsf_Maximize,wsf_Minimize,wsf_ClipSiblings]
task_win_Menu = res_menu(idr_task_menu)
task_win_Title = "sgt2"
task_win_Help = idh_contents
%END Task Window, CreateParms
clauses
del([],X,[]).
del([Y,X|T],X,[X|T1]):- del(T,X,T1).
del([X1|T],X,[X1|T1]):- del(T,X,T1).
%BEGIN Task Window, e_Create
task_win_eh(_Win,e_Create(_),0):-!,dlg_sgt2_Create(_Win),win_Destroy(_Win),
%BEGIN Task Window, InitControls, 23:32:34-19.3.2015, Code automatically updated!
%END Task Window, InitControls
%BEGIN Task Window, ToolbarCreate, 23:32:34-19.3.2015, Code automatically updated!
%END Task Window, ToolbarCreate
ifdef use_message
msg_Create(100),
enddef
!.
%END Task Window, e_Create
%MARK Task Window, new events
%BEGIN Task Window, id_help_contents
task_win_eh(_Win,e_Menu(id_help_contents,_ShiftCtlAlt),0):-!,
vpi_ShowHelp("sgt2.hlp"),
!.
%END Task Window, id_help_contents
%BEGIN Task Window, id_help_about
task_win_eh(Win,e_Menu(id_help_about,_ShiftCtlAlt),0):-!,
dlg_about_dialog_Create(Win),
!.
%END Task Window, id_help_about
%BEGIN Task Window, id_file_exit
task_win_eh(Win,e_Menu(id_file_exit,_ShiftCtlAlt),0):-!,
win_Destroy(Win),
!.
%END Task Window, id_file_exit
%BEGIN Task Window, e_Size
task_win_eh(_Win,e_Size(_Width,_Height),0):-!,
ifdef use_tbar
toolbar_Resize(_Win),
enddef
ifdef use_message
msg_Resize(_Win),
enddef
!.
%END Task Window, e_Size
%END_WIN Task Window
/***************************************************************************
Invoking on-line Help
***************************************************************************/
project_ShowHelpContext(HelpTopic):-
vpi_ShowHelpContext("sgt2.hlp",HelpTopic).
/***************************************************************************
Main Goal
***************************************************************************/
goal
ifdef use_mdi
vpi_SetAttrVal(attr_win_mdi,b_true),
enddef
ifdef ws_win
ifdef use_3dctrl
vpi_SetAttrVal(attr_win_3dcontrols,b_true),
enddef
enddef
vpi_Init(task_win_Flags,task_win_eh,task_win_Menu,"sgt2",task_win_Title).
%BEGIN_DLG About dialog
/**************************************************************************
Creation and event handling for dialog: About dialog
**************************************************************************/
constants
%BEGIN About dialog, CreateParms, 23:32:34-19.3.2015, Code automatically updated!
dlg_about_dialog_ResID = idd_dlg_about
dlg_about_dialog_DlgType = wd_Modal
dlg_about_dialog_Help = idh_contents
%END About dialog, CreateParms
predicates
dlg_about_dialog_eh : EHANDLER
clauses
dlg_about_dialog_Create(Parent):-
 win_CreateResDialog(Parent,dlg_about_dialog_DlgType,dlg_about_dialog_ResID,dlg_about_dial
og_eh,0).
%BEGIN About dialog, idc_ok _CtlInfo
dlg_about_dialog_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,
win_Destroy(_Win),
!.
%END About dialog, idc_ok _CtlInfo
%MARK About dialog, new events
dlg_about_dialog_eh(_,_,_):-!,fail.
%END_DLG About dialog
%BEGIN_DLG sgt2
/**************************************************************************
Creation and event handling for dialog: rgz2
**************************************************************************/
constants
%BEGIN sgt2, CreateParms, 00:21:16-20.3.2015, Code automatically updated!
dlg_sgt2_ResID = idd_sgt2
dlg_sgt2_DlgType = wd_Modal
dlg_sgt2_Help = idh_contents
%END sgt2, CreateParms
predicates
dlg_sgt2_eh : EHANDLER
dlg_sgt2_handle_answer(INTEGER EndButton,DIALOG_VAL_LIST)
dlg_sgt2_update(DIALOG_VAL_LIST)
clauses
dlg_sgt2_Create(Parent):-
%MARK sgt2, new variables
dialog_CreateModal(Parent,dlg_sgt2_ResID,"",
[
%BEGIN sgt2, ControlList, 00:21:16-20.3.2015, Code automatically updated!
df(idc_dobeb,editstr("",[]),nopr),
 df(doblb,listbox([],[0]),nopr),
df(idc_udeb,editstr("",[]),nopr),
df(udlb,listbox([],[0]),nopr)
%END sgt2, ControlList
],
dlg_sgt2_eh,0,VALLIST,ANSWER),
dlg_sgt2_handle_answer(ANSWER,VALLIST).
dlg_sgt2_handle_answer(idc_ok,VALLIST):-!,
dlg_sgt2_update(VALLIST).
dlg_sgt2_handle_answer(idc_cancel,_):-!. % Handle Esc and Cancel here
dlg_sgt2_handle_answer(_,_):-
errorexit().
dlg_sgt2_update(_VALLIST):-
%BEGIN sgt2, Update controls, 00:21:16-20.3.2015, Code automatically updated!
_IDC_DOBEB_VALUE = dialog_VLGetstr(idc_dobeb,_VALLIST),
dialog_VLGetListBox(doblb,_VALLIST,_DOBLB_ITEMLIST,_DOBLB_SELECT),
_IDC_UDEB_VALUE = dialog_VLGetstr(idc_udeb,_VALLIST),
dialog_VLGetListBox(udlb,_VALLIST,_UDLB_ITEMLIST,_UDLB_SELECT),
%END sgt2, Update controls
true.
%MARK sgt2, new events
%BEGIN sgt2, udlb _CtlInfo
dlg_sgt2_eh(_Win,e_Control(udlb,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
!.
%END sgt2, udlb _CtlInfo
%BEGIN sgt2, idc_udeb _CtlInfo
dlg_sgt2_eh(_Win,e_Control(idc_udeb,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
!.
%END sgt2, idc_udeb _CtlInfo
%BEGIN sgt2, doblb _CtlInfo
dlg_sgt2_eh(_Win,e_Control(doblb,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
!.
%END sgt2, doblb _CtlInfo
%BEGIN sgt2, idc_dobpb _CtlInfo
dlg_sgt2_eh(_Win,e_Control(idc_dobpb,_CtrlType,_CtrlWin,_CtlInfo),0):-
A=win_GetCtlHandle(_Win,doblb),
A1=lbox_CountAll(A),
A1<>0,
B=win_GetCtlHandle(_Win,idc_udeb),
B1=win_GetText(B),
B1<>"",
not(str_int (B1,A1)),
C=win_GetCtlHandle(_Win,doblb),
C1=win_GetCtlHandle(_Win,udlb),
lbox_Clear(C1),
D=lbox_GetAll(C),
del(D,B1,E),
lbox_Clear(C1),
lbox_Add(C1,E),
!.
dlg_sgt2_eh(_Win,e_Control(idc_dobpb,_CtrlType,_CtrlWin,_CtlInfo),0):-
dlg_Error("Error","Error"),
!.
%dlg_sgt2_eh(_Win,e_Control(idc_dobpb,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
%!.
%END sgt2, idc_dobpb _CtlInfo
%BEGIN sgt2, idc_dobeb _CtlInfo
dlg_sgt2_eh(_Win,e_Control(idc_dobeb,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
!.
%END sgt2, idc_dobeb _CtlInfo
%BEGIN sgt2, idc_help _CtlInfo
dlg_sgt2_eh(_Win,e_Control(idc_help,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
project_ShowHelpContext(dlg_sgt2_Help),
!.
%END sgt2, idc_help _CtlInfo
%BEGIN sgt2, idc_cancel _CtlInfo
 dlg_sgt2_eh(_Win,e_Control(idc_cancel,_CtrlType,_CtrlWin,_CtlInfo),0):-!,win_Destroy(_Win),
!.
%END sgt2, idc_cancel _CtlInfo
%BEGIN sgt2, idc_udpb _CtlInfo
dlg_sgt2_eh(_Win,e_Control(idc_udpb,_CtrlType,_CtrlWin,_CtlInfo),0):-
V=win_GetCtlHandle(_Win,idc_dobeb),
G=win_GetText(V),
G<>"",
F=win_GetCtlHandle(_Win,doblb),
lbox_Add(F,G),
!.
dlg_sgt2_eh(_Win,e_Control(idc_udpb,_CtrlType,_CtrlWin,_CtlInfo),0):-
dlg_Error("Error","Error"),
!.
%END sgt2, idc_udpb _CtlInfo
dlg_sgt2_eh(_,_,_):-!,fail.
%END_DLG sgt2


4. Программа и методика испытаний
4.1 Объект испытаний


Наименование программного обеспечения: «Программа для работы со
списками».
Краткое наименование программного обеспечения: sgt2.
Возможной областью применения программного обеспечения sgt2
является применение в качестве учебно-методического материала.

4.2 Цель испытаний

Целью данных испытаний являются проверка работоспособности
программного обеспечения и соответствие программы и ее результатов
работы требованиям корректности, надежности и правильности
предъявленными в техническом задании.

4.3 Требования к программе

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

4.4 Средства и порядок испытаний

Технические средства, используемые во время испытаний:
- процессор Intel Сore i7-3630QM;
- оперативная память в объеме 8048 Mb;
- свободное место на диске в объеме 200 Gb;
- стандартная клавиатура;
Во время испытаний использовалась операционная система Windows 10
64-бит.
Испытания программы проводились в следующем порядке:
- испытание на корректность (адекватно ли программа реагирует на
ввод-вывод информации);
- испытание на правильность (соответствуют ли полученные
результаты ожидаемым);

4.5 Методы испытаний
4.5.1 Проверка на корректность


Был произведен запуск программы. Программа запускается успешно
(А.1 Диалоговое окно программы).
На первом шаге тестирования была проведена проверка работы
основных кнопок программы. Нажатие на кнопку «Добавить» дает ожидаемый
результат (А.2 Ввод исходных данных).
На втором шаге был произведен ввод пустого значения. При вводе
пустого значения, программа сообщила об ошибке (А.4 Сообщение об
ошибке).

4.5.2 Проверка на правильность

При проверке на правильность был введен список [1 2 3 4 5 ] и элемент
перед которым необходимо произвести удаление «4», результаты работы
программы (А.3 Вывод данных после обработки) удовлетворяют
необходимым требованиям и не отличаются от ожидаемых. Поэтому можно
сделать вывод, что программа работает корректно.

4.5.3 Проверка на надежность

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

Изображение
1 Диалоговое окно программы

Изображение
2 Ввод исходных данных

Изображение
3 Вывод данных после обработки

Изображение
4 Сообщение об ошибке

Комментарии 0 2018-01-07 17:27:33 5
Аватар пользователя Administrator

C++ Компьютерная графика

Построить изображение поверхности z=f(x,y) в параллельной проекции ex = y – 0.7 x, ey = z – 0.7 x.

Задание
Разработать программу на языке программирования Borland C++  Builder для вывода на экран изображения поверхности
z=f(x,y)
с удалением невидимых линий.
Введение
В данной работе отражен вывод на экран изображения поверхности
z=f(x,y)
в среде программирования Borland С++ Builder 6 Enterprise.

Построить изображение поверхности
z=f(x,y)
в параллельной проекции
ex=y-0,7x
,
ey=z-0,7x
.


//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "rgz03.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#include <stdlib.h>
#include <math.h>
#define nx 100
#define ny 100

int algor=1;
float xmax = 3, xmin = -3, ymax = 3, ymin = -3,  zmax = 3, zmin = -2,hx,hy;
float xv = 50, yv = 30.5 , zv = 10 ; // положение наблюдателя
float d = 1,zz=0.2 ;            // расстояние до плоскости проекции
float cosa, sina ;         // меридиана точки наблюдения
float exmax, exmin, eymax, eymin ;
int gmex, gmey ;
int *phimin, *phimax ;
float cvals[ny+1], cval ;

void line(int x0, int y0, int x1, int y1){
        Form1->Image1->Canvas->MoveTo(x0,y0);
        Form1->Image1->Canvas->LineTo(x1,y1);
}

void sline( int x0, int y0, int x1, int y1 ){
int i,j, temp, x, y, maxacc, accx, accy, dx, dy,
            length=abs(x1-x0);
     if ((i=abs(y1-y0))>length) length=i;
//     if (length==0) return;
     maxacc=2*length; accx=accy=length;
    for (j=0; j<2; j++){
      dx=2*(x1-x0); dy=2*(y1-y0); x=x0; y=y0;
        length+=j;
      for (i=0; i<length; i++){
                              if (y0<=y1&&phimax[x]<y){
                        Form1->Image1->Canvas->Pixels[x][gmey-y]=clBlack;
                        phimax[x]=y;
            }
            if (y0>=y1&&phimin[x]>y){
                        Form1->Image1->Canvas->Pixels[x][gmey-y]=clBlack;
                        phimin[x]=y;
            }
            accx+=dx; accy+=dy;
            if (accx>=maxacc){
                accx-=maxacc; x++;
            } else if (accx<0){
                  accx+=maxacc; x--;
              }
            if (accy>=maxacc){
                  accy-=maxacc; y++;
            } else if (accy<0){
                  accy+=maxacc; y--;
              }
      }
      temp=x0; x0=x1; x1=temp; temp=y0; y0=y1; y1=temp;
     }
}

float fz(float x, float y) {return ((x*y)/(x*x+y*y))*zz;}

float ex(float x, float y, float z){
 return y-0.5*x;
}

float ey ( float x, float y, float z ){
 return z-2*x;
}

void vectphi(float x0, float y0, float z0,
float x1, float y1, float z1,int mm){
float ex0, ex1, ey0, ey1;
int ix0, ix1, iy0, iy1;
     ex0=ex(x0,y0,z0);
     ix0=(ex0-exmin)*gmex/(exmax-exmin);
     ey0=ey(x0,y0,z0);
     iy0=(ey0-eymin)*gmey/(eymax-eymin);
     ex1=ex(x1,y1,z1);
     ix1=(ex1-exmin)*gmex/(exmax-exmin);
     ey1=ey(x1,y1,z1);
     iy1=(ey1-eymin)*gmey/(eymax-eymin);
     if (mm) sline(ix0,iy0,ix1,iy1);
      else line(ix0,gmey-iy0,ix1,gmey-iy1);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner){
int i, j;
float x,y,z;
  hy=(ymax-ymin)/ny;
  hx=(xmax-xmin)/nx;
  gmex=Form1->Image1->Width;
  gmey=Form1->Image1->Height;
  cosa=xv/sqrt(xv*xv+yv*yv);
  sina=yv/sqrt(xv*xv+yv*yv );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender){
zz+=0.1;
int i,j; float x, y, z;
  Form1->Image1->Canvas->FillRect(TRect(0,0,gmex,gmey));
  zmin=zmax=0.;
  for (i=0; i<=nx; i++)
  for (j=0; j<=ny; j++){
   z=fz(xmin+i*hx,ymin+j*hy);
   if (z>zmax) zmax=z;
   if (z<zmin) zmin=z;
}
 exmax=ex(xmin, ymax, zmax);
  exmin=ex(xmax, ymin, zmin);
  eymax=ey(xmin, ymin, zmax);
  eymin=ey(xmax, ymax, zmin);
  for(x=xmin; x<=xmax; x+=xmax-xmin)
  for(y=ymin; y<=ymax; y+=ymax-ymin)
  for(z=zmin; z<=zmax; z+=zmax-zmin){
        if (exmax<ex(x,y,z)) exmax=ex(x,y,z);
        if (exmin>ex(x,y,z)) exmin=ex(x,y,z);
        if (eymax<ey(x,y,z)) eymax=ey(x,y,z);
        if (eymin>ex(x,y,z)) eymin=ey(x,y,z);
  }
 phimax=new int[gmex]; phimin=new int[gmex];
    for(i=0;i<gmex;i++) {phimax[i]=0; phimin[i]=gmey;}
    cval=fz(xmax, ymax);
    for(i=ny-1;i>=0;i--){
        cvals[i+1]=cval; y=ymin+hy*i;
        cval=fz(xmax, y);
        vectphi(xmax, y+hy, cvals[i+1], xmax, y, cval, 1);
    }
    cvals[0] = cval ;
    for (j=nx-1;j>=0;j--){
        x=xmin+hx*j;
        cval=fz(x, ymax);
        vectphi(x+hx, ymax, cvals[ny], x,ymax,cval, 1);
        for(i=ny-1;i>=0;i--){
                cvals[i+1]=cval; y=ymin+hy*i;
              cval=fz(x, y);
                vectphi(x+hx, y, cvals[i], x, y, cval, 1);
                vectphi(x, y+hy, cvals[i+1], x, y, cval, 1);
        }
        cvals[0] = cval ;
    }
    vectphi(xmax, ymax, zmax, xmin, ymax, zmax, 0);
    vectphi(xmax, ymax, zmax, xmax, ymax, zmin, 0);
    vectphi(xmax, ymax, zmax, xmax, ymin, zmax, 0);
    vectphi(xmin, ymax, zmin, xmin, ymax, zmax, 0);
    vectphi(xmin, ymax, zmin, xmax, ymax, zmin, 0);
    vectphi(xmax, ymin, zmin, xmax, ymin, zmax, 0);
    vectphi(xmax, ymin, zmin, xmax, ymax, zmin, 0);
    vectphi(xmin, ymin, zmin, xmin, ymin, zmax, 1);
    vectphi(xmin, ymin, zmin, xmax, ymin, zmin, 1);
    vectphi(xmin, ymin, zmin, xmin, ymax, zmin, 1);
    vectphi(xmax, ymin, zmax, xmin, ymin, zmax, 1);
    vectphi(xmin, ymax, zmax, xmin, ymin, zmax, 1);
    delete phimax; delete phimin;
}


Программная реализация с использованием алгоритма плавающего горизонта показана на рисунке 1.

Изображение

Рисунок 1 - метод плавающего горизонта

Комментарии 0 2018-01-07 17:04:34 5
Аватар пользователя Administrator

C++ Компьютерная графика

Построить дерево Аммерала

Задание
Построить дерево Аммерала.

В данной работе отражен вывод дерева Аммерала в среде программирования Borland С++ Builder 6 Enterprise. А так же разработка исходного кода вывода функции.

Пояснение. Идея алгоритма построения дерева принадлежит Аммералу. Сначала выводится прямоугольник, соответствующий стволу дерева. Затем на верхней стороне прямоугольника строится прямоугольный треугольник, для которого эта сторона служит гипотенузой. Затем на каждом из катетов полученного прямоугольного треугольника будут построены прямоугольники, и этот процесс будет рекурсивно применен к каждому из этих двух прямоугольников.

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "rgz2zd2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
float xmin=-400, xmax=800; // масштаб по x
float ymin=200, ymax=1300; //мастштаб по у
const double PI=3.14159;
int maxX, maxY, zz=0;
float xdens, ydens;
int ex(float x){
	return (int) ((x-xmin)/xdens);
}
int ey(float y){
	return (int) ((ymax-y)/ydens);
}
//вывод отрезка
void line(int x0, int y0,int x1, int y1){
        Form1->Image1->Canvas->MoveTo(x0,y0);
        Form1->Image1->Canvas->LineTo(x1,y1);
}

// рекурсивная функция построения дерева
void piphagor(float x0,float y0,float x1, float y1){
	float x0s, y0s, x1s, y1s, x2s, y2s;
	float lambda= 1.+(2.-1.)*(0.+rand()%10000)/10000;
	float phi= PI/2 + (PI-PI/2)*(0.+rand()%10000)/10000;
	if((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)<1){
			line(ex(x0),ey(maxY-y0),ex(x1),ey(maxY-y1));
			return;
	}
	x0s= x0-lambda*(y1-y0); y0s= y0+lambda*(x1-x0);
	x1s= x1-lambda*(y1-y0); y1s= y1+lambda*(x1-x0);
     	line(ex(x0), ey(maxY-y0), ex(x0s), ey(maxY-y0s));
	line(ex(x1), ey(maxY-y1), ex(x1s), ey(maxY-y1s));
	x2s= (x0s+x1s)/2+ (x1s-x0s)/2*cos(phi)-(y1s-y0s)/2*sin(phi);
	y2s= (y0s+y1s)/2+ (x1s-x0s)/2*sin(phi)+(y1s-y0s)/2*cos(phi);
	piphagor(x0s,y0s,x2s,y2s);
	piphagor(x2s,y2s,x1s,y1s);
}

void __fastcall TForm1::trolo(TObject *Sender){
Form1->Image1->Picture->Bitmap->FreeImage();
Form1->Image1->Picture->Bitmap = NULL;
maxX=Form1->Image1->Width;
maxY=Form1->Image1->Height;
xdens=(xmax-xmin)/maxX;
ydens=(ymax-ymin)/maxY;
piphagor(maxX/2+40, 0, maxX/2-40, 0);
}


Вывод построенного дерева показан на рисунке 1.

Изображение

Рисунок 1 – дерево Аммерала

Комментарии 0 2018-01-07 16:57:32 5