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

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

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

Динамическая библиотека TriAngleMainVektor.dll Автор: Казимиров Леонид Петрович

email: kaslp1939@mail.ru

Москва, 2019г.

Руководство пользователя

Программа написана на ДЕЛФИ для Windows x32

Листинг library TriAngleMainVektor

library TriAngleMainVektor; {$R *.res}

uses Vcl.Dialogs, System.SysUtils, System.Classes, System.Math;

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; raT03=array [0..3] of extended;

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

procedure matrica(a: extended; x,y,z:integer;var M: raMatric3_3); //--- формирование матрицы M

//--- a[град]-угол,на который совершается поворот вокруг одной из осей x,y,z //--- всегда задаются x,y,z в виде (1,0,0) или (0,1,0) или (0,0,1)

var i :integer; sna,csa:extended; begin

a := a * pi / 180; sna:=sin(a);csa:=cos(a); if x=1 then begin

for i:=2 to 3 do begin M[i,i]:=csa; M[i,1]:=0; M[1,i]:=0; end; M[1,1]:=1; //определена диагональ матрицы M // M[2,3]:=sna;M[3,2]:=-sna; end;

if Y=1 then begin

for i:=1 to 3 do begin M[i,i]:=csa; M[2,i]:=0; M[i,2]:=0; end; M[2,2]:=1; //определена диагональ матрицы M M[3,1]:=sna;M[1,3]:=-sna; end;

if z=1 then begin

for i:=1 to 2 do begin M[i,i]:=csa; M[i,3]:=0; M[3,i]:=0; end; M[3,3]:=1; //определена диагональ матрицы M M[1,2]:=sna;M[2,1]:=-sna; end;

end;

1

procedure summvekt( a, b: vekt13; var C: vekt13);

//--- векторное сложение двух векторов 3-го порядка - С=A+B; ---

begin

C[1] := a[1] + b[1]; C[2] := a[2] + b[2]; C[3] := a[3] + b[3]; end;

procedure raznostvekt( a, b: vekt13 ; var C:vekt13 );

// --- векторная разность двух векторов 3-го порядка - С=A-B; ---

begin

C[1] := a[1] - b[1]; C[2] := a[2] - b[2]; C[3] := a[3] - b[3]; end;

procedure matrvektor(A: raMatric3_3; b: vekt13; var C: vekt13); //--- умножение матрицы A на вектор - С=A*B;

var

M, n: integer;

begin

for M := 1 to 3 do c[M] := 0;

for M := 1 to 3 do for n := 1 to 3 do

begin

//C[1] := a[1, 1]* B[1]+ a[1, 2]* B[2]+ a[1, 3]* B[3];

//C[2] := a[2, 1]* B[1]+ a[2, 2]* B[2]+ a[2, 3]* B[3];

//C[3] := a[3, 1]* B[1]+ a[3, 2]* B[2]+ a[3, 3]* B[3];

//C[M ] := a[M, n ]* B[n ]+ a[M, n ]* B[n ]+ a[M, n ]* B[n ];

c[M]:=c[M]+A[M,n]*b[n];

end;

end;

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

var angleMain,hMain,medianaMain,bisektrisaMain:vekt02; var parametrMain:raT05);stdcall;

//procedure MainTriAngleVektor( a,b,c:extended;

//var D0 ,D1 ,D2 : ravekt03;

//var angle,h,medianaV,bisektrisaV:vekt02;

//var parametrMain:raT05);stdcall;

//расчёт тр-ка по 3-м сторонвм a,b,c

//любой угол принимается за 0,

//порядок следования вершин(углов) - против час.стрелки 0-1-2.

//Стороны против углов(вершин)- a(0),b(1),c(2)

//перпендикуляры(высоты), опущенные с вершин(углов)

//на противоположную сторону - h(0),h(1),h(2)

//bisektrisaV - бисектриса угла 0,1,2

2

