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