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

5.2. Построение фигур

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

#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

{

public:

//Построение параболоида

void paraboloid();

//Построение графических объектов

void graphline();

} *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 )

{

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

{

switch ( comm )

{

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

case 2 : two_d->graphline(); break;

}

}

else

Message("Документ не активизирован или\nне является листом/фрагментом" );

}

// Построение параболоида

void two_d_project::paraboloid()

{

double z,s,zc,x,y;

for (z=-5;z<4;z+=0.15)

{ s=0.707*z;

zc=pow(z,2);

Bezier( 0, 0 );

for (x=-5;x<5;x+=0.15)

{y=0.6*(zc+x*x);

double xt=0+6*(x+s);

double yt=6*(y+s);

Point (xt,yt,0);

}

// Функция EndObj возвращает указатель на созданный

// объект кривой Безье

reference rBezier1 = EndObj();}

char *string="Параболоид вида: y=0,6*(x*x+z*z)";

Text(-60,-20,0,7,0,0,string);

}// Фигуры

void two_d_project::graphline()

{

int i=72,j=0;

double px=100,py=100,angle=0;

while (i>0)

{ j++;

// Структура параметров прямоугольника

RectangleParam parRectangle;

memset( &parRectangle, 0, sizeof( parRectangle ) );

//Координаты базовой точки прямоугольника - одной из его вершин

parRectangle.x = 0;

parRectangle.y = 0;

parRectangle.ang = angle;

// Высота прямоугольника

parRectangle.height = px;

// Ширина прямоугольника

parRectangle.width = py;

// Стиль линии

parRectangle.style = 1;

// Динамический массив структур параметров скругленных (или

// усеченных) углов

parRectangle.pCorner = CreateArray( CORNER_ARR, 0 );

// Создать прямоугольник

ksRectangle( &parRectangle, 0 );

i--;

angle+=5;

}//спираль Архимеда

//r-Радиус для расчета

int r,b; double x,y,a=0;

ReadIntT( _T("Введите значение радиуса (ввод 1-20)"),

3,

1,

20,

&r);

ReadIntT( _T("Введите число итераций (ввод 1-1000)"),

1,

10,

1000,

&b);

float x0=0;

float y0=100;

Bezier( 0, 0 );

Point (x0, y0,0);

for (int i=1;i<b;i++)

{

x=x0-(r*a*cos(a));

y=y0+(r*a*sin(a));

Point (x, y,0);

a+=0.1;

}

EndObj();

//Логарифмическая спираль

int n;

ReadIntT( _T("Введите количество витков(ввод 1-10)"),

4,

1,

10,

&n);

double r,a=0,arad;

while (a<360*n)

{

arad = a * PIE / 180;

r=2*exp(0.1 * arad);

Point((r*sin(arad)),(r*cos(arad)),0);

a+=0.1;

}

}

Результаты работы прикладной библиотеки представлены на рис. 24 и 25.

Рис. 24. Построение параболоида программным способом

Рис. 25. Построение логарифмической спирали