//medianaV - медиана на сторону - a(0),b(1),c(2)

//D - вектор координат точек - вершин(углов), высот, медиан,бисектрис

//в СК - принятой за основную

//parametrMain

//2* p=parametrMain[0] - периметр

//S=parametrMain[1] - площадь

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

//RO=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 - радиус вписанной окружности

var

angle ,h ,mediana,bisektrisa :vekt02; parametrV:raT05;

D0,D1,D2 : ravekt03; var at:raT04 ; alfa:raT03 ;

p,ROa,ROb,ROc,rB,S:extended ; var

T2ck0,T9ck0,T10ck0, T11ck0: vekt13; // ck0 T0ck1,T1ck1,T3ck1,T4ck1,T5ck1: vekt13; // ck1

T0ck11,T3ck11,T4ck11,T5ck11: vekt13; // ck1 T0ck2, T1ck2,T6ck2,T7ck2, T8ck2: vekt13; // ck2

T1ck22,T6ck22,T7ck22, T8ck22: vekt13; // ck2 alfa4,alfa10,alfa7,ugolMatrica1,ugolMatrica2:extended ;

M1,M2: raMatric3_3;

procedure TriAngleH( );

//a,b,c:extended;

//var angle,h,mediana,bisektrisa:vekt02;

//var parametrV:raT05

//расчёт тр-ка по 3-м сторонам a,b,c

//любой угол принимается за 0,

//порядок следования вершин(углов) - против час.стрелки 0-1-2.

//Стороны против вершин(углов)- a(0),b(1),c(2)

//перпендикуляры(высоты), опущенные с вершин(углов)

//на противоположную сторону - h(0),h(1),h(2)

//bisektrisa - бисектриса угла 0,1,2

//mediana - медиана на сторону - a(0),b(1),c(2)

//p - полупериметр

//2* p= parametrV[0] - периметр

//S=parametrV[1] - площадь

//rB= parametrV[2] - радиус вписанной окружности

//RO=parametrV[3]:= ROa; или -parametrV[4]:= ROb или -parametrV[5]:= ROc;-радиус описанной окружности

3

//радиус описанной окружности вычисляется с использованием сторон a(0),b(1),c(2) // ROa:=a/(2*sin(alfa[0])); ROb:=b/(2*sin(alfa[1])); ROc:=c/(2*sin(alfa[2]));

//var at:raT04 ; //alfa:raT03 ;

//p,ROa,ROb,ROc,rB,S:extended ; var i:integer;

begin

at[0]:=a; at[1]:=b; at[2]:=c; at[3]:=a; at[4]:=b; p:= (a+b+c)/2; rB:=sqrt(((p-a)*(p-b)*(p-c))/p ); S:= p*rB;

for i:=0 to 2 do begin

alfa[i]:=2*(pi/2 - Arcsin(sqrt(p*(p-at[i])/(at[i+1]*at[i+2]))));

angle[i]:= alfa[i];end;

alfa[3]:= alfa[0];

for i:=0 to 2 do h[i]:=at[i+2]* sin(alfa[i+1]);

////////////////

for i:=0 to 2 do

mediana[i]:=( sqrt( sqr(at[i+1]) + sqr(at[i+2])+2*at[i+1]*at[i+2]* cos(alfa[i])))/2; for i:=0 to 2 do

bisektrisa[i]:=( 2*at[i+1]*at[i+2]* cos(alfa[i]/2))/(at[i+1]+at[i+2] );

///////////

parametrV[0]:= 2* p; parametrV[1]:= S; parametrV[2]:= rB; ROa:=a/(2*sin(alfa[0]));

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

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

parametrV[3] := ROa; parametrV[4]:= ROb; parametrV[5]:= ROc; end;

procedure HBMvekt;

var i:integer; begin

//+++++++++++++++++++++++++++++++++

begin

//начало координат в т.0

//начало координат в т.0

//поступим следующим образом

