Добавил:
kaslp1939@mail.ru Казимиров Леонид Петрович , инженер- механик по летательным аппаратам Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Расчёт треугольника по трём сторонам_dll_

.pdf
Скачиваний:
4
Добавлен:
16.05.2019
Размер:
481.87 Кб
Скачать

D1[ 3,i]:= T8ck22[i]; // координаты вектора - высоты(Т8)

Вершина 2 (начало координат в т.0)

D2[ 0,i]:= T2ck0[i]; //координаты вектора - точки Т2 D2[ 1,i]:= T9ck0[i]; //координаты вектора - медианы(Т9)

D2[ 2,i]:= T10ck0[i];//координаты вектора - бисектрисы(Т10) D2[ 3,i]:= T11ck0[i]; // координаты вектора - высоты(Т11)

в СК - принятой за основную ( угол 0)

Параметр - parametrMain

Вектор 6-го порядка parametrMain – координаты которого равны:

parametrMain[0] =2* p - периметр parametrMain[1] =S - площадь

parametrMain[2] =rB - радиус вписанной окружности parametrMain[3] = ROa или -

parametrMain[4]:= ROb или

parametrMain[5]:= ROc;-радиус описанной окружности радиус описанной окружности вычисляется с использованием сторон: a(0) или b(1) или c(2)

ROa:=a/(2*sin(alfa[0]));

ROb:=b/(2*sin(alfa[1]));

ROc:=c/(2*sin(alfa[2]));

RO - радиус описанной окружности rB - радиус вписанной окружности p - полупериметр

RO - радиус описанной окружности rB - радиус вписанной окружности S – площадь

Все рассматриваемые ниже системы координат – правые.

Проведенные из каждой вершины (угла) на противоположную сторону - высота, медиана и бисектриса - создают на этой стороне характерные точки. Координаты этих точек будут координатами соответствующих векторов – высоты, медианы и бисектрисы. Ниже приведен порядок действий для вычисления этих координат.

Введём основную систему координат СКО с центром в вершине (угле) 0, ось X совпадает с линией 0-1 ( с угла 0 к углу 1).

Аналогично введём системы координат в т.1 и т.2.

В каждой из этих систем находим координаты точек - T0,T1,T2 и координаты проведенных - высот, медиан и бисектрис. Далее путём преобразований находим эти координаты в основной СКО. Системы координат показаны на рисунке ниже

11

Вершина 0 (начало координат в т.1)

Вершина1 (начало координат в т.2)

 

Y1

0

c

 

 

 

b

 

 

 

1

5

4

3

 

a

2

 

X

Rh0

R

 

Rm0

X1

 

 

b0

 

 

 

 

Y

Y2

 

 

 

1

 

 

 

 

 

 

 

 

a

 

c

 

 

 

 

 

 

2

b

 

0

8

X2

R6

7

R

 

m1 R

 

h1

 

 

 

b1

 

 

 

 

 

Y

 

Вершина 2 (начало координат в т.0)

2

 

0

 

 

 

 

 

 

 

 

a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

b

 

 

 

 

 

 

 

 

Rh2

 

 

 

 

 

9

c

 

 

 

 

 

 

 

 

 

 

 

 

11

0

R

10

R

 

1

X

 

 

 

 

 

m2

 

0

 

 

 

 

b2

 

 

 

Индексы, например у высоты h0 - , обозначает то, что эта высота опущена с вершины угла 0. Аналогично для других вершин и параметров.

Все эти построения СК оправданы тем, что координаты векторов в этих системах координат имеют самый простой вид. Приведение их к основной СКО осуществляется путём поворота СК на соответствующий угол и переноса начала в точку 0.

Чтобы получить вектор, например, высоты h0 в произвольной СКО, определяем вектор R0 начальной точки ( принимается вершина 0 - её координаты) и вектор конечной точки Т5 – её координаты.. Далее из векторного уравнения (см. рисунок)

