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

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

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

#define PIE 3.1415926535

Проекты подготовлены на базе шаблона из первой главы, что делает их открытими для изменений подобного рода. Примеры были протестированы в системах Kompas 3D v10-13, однако в ряде случаев требуется пересборка проекта прикладной библиотеки, если разработка ведется в разных версиях Microsoft Studio (6, 2003, 2005,2010).

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

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

#include "stdafx.h"

#include <afxdllx.h>

#include "resource.h"

#include <сmath>

#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» показан на рисунке 26.

Рис. 26. Построение графика функции согласно заданным параметрам