//начало координат в т.0

//В СК0 находим координаты точки Т2 и линий – высоты h2,

//mediana2 и bisektrisa2.

//координаты точки Т2

4

T2ck0[1]:=b * cos(angle[0]); //*sign(pi/2-angle[0])

T2ck0[2]:=b* sin(angle[0]);

T2ck0[3]:=0;

//далее находим координаты вектора - медианы - точка T9

T9ck0[1]:=c/2;

T9ck0[2]:=0;

T9ck0[3]:=0;

//далее находим координаты вектора - бисектрисы - точка T10 alfa10:=pi- (angle[1]+angle[2]/2);

T10ck0[1]:=T2ck0[1]-bisektrisa[2]* cos(alfa10) ;

T10ck0[2]:=0;

T10ck0[3]:=0;

//далее находим координаты вектора - высоты - точка T11

T11ck0[1]:= T2ck0[1];

T11ck0[2]:= T2ck0[2];

T11ck0[3]:=0;

//найдены координаты точек 9,10,11 -векторов -медианы, бисектрисы и высоты //проведенные из т.T2 на сторону c- в СК0

//++++++++++++++++++ for i:=1 to 3 do begin

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

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

end;

//++++++++++++++++++

end;

//++++++++++++++++++++++++++++++++++ begin

//начало координат в т.1

//начало координат в т.1

//В СК1 находим координаты точки Т0 и линий – высоты h0,

//координаты точки Т0

T1ck1[1]:=0;

T1ck1[2]:=0;

T1ck1[3]:=0;

T0ck1[1]:=c * cos(angle[1]); T0ck1[2]:=c* sin(angle[1]); T0ck1[3]:=0;

//далее находим координаты вектора - медианы(3) T3ck1 T3ck1[1]:=a/2;

T3ck1[2]:=0;

T3ck1[3]:=0;

//далее находим координаты вектора - бисектрисы(4) T4ck1

5

alfa4:=pi-(angle[1]+angle[0]/2);

T4ck1[1]:= bisektrisa[0]* cos(alfa4)+T0ck1[1];

T4ck1[2]:=0;

T4ck1[3]:=0;

//далее находим координаты вектора - высоты(5) T5ck1 T5ck1[1]:=T0ck1[1];

T5ck1[2]:=0;

T5ck1[3]:=0;

//координаты точки Т0

//повернём СК в т.1 вокруг оси Z

//на угол так, чтобы ось Х совпала с линией 0-1.

//Угол поворота будет равен

//дополнительному углу т.1. Получим СК0, см. рис. ниже.

//Перенесём начало координат в т.0

//Хнов=Хстар+с

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

ugolMatrica1:=-(pi-angle[1])*180/pi;

// далее перенос т.1 в т.0 - векторно Хнов= Хстар + c

// procedure raznostvekt(a, B: vekt13; var C:vekt13); summvekt

{--- векторная разность двух векторов 3-го порядка - С=A-B; --- } // начало координат в т.1

raznostvekt(T0ck1,T0ck1,T0ck11); raznostvekt(T3ck1 ,T0ck1,T3ck11); raznostvekt(T4ck1 ,T0ck1,T4ck11); raznostvekt(T5ck1 ,T0ck1,T5ck11);

// поворот векторов точек 3,4,5 и т.T0

//В СК0 находим координаты точки Т0 и линий – высоты h0, matrica(ugolMatrica1, 0,0,1, M1);

//procedure matrvektor(a: raMatric3_3; B: vekt; var C: vekt);

{--- умножение матрицы A на вектор - С=A*B; }

//matrvektor(a: raMatric3_3; B: vekt; var C: vekt); matrvektor(M1,T0ck11,T0ck11 ); matrvektor(M1,T3ck11,T3ck11 ); matrvektor(M1,T4ck11,T4ck11 ); matrvektor(M1,T5ck11,T5ck11 );

for i:=1 to 3 do begin