r0 + Rh0 = r5

находим Rh0.

12

Работа с TriAngleMainVektor.dll

В программе подключить модули:

Global_IData_DLL , TYPEDATA_DLL .

Листинг TYPEDATA_DLL.pas

unit typeDATA_DLL; // ---- 15 мая 2019 г. ----

//--- создание динамической библиотеки -- interface

type

raT04=array [0..4] of extended ; raT05=array [0..5] of extended ; vekt = array [1 .. 3] of extended; vekt13 = array [1 .. 3] of extended; vekt02 = array [0 .. 2] of extended;

13

raT03=array [0..3] of extended;

raMatric3_3 = array [1 .. 3, 1 .. 3] of extended;

ravekt03 = array [0 .. 3,1 .. 3] of extended;implementation end.

Листинг Global_IData_DLL.pas

unit Global_IData_DLL; // ---- 15 мая 2019 г. ----

//--- создание динамической библиотеки -- interface

uses

// Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,

// Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, typeDATA_DLL ;

var

angle,h :vekt02;

strTime, timestr,DateTimeChet: String; angleMain,hMain,medianaMain,bisektrisaMain :vekt02;

D0Main,D1Main,D2Main: ravekt03; parametrMain:raT05;

p,a,b,c:extended; Counter : Integer; Str: String;

Str2: String; implementation end.

Далее прописать процедуру

procedure MainTriAngleVektor ( a,b,c:extended; var D0Main ,D1Main ,D2Main : ravekt03;

var angleMain,hMain,medianaMain,bisektrisaMain:vekt02;

var parametrMain:raT05); stdcall; external 'TriAngleMainVektor.dll'; implementation

В тестовой программе CalcTriAngleVektor (TestDllVektor.pas) это выглядит следкющим образом.

Листинг TestDllVektor.pas

unit TestDllVektor; interface

uses

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, System.Math,Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,

typeDATA_DLL, Global_IData_DLL;

type

14

TForm1 = class(TForm) LabeledEdit1: TLabeledEdit; LabeledEdit2: TLabeledEdit; LabeledEdit3: TLabeledEdit; Label1: TLabel;

Label2: TLabel;

Button1: TButton;

Button2: TButton;

Image1: TImage;

Label3: TLabel;

Label4: TLabel;

Label6: TLabel;

Label7: TLabel;

Label5: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

Label12: TLabel;

Label13: TLabel;

Label14: TLabel;

Label15: TLabel;

Label16: TLabel;

Label17: TLabel;

Label18: TLabel;

Label19: TLabel;

Label20: TLabel;

Label21: TLabel;

Label22: TLabel;

Label23: TLabel;

Label24: TLabel;

Label25: TLabel;

Label26: TLabel;

Label27: TLabel;

Label28: TLabel;

Label29: TLabel;

Label30: TLabel;

Label31: TLabel;

Label32: TLabel;

Label33: TLabel;

Label34: TLabel;

Label35: TLabel;

Label36: TLabel;

Label37: TLabel;

Button3: TButton;

Label38: TLabel;

procedure Button1Click(Sender: TObject); procedure Label1Click(Sender: TObject); procedure Button2Click(Sender: TObject);

procedure LabeledEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

procedure LabeledEdit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

procedure LabeledEdit4KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

procedure Button3Click(Sender: TObject);

15

private

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1;

procedure DateTimeSt(myfilenameF :string; var myfile: string); procedure DateTimeData();

procedure ScreenShot(PathToSave: string); procedure MainTriAngleVektor ( a,b,c:extended; var D0Main ,D1Main ,D2Main : ravekt03;

var angleMain,hMain,medianaMain,bisektrisaMain:vekt02;

var parametrMain:raT05);stdcall;external 'TriAngleMainVektor.dll'; implementation

{$R *.dfm}

procedure DateTimeData();

//создание Файла myfile с текущим временем и папки myfolder

