Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000392.doc
Скачиваний:
18
Добавлен:
30.04.2022
Размер:
2.94 Mб
Скачать

5. Примеры проектирования библиотек в 2d

Рассмотрим варианты и способы применения вышеперечисленных методов для решения практических задач при проектировании библиотек в 2D. Под поставленные задачи предложен механизм решения, который состоит из одной или несколько функций. Для управления объектами введено понятие класса, что позволяет разграничить уровень доступа к данным и упростить проектирование прикладной библиотеки. Текст библиотеки содержит комментарии, позволяющие проследить и понять работу некоторых сервисных команд и инструкций, а также изучить особенности построения синтаксических возможностей языка С++.

5.1. Построение графиков функций

Для построения на плоскости графика заданной функции в изометрии предлагается пример прикладной библиотеки Компас, код которой приведен ниже.

#include "stdafx.h"

#include <afxdllx.h>

#include "resource.h"

#include "math.h"

#include <libtool.h>

#include <ldefin2d.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

#define PIE 3.1415926535

class two_d_project

{

//Функция вывода изображения на экран

void DrawSetPoint(double y,double z)

{

Point (90+0.707*z,65+y+0.707*z,0);

};

//Функция для вывода текста

void DrawSetText(char *buf)

{

Text(0,-20,0,7,0,0,buf);

};

public:

//Построение графиков функций на плоскости в изометрии

void graphfunc();

} *two_d;

// Специальная структура используемая в течении инициализации DLL

static AFX_EXTENSION_MODULE StepDLL = { NULL, NULL };

// Стандартная точка входа

// Инициализация и завершение DLL

extern "C" int APIENTRY

DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved )

{UNREFERENCED_PARAMETER( lpReserved );

if ( dwReason == DLL_PROCESS_ATTACH )

{TRACE0( "DLL Initializing!" );

if ( !AfxInitExtensionModule( StepDLL, hInstance ) )

return 0;

new CDynLinkLibrary( StepDLL );

}

else if ( dwReason == DLL_PROCESS_DETACH )

{ TRACE0( "DLL Terminating!" );

AfxTermExtensionModule( StepDLL );

}

return 1;

}

// Задать идентификатор ресурсов

unsigned int WINAPI LIBRARYID()

{

return IDR_LIBID;

}

// Получить идентификаторы инструментальных и компактных панелей

int WINAPI LibToolBarId( int barType,

// Тип запрашиваемой панелей ( 0 - компактная панель, 1 - //простая инструментальная панель )

int index ) // Индекс панели

{

if ( !barType )

return !index ? COMPACT_BAR1 : -1;

else return -1;

}

// Головная функция библиотеки

void WINAPI LIBRARYENTRY( unsigned int comm )

{

// Получить активный 2D документ

if ( ksGetCurrentDocument( 1 ) )

{

switch ( comm )

{

case 1 : two_d->graphfunc(); break;

}

}

else

Message( "Документ не активизирован или\n

не является листом/фрагментом" );

}//Построение графиков функций в аксонометрии

void two_d_project::graphfunc()

{

int change; //Выбор режима отображения графика

ReadIntT( _T("Отобразить график:(ввод 1-5)"),

2,

1,

5,

&change ) ;

//Построение координатных осей

LineSeg (90,65,6,120,2);

PointArraw(6,120,147,2);

LineSeg (90,65,90,165,2);

PointArraw(90,165,90,2);

LineSeg (90,65,175,150,2);

PointArraw(175,150,45,2);

LineSeg (44,19,90,65,2);

//Расчетные коэффициенты

double s=PIE/100;

double f,z,y;

switch ( change )

{//Построение графика функции sin

case 1 :

{ for (f=-2*PIE;f<3*PIE;f+=s)

{ z=10*f;

y=45*sin (f);

two_d->DrawSetPoint(y,z);

}

char *string="График в аксонометрии функции вида: y=sin(f)";

two_d->DrawSetText (string);

break;

}

//Построение графика функции cos

case 2 :

{

for (f=-2*PIE;f<3*PIE;f+=s)

{

z=10*f;

y=45*cos (f);

two_d->DrawSetPoint(y,z);

}

char *string="График в аксонометрии функции вида: y=cos(f)";

two_d->DrawSetText (string);

break;

}

//Построение графика показательной функции

case 3 :

{

for (f=0;f<70;f+=0.1)

{

z=f;

y=sqrt((f))*5;

two_d->DrawSetPoint(y,z);

}

char *string="График в аксонометрии показательной функции вида: y=SQRT(f)";

two_d->DrawSetText (string);

break;

}

//Построение графика затухающей функции

case 4:

{

for (f=0;f<100;f+=0.05)

{

z=f;

y=70*(exp(-f*0.07))*sin(PIE*f*(10.0/3.0)/30.0);

two_d->DrawSetPoint(y,z);

}

char *string="График затухающей функции вида: y=A(exp(-f*B))*sin(PIE*f*(C)/D);";

two_d->DrawSetText (string);

break;

}

//Петля

case 5:

{

double delta=1,base=45;

for(f=-3*PIE;f<3*PIE;f+=s)

{

z=base*f;

base=base+delta*f;

y=base*cos (f);

two_d->DrawSetPoint(y/100,z/100);

}

char *string="Петля: y=base*cos (f); base=base+delta*f";

two_d->DrawSetText (string);

break;

}

}

}

Результат работы прикладной библиотеки при выборе значения «4» показан на рис. 23.

Рис. 23. Построение графика функции