D0[ 0,i]:= T0ck11[i]; // координаты вектора - точки Т0 D0[ 1,i]:= T3ck11[i]; // координаты вектора - медианы(Т3)

D0[ 2,i]:= T4ck11[i]; // координаты вектора - бисектрисы(Т4) D0[ 3,i]:= T5ck11[i]; // координаты вектора - высоты(Т5)

end;

//найдены координаты точек 3,4,5 -векторов -медианы, бисектрисы и высоты //проведенные из т.T0 на сторону а - в СК1

6

end;

//+++++++++++++++++++++++++++++++++++++++

begin // начало координат в т.2 // начало координат в т.2 //далее поступим следующим образом

//Перенесём начало координат в т.2 и повернём СК вокруг оси Z

//на угол так, чтобы ось Х совпала с линией 1-2.

//Угол поворота будет равен

//дополнительному углу т.1. Получим СК1, см. рис. ниже.

//В СК1 находим координаты точки Т1 и линий – высоты h1,

//mediana1 и bisektrisa1.

//координаты точки Т0

T0ck2[1]:=b; //++++

T0ck2[2]:=0; //++++

T0ck2[3]:=0;

// координаты точки Т1

T1ck2[1]:=a * cos(angle[2]); //*sign(pi/2-angle[2]) //++++ T1ck2[2]:=a * sin(angle[2]); //++++

T1ck2[3]:=0;

// начало координат в т.2

//далее находим координаты вектора - медианы -точка T6

T6ck2[1]:=b/2;

T6ck2[2]:=0;

T6ck2[3]:=0;

//далее находим координаты вектора - бисектрисы - точка T7

alfa7:= pi-(angle[0]+angle[1]/2);

alfa10:= bisektrisa[1]* cos(alfa7);

T7ck2[1]:=T1ck2[1]-alfa10;

T7ck2[2]:=0;

T7ck2[3]:=0;

alfa7:= a* cos(angle[2]);

//далее находим координаты вектора - высоты -точка T8 T8ck2[1]:= alfa7; // ++++

T8ck2[2]:=0;

T8ck2[3]:=0;

//Перенос начала координат в т.0

//перенос т.2 в т.0 - Хнов= Хстар + с

/////////////////////////////////

//далее перенос т.2 в т.0 - векторно Хнов= Хстар + c

// procedure raznostvekt(a, B: vekt13; var C:vekt13); summvekt

7

{--- векторная разность двух векторов 3-го порядка - С=A-B; --- }

//координаты точки Т0

raznostvekt( T1ck2,T0ck2,T1ck22);// координаты точки Т1 raznostvekt(T6ck2 ,T0ck2,T6ck22); //координаты вектора - медианы -точка T6

raznostvekt(T7ck2 ,T0ck2,T7ck22); // координаты вектора - бисектрисы -точка T7 raznostvekt(T8ck2 ,T0ck2,T8ck22);//координаты вектора - высоты -точка T8

////////////////////

// находим матрицу поворота

// угол поворота равен ugolMatrica2 ugolMatrica2:= (pi-angle[0])*180/pi;

matrica(ugolMatrica2, 0,0,1, M2);

matrvektor(M2,T1ck22,T1ck22 ); matrvektor(M2,T6ck22,T6ck22 ); matrvektor(M2, T7ck22, T7ck22 ); matrvektor(M2,T8ck22,T8ck22 );

for i:=1 to 3 do begin

D1[ 0,i]:= T1ck22[i]; // координаты вектора - точки Т1 D1[ 1,i]:= T6ck22[i]; // координаты вектора - медианы(Т6)

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

end;

//найдены координаты точек 3,4,5 -векторов -медианы, бисектрисы и высоты //проведенные из т.T0 на сторону а(0) - в СК1

end end;

////////////////////////////////////////////// var XX:raT05

begin

//a:=3; b:=4; c:=5;

//ShowMessage( ' Перед TriAngleH' );