//с текущей датой и текущим временем

begin

timestr := FormatDateTime('hh.mm.ss', Time); // Присваивание timestr -> текущее время

//timestr := FormatDateTime('hh.mm.ss', Time); // Присваивание timestr -> текущее время

//function FileGetDate(Handle: THandle): LongInt;

StrTime:=timestr;

Str:= DateToStr(Now);

Str2 := StrTime;// TimeToStr(Now);

// myfolder :=( namefolderCHET +'_' + Str+'_' + Str2 ); // myfile :=(myfilenameF +'_' + Str+'_'+ Str2 +'.txt'); DateTimeChet:= ( 'Дата ' + Str+ ' Время ' + Str2);

end;

procedure DateTimeSt(myfilenameF :string; var myfile: string);

//создание Файла myfile с текущим временем и папки myfolder

//с текущей датой и текущим временем

begin

myfile :=(myfilenameF +'_' + Str+'_'+ Str2 +'.txt'); end;

procedure ScreenShot(PathToSave: string); begin

// ShowWindow(Form1.Handle,SW_MAXIMIZE); with TBitmap.Create do

begin

Width := Screen.Width; // указываем размеры Height := Screen.Height;

Form1.Width := Screen.Width ;

Form1.Height := Screen.Height ; //Делаем снимок экрана

BitBlt(Canvas.Handle, 0, 0, Screen.Width, Screen.Height,

GetDC(GetDesktopWindow), 0, 0, SRCCOPY); SaveToFile(PathToSave); // сохраняем на диск end;

end;

16

procedure TForm1.Label1Click(Sender: TObject); begin

{} LabeledEdit1.SetFocus; end;

procedure TForm1.Button1Click(Sender: TObject); var

s,s1, x00,x11,x22,y0,y1,y2,b0,b1,b2,m0,m1,m2, p0,p1,p2,p3:string; D0t0,D0t1,D0t2,D0b0,D0b1,D0b2,D0m0,D0m1,D0m2, D0h0,D0h1,D0h2:string; D1t0,D1t1,D1t2,D1b0,D1b1,D1b2,D1m0,D1m1,D1m2, D1h0,D1h1,D1h2:string; D2t0,D2t1,D2t2,D2b0,D2b1,D2b2,D2m0,D2m1,D2m2, D2h0,D2h1,D2h2:string;

procedure procD0; begin

D0t0:=format('%f',[D0Main[0,1]]); // координаты вектора - точки Т0 D0t1:=format('%f',[D0Main[0,2]]);

D0t2:=format('%f',[D0Main[0,3]]);

//координаты вектора - медианы

D0m0:=format('%f',[D0Main[1,1]]);

D0m1:=format('%f',[D0Main[1,2]]);

D0m2:=format('%f',[D0Main[1,3]]);

//координаты вектора - бисектрисы

D0b0:=format('%f',[D0Main[2,1]]);

D0b1:=format('%f',[D0Main[2,2]]);

D0b2:=format('%f',[D0Main[2,3]]);

//координаты вектора - высоты

D0h0:=format('%f',[D0Main[3,1]]);

D0h1:=format('%f',[D0Main[3,2]]);

D0h2:=format('%f',[D0Main[3,3]]);

Label21.Caption:='D0

вершина Т0 = '+ D0t0+'

'+ D0t1+'

'+ D0t2;

Label22.Caption:='D0 медиана Т3 = '+ D0m0+'

'+D0m1+'

'+ D0m2;

Label23.Caption:='D0 бисектриса Т4 = '+ D0b0+'

'+ D0b1+'

'+ D0b2;

Label24.Caption:='D0

высота Т5 = '+ D0h0+'

'+ D0h1+'

'+ D0h2;

end;

 

 

 

procedure procD1; begin

D1t0:=format('%f',[D1Main[0,1]]); // координаты вектора - точки Т1 D1t1:=format('%f',[D1Main[0,2]]);

