Расчёт треугольника по трём сторонам_dll_
.pdfДинамическая библиотека 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