// ShowMessage( 'a = '+FloatToStr(a)+' b = ' +FloatToStr(b)+' c = '+FloatToStr(c) );

//ShowMessage( ' Перед TriAngleH' ); TriAngleH();

//ShowMessage( ' Перед HBMvekt' ); HBMvekt;

//ShowMessage( ' После HBMvekt' ); //( a,b,c,

//D0 ,D1 ,D2 , angle ,h ,mediana ,bisektrisa , parametrV);

//HBMvekt( a,b,c,

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

D0Main:= D0;

D1Main:= D1;

8

D2Main:= D2; angleMain:=angle; hMain:=h; medianaMain :=mediana; bisektrisaMain :=bisektrisa; parametrMain:= parametrV ;

end;

exports MainTriAngleVektor; begin

end.// library

Вычисляются параметры треугольника, в котором заданы 3 стороны – a(0), b(1), c(2).

Использована литература:

Бронштейн И.Н и Семендяев К.А. Справочник по математике М.,1964 г., стр. 186.

Используются следующие обозначения. Стороны – a, b, c.

Углы против сторон соответственно 0, 1, 2.

Таким образом стороны – a, b, c - обозначаются как a(0), b(1), c(2), то есть против угла 0 лежит сторона a(0) и т.д.

Порядок следования углов ( сторон) – против часовой стрелки.

При использовании библиотеки в программе необходимо учесть следующие параметры:

Типы массивов: 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; raT03=array [0..3] of extended;

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

Типы переменных 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;

Общий вид главной процедуры

procedure MainTriAngleVektor( a,b,c:extended; var D0 ,D1 ,D2 : ravekt03;

var angle,h,medianaV,bisektrisaV:vekt02;

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

9

Расчёт треугольника по 3-м сторонам a,b,c

Порядок следования вершин(углов) - против часовой стрелки 0-1-2. Стороны против углов(вершин)- a(0), b(1), c(2)

перпендикуляры(высоты), опущенные с вершин(углов) на противоположную сторону - h(0), h(1), h(2)

Переменные h, medianaV, bisektrisaV – обозначают модули (длины) соответствующих параметров.

Вектор angle

Имеет координаты - angle [0] - величина угла 0 angle [1] - величина угла 1 angle [2] - величина угла 2

Вектор h

Имеет координаты - h [0] - модуль высоты из угла 0 на сторону a(0) h [1] - модуль высоты из угла 1 на сторону b(1) h [2] - модуль высоты из угла 2 на сторону c(2).

Вектор bisektrisaV

Имеет координаты - bisektrisaV[0] - модуль бисектрисы угла 0 bisektrisaV[1] - модуль бисектрисы угла 1 bisektrisaV[2] - модуль бисектрисы угла 2

Вектор medianaV

Имеет координаты - medianaV[0] - модуль медианы из угла 0 на сторону a(0) medianaV[1] - модуль медианы из угла 1 на сторону b(1) medianaV[2] - модуль медианы из угла 2 на сторону c(2).

Параметры D0 ,D1 ,D2

D0 , D1 , D2 – каждый представляет собой вектор 4-го порядка, составляющие которого - векторы координат точек - вершин(углов), высот, медиан, бисектрис:

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

D0[ 0,i]:= T0ck11[i]; // координаты вектора - точки Т0 D0[ 1,i]:= T3ck11[i]; // координаты вектора - медианы(Т3)

D0[ 2,i]:= T4ck11[i]; // координаты вектора - бисектрисы(Т4) D0[ 3,i]:= T5ck11[i]; // координаты вектора - высоты(Т5)

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

D1[ 0,i]:= T1ck22[i]; // координаты вектора - точки Т1 D1[ 1,i]:= T6ck22[i]; // координаты вектора - медианы(Т6)

D1[ 2,i]:= T7ck22[i]; // координаты вектора - бисектрисы(Т7)

10