D1t2:=format('%f',[D1Main[0,3]]);

//координаты вектора - медианы

D1m0:=format('%f',[D1Main[1,1]]);

D1m1:=format('%f',[D1Main[1,2]]);

D1m2:=format('%f',[D1Main[1,3]]);

//координаты вектора - бисектрисы

D1b0:=format('%f',[D1Main[2,1]]);

D1b1:=format('%f',[D1Main[2,2]]);

D1b2:=format('%f',[D1Main[2,3]]);

//координаты вектора - высоты

D1h0:=format('%f',[D1Main[3,1]]);

D1h1:=format('%f',[D1Main[3,2]]);

D1h2:=format('%f',[D1Main[3,3]]);

Label25.Caption:='D1 вершина Т1 = '+ D1t0+' '+ D1t1+' '+ D1t2;

17

Label26.Caption:='D1 медиана Т6 = '+ D1m0+'

'+ D1m1+'

'+ D1m2;

Label27.Caption:='D1 бисектриса Т7 = '+ D1b0+'

'+ D1b1+'

'+ D1b2;

Label28.Caption:='D1

высота Т8 = '+ D1h0+'

'+ D1h1+'

'+ D1h2;

end;

 

 

 

procedure procD2; begin

// координаты вектора - точки Т2 D2t0:=format('%f',[D2Main[0,1]]); D2t1:=format('%f',[D2Main[0,2]]); D2t2:=format('%f',[D2Main[0,3]]);

//координаты вектора - медианы

D2m0:=format('%f',[D2Main[1,1]]);

D2m1:=format('%f',[D2Main[1,2]]);

D2m2:=format('%f',[D2Main[1,3]]);

//координаты вектора - бисектрисы

D2b0:=format('%f',[D2Main[2,1]]);

D2b1:=format('%f',[D2Main[2,2]]);

D2b2:=format('%f',[D2Main[2,3]]);

//координаты вектора - высоты

D2h0:=format('%f',[D2Main[3,1]]);

D2h1:=format('%f',[D2Main[3,2]]);

D2h2:=format('%f',[D2Main[3,3]]);

Label29.Caption:='D2

вершина Т2 = '+ D2t0+'

'+ D2t1+' '+ D2t2;

Label31.Caption:='D2 медиана Т9 = '+ D2m0+'

'+ D2m1+'

'+ D2m2;

Label32.Caption:='D2 бисектриса Т10 = '+ D2b0+'

'+ D2b1+'

'+ D2b2;

Label33.Caption:='D2

высота Т11 = '+ D2h0+'

'+ D2h1+'

'+ D2h2;

end;

 

 

 

begin

//Form1.Button4.Visible :=true; //false; //

s:='В треугольнике наибольшая сторона не превышает сумму двух других сторон'; s1:='Задайте правильно величины сторон треугольника';

a:= StrToFloat(LabeledEdit1.Text); b:= StrToFloat(LabeledEdit2.Text); c:= StrToFloat(LabeledEdit3.Text); p:=(a+b+c)/2;

if (p-a)<0 then begin

s:='Сторона a(0) превышает сумму двух других'; s1:='Поэтому сторона a(0) приравнивается сумме двух других'; ShowMessage(s);

a:=b+c;

ShowMessage( 'Конец счёта ' ); exit;

end;

if (p-b)<0 then begin

s:='Сторона b(1) превышает сумму двух других'; s1:='Поэтому сторона b(1) приравнивается сумме двух других'; ShowMessage(s);

b:=a+c;

ShowMessage( 'Конец счёта ' ); exit;

end;

18

if (p-c)<0 then begin

s:='Сторона c(2) превышает сумму двух других'; s1:='Поэтому сторона c(2) приравнивается сумме двух других'; ShowMessage(s);

c:=a+b;

ShowMessage( 'Конец счёта ' ); exit;

end; if

( (a = (b+c)) or (b =(a+c)) or (c =(a+b)) ) then

begin ShowMessage( 'Большая сторона

равна сумме двух других' );

ShowMessage( 'Треугольник вырождается в линию ' );

ShowMessage( 'Конец счёта ' );

 

exit

 

end

 

else

 

// ShowMessage( 'a = '+FloatToStr(a)+'

b = ' +FloatToStr(b)+' c = '+FloatToStr(c) );

//Вызов процедуры

MainTriAngleVektor(a,b,c,

D0Main ,D1Main ,D2Main, angleMain,hMain,medianaMain,bisektrisaMain, parametrMain );

x00:=format('%f',[angleMain[0]*180/pi]); x11:=format('%f',[ angleMain[1] *180/pi]); x22:=format('%f',[angleMain[2]*180/pi]);

y0:=format('%f',[HMain[0]]);

y1:=format('%f',[HMain[1]]);

y2:=format('%f',[HMain[2]]);

m0:=format('%f',[medianaMain[0]]);

m1:=format('%f',[medianaMain[1]]);

m2:=format('%f',[medianaMain[2]]);

b0:=format('%f',[bisektrisaMain[0]]);

b1:=format('%f',[bisektrisaMain[1]]);

b2:=format('%f',[bisektrisaMain[2]]);

p0:=format('%f',[parametrMain [0]]); //Периметр p1:=format('%f',[parametrMain [1]]); //Площадь p2:=format('%f',[parametrMain [2]]); //Радиус вписанной окружности p3:=format('%f',[parametrMain [3]]); //Радиус описанной окружности

Label1.Caption:='Угол(0)= '+x00+' град';

Label7.Caption:='Угол(1)= '+x11+' град';

Label8.Caption:='Угол(2)= '+x22+' град';

Label10.Caption:='Высота h(0) = '+ y0;

Label9.Caption:='Высота h(1) = '+ y1;

Label2.Caption:='Высота h(2) = '+ y2;

Label12.Caption:='Медиана m(0) = '+ m0; Label13.Caption:='Медиана m(1) = '+ m1; Label14.Caption:='Медиана m(2) = '+ m2; Label15.Caption:='Бисектриса b(0) = '+ b0;

19

Label16.Caption:='Бисектриса b(1) = '+ b1;

Label17.Caption:='Бисектриса b(2) = '+ b2;

Label11.Caption:='Площадь = '+ p1; Label18.Caption:='Периметр = '+ p0; Label19.Caption:='Радиус вписанной окружности = '+ p2; Label20.Caption:='Радиус описанной окружности = '+ p3; procD0;

procD1;

procD2;

end;

procedure TForm1.Button2Click(Sender: TObject); begin

WinExec(PANsiChar('TASKKILL /F /IM CalcTriAngleVektor.exe'), SW_HIDE); //удаление процесса close;

end;

procedure TForm1.Button3Click(Sender: TObject); var MyFile : string;

begin

Button3.Visible := false; // true; // ShowWindow(FindWindow('Shell_TrayWnd', nil), sw_hide); Inc(Counter);

MyFile:= 'Расчёт треугольника по 3-м сторонам- '+ IntToStr(Counter)+ '.bmp'; ScreenShot( MyFile );

Button3.Visible :=true; // false; // DateTimeSt(myfile,myfile);

ShowWindow(FindWindow('Shell_TrayWnd', nil), SW_SHOWNORMAL); end;

procedure TForm1.LabeledEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

{} if (Key = VK_Return) then LabeledEdit2.SetFocus; end;

procedure TForm1.LabeledEdit2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

if (Key = VK_Return) then LabeledEdit3.SetFocus; end;

procedure TForm1.LabeledEdit4KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

{} if (Key = VK_Return) then LabeledEdit1.SetFocus; end;

end.

Вызов процедуры

MainTriAngleVektor(a,b,c,

D0Main ,D1Main ,D2Main,

20