- •« Автоматизація проектування графічного плану виробничого приміщення »
- •« Автоматизація проектування графічного плану виробничого приміщення »
- •« Автоматизація проектування графічного плану виробничого приміщення »
- •« Автоматизація проектування графічного плану виробничого приміщення »
- •Пробна програма визначеня кутів , (у градусах) і координат точки в1.
- •« Автоматизація проектування графічного плану виробничого приміщення »
- •« Автоматизація проектування графічного плану виробничого приміщення »
Пробна програма визначеня кутів , (у градусах) і координат точки в1.
1.Створюють для проби нову форму, на якій розміщають чотири об’єкти класу TSpinEdit, кнопку Button1 і поле редагування класу TEdit.
2.Створюють процедуру Button1Click, з допомогою якої за координатами x1,y1 точки A і координатами x2,y2 точки B визначатимуть значення кута у градусах. Результат обчислення виводитиметься у поле Edit1.
procedure TForm3.Button1Click(Sender: TObject);
VAR x1,y1,x2,y2: integer;
begin
x1:=SpinEdit1.Value;
x2:=SpinEdit2.Value;
y1:=SpinEdit3.Value;
y2:=SpinEdit4.Value;
if ((y2<y1) and (x2>x1)) then // верхня ліва ілюстрація на рисунку 32
Edit1.Text:=IntToStr (round (abs(arctan((x2-x1)/(y1-y2)))*180/pi)); // з формули (4)
if ((y2>y1) and (x2>x1)) then // верхня права ілюстрація на рисунку 32
edit1.Text:=IntToStr (round(abs(arctan((y2-y1)/(x2-x1)))*180/pi)+90);
if ((y2>y1) and (x2<x1)) then // нижня ліва ілюстрація на рисунку 32
edit1.Text:=IntToStr (round(abs(arctan((x2-x1)/(y2-y1)))*180/pi)+180) ;
if ((y2<y1) and (x2<x1)) then // нижня права ілюстрація на рисунку 32
edit1.Text:= IntToStr (360 -round (abs(arctan((x2-x1)/(y2-y1)))*180/pi));
// оскільки ділення на 0 заборонене, то запропоновані додаткові умови
if ((x2>x1)and(y2=y1)) then edit1.Text:=’ 90’;
if ((x2<x1)and(y2=y1)) then edit1.Text:=’270’;
if ((x2=x1)and(y2>y1)) then edit1.Text:=’180’;
if ((x2=x1)and(y2<y1)) then edit1.Text:=’0’;
end;
Рисунок 32 – Визначення кута орієнтації точки В фігури відносно базової точки А цієї фігури.
3. Запускають дану прикладну програму (створену на основі Form3 ) і за допомогою координат внесених у поля компонент TSpinEdit отримують значення кута у градусах.
Рисунок 33 – Визначення кута орієнтації точки В фігури відносно базової точки А цієї фігури за допомогою вненсених координат точки А(X1,Y1) і точки В(X2,Y2).
4.. Для внесення у програму значень координат X3,Y3 точки В1 на вікні форми розміщають два додаткових об’єкти класу TSpinEdit.
5. У розділ декларації глобальних змінних дописують оголошення x1,y1,x2,y2,x3,y3,alfa : integer, відповідно прибравши локальне оголошення VAR x1,y1,x2,y2: integer з процедури TForm3. Button1Click.
6. Додають на вікно форми дві радіокнопки і програмно узалежнюють доступність кожного з додаткових об’єктів класу TSpiEdit від стану включення відповідної радіокнопки. Для цього створюють процедуру опрацювання події OnPaint:
procedure TForm3.FormPaint(Sender: TObject);
begin
if radiobutton1.Checked =true then
begin SpinEdit5.Enabled:=true; SpinEdit6.Enabled :=false; end
else
begin SpinEdit6.Enabled:=true; SpinEdit5.Enabled :=false; end
end;
7. Запускають прикладну програму (рисунок 34) і переконуються у дієвості коду опрацювання події OnPaint .
Рисунок 34 – Прикладна програма доповнена можливістю внесення координат X3,Y3 точки В1.
8. Користуючись виразами (9),(10),(11),(12) встановлюють залежність координати X3 від координати Y3 і навпаки у вигляді коду подій:
procedure TForm2.SpinEdit5Change(Sender: TObject);
begin
X3:=SpinEdit5.Value;
if y3>y1 then
Y3:=y1+round(sqrt(abs(sqr(y1-y2)+sqr(x2-x1)-sqr(x3-x1)))) ;
if y3<y1 then
Y3:=y1-round(sqrt(abs(sqr(y1-y2)+sqr(x2-x1)-sqr(x3-x1)))) ;
if radiobutton1.Checked =true then SpinEdit6.Value:=y3;
end;
procedure TForm2.SpinEdit6Change(Sender: TObject);
begin
Y3:= SpinEdit6.Value;
if x3>x1 then
X3:=x1+trunc(sqrt(abs(sqr(y1-y2)+sqr(x2-x1)-sqr(y1-y3))));
if x3<x1 then
X3:=x1-trunc(sqrt(abs(sqr(y1-y2)+sqr(x2-x1)-sqr(y1-y3))));
if radiobutton2.Checked =true then SpinEdit5.Value:=x3 ;
end;
9. Запускають підпрограму для того, щоб переконатись у її дієздатності. Для цього слід надати значення змінним X1,X2,Y1,Y2 ввівши їх у відповідні об’єкти класу TSpiEdit. Після внесення цих даних слід здійснити підтвердження, тобто клацнути по кнопці Button1 (рисунок35).
Рисунок 35 – Прикладна програма доповнена можливістю внесення координат X3,Y3 точки В1 із визначеним значенням кута .
10. Шляхом перебору прокрутки (а не шляхом внесення з клавіатури) надають значення координати Y3, якщо активна відповідна їй радіокнопка. Пересвідчуються в тому, що автоматично отримується відповідне значення координати Х3 (рисунок 36).
Рисунок 36 – Внесення координати Y3 і автоматичне отримання значення координати Х3.
11. Переключають радіокнопку і вводять за допомогою прокрутки значення Х3, автоматично отримуючи значення Y3(рисунок 37).
Рисунок 37 – Внесення координати X3 і автоматичне отримання значення координати Y3.
12. Для визначення кутів і на форму додають ще два об’єкти класу TEdit (рисунок 38) .
Рисунок 38 – Внесення на форму додаткових полів редагування для отримання значень кутів , .
13. На вікно форми додають ще одну кнопку і створюють заготовку події OnClick. В тіло опрацьовувача цієї події, користуючись формулою (5) додають код для визначення кута g і відтак користуючись формулою (1) дописують код визначення кута a.
procedure TForm2.Button2Click(Sender: TObject);
begin
if ((y3<y1)and (x3>x1)) then
edit2.Text:=INTTOSTR (ROUND(abs(arctan((x3-x1)/(y1-y3)))*180/pi));
if ((y3>y1)and (x3>x1)) then
edit2.Text:=INTTOSTR (trunc(abs(arctan((y3-y1)/(x3-x1)))*180/pi)+90);
if ((y3>y1)and (x3<x1)) then
edit2.Text:=INTTOSTR (trunc(abs(arctan((x3-x1)/(y3-y1)))*180/pi)+180) ;
if ((y3<y1)and (x3<x1)) then
edit2.Text:=INTTOSTR (360-ROUND(abs(arctan((x3-x1)/(y3-y1)))*180/pi));
if ((x3>x1)and(y3=y1)) then edit2.Text:='90';
if ((x3<x1)and(y3=y1)) then edit2.Text:='270';
if ((x3=x1)and(y3>y1)) then edit2.Text:='180';
if ((x3=x1)and(y3<y1)) then edit2.Text:='0';
alfa:=strToInt(edit2.text)-StrToInt(edit1.Text) ;
edit3.Text:=InttoStr(alfa)
end;
14.Запускають програму, щоб переконатись у її дієздатності (рисунок 39).Для цього вводять координати X1,X2,Y1,Y2, далі клацають по кнопці Button1 і отримують значення кута b. Наступним кроком за допомогою прокрутки вводять значення координати Y3, якщо активною є радіокнопка поруч, в противному випадку за допомогою прокрутки вводять значення координати Х3.Після цього клацають по кнопці Button2 і отримують значення кутів a і g у відповідних полях редагування.
Рисунок 39 – Програма для встановлення координат точок А,В,і для визначення кутів a b,g, і координат точки В1.
Теоретичне підґрунтя
Визначивши у попередніх пунктах величину кута повороту фігури АВС -a , а також знаючи координати точки С даної фігури – xc,yc можна визначити спочатку величину кута – bc (рисунок 40):
(радіан), якщо yc<ya і xc>xa (13)
+90 (радіан), якщо yc>ya і xc<xa (14)
, а відтак і значення кута gc:
gc = a+ bc. (15)
Із трикутника АС1D отримують рівняння для визначення координат yc1, хс1 :
(yc1-ya)/ (| AC1|) = sin(18 0 -gc),(16)
а отже yc1= ya+ sin(gc)) ( | AC1|),(17)
за аналогією хс1=xa+ sin(180-gc))( | AC1|),( 18)
Рисунок 40 – Визначення кутів для точок С і С1.
У той же час величину | AC1| можна визначити із трикутника С1АС за теоремою Піфагора: (| AC1|) = (16)
Пробна програма визначення координат точки С1.
1.У вікні форми розміщають два додаткові об’єкти TSpinEdit, з допомогою яких можна вводити координати точки С і ще два об’єкти TSpinEdit для автоматичного визначення координат точки C1 (рисунок 40), виходячи з того, що кут повороту С1АС дорівнює куту .
2. Розміщають на вікні форми додаткову кнопку TButton і створюють процедуру опрацювання події клацання по ній (рисунок 41):
Рисунок 41 – Дизайн застосунка для встановлення координат точок А,В,С, для визначення кутів a b,g, і координат точки В1, для визначення кутів і координат для точкиі С1, а також довжини відрізка АС.
procedure TForm2.Button3Click(Sender: TObject);
VAR xc1,yc1,xc,yc:integer; dovgyna_ac,beta,gama:integer;
begin
// Надання значень координат точки С.
xc:=SpinEdit7.Value; yc:=SpinEdit8.Value;
// координати точки А у розділі глобальних оголошень – це y1,x1.
ya:=y1; xa:=x1;
// Визначення величини кута згідно з формулами (13 ) і (14)
if ((yc<ya)and (xc>xa)) then
beta:=trunc(abs(arctan((xc-xa)/(ya-yc)))*180/pi);
if ((yc>ya)and (xc>xa)) then
beta:=trunc(abs(arctan((yc-ya)/(xc-xa)))*180/pi)+90;
if ((yc>ya)and (xc<xa)) then
beta:=trunc(abs(arctan((xc-xa)/(yc-ya)))*180/pi)+180 ;
if ((yc<ya)and (xc<xa)) then
beta:=360-trunc(abs(arctan((xc-xa)/(yc-ya)))*180/pi);
// Додаткові умови для уникнення ділення на число 0
if ((xc>xa)and(yc=ya)) then beta:=90;
if ((xc<xa)and(yc=ya)) then beta:=270;
if ((xc=xa)and(yc>ya)) then beta:=180;
if ((xc=xa)and(yc<ya)) then beta:=0;
// Можна вивести значення
SpinEdit11.Value:=beta;
// Визначення довжини відрізка АС згідно з формулою (16)
dovgyna_ac :=trunc(sqrt(sqr(xc-xa)+sqr(yc-ya)));
// Можна вивести значення |АС|
SpinEdit12.Value:=dovgyna_ac;
// Визначення величини кута для точки С1 за формулою (15)
gama:=alfa+beta;
// Можна вивести значення кута точки С1
SpinEdit13.Value:= gama;
// Визначення величини координат точки С1 за формулами (16), (17) і (18)
If ( (yc1> ya) and (xa<xc1)) then
yc1:= trunc(ya + abs(sin(gama))* dovgyna_ac); // рисунок 40, або
// рисунок 42 верхній правий
xc1:= trunc(xa + abs(sin(180-gama))* dovgyna_ac) ;
If (( yc1< ya) and (xa<xc1)) then
yc1:= trunc(ya - abs(sin(gama+90))* dovgyna_ac); // рисунок 42 верхній лівий
// очевидно, що цей рядок можна переписати так:
yc1:= trunc(ya - abs(cos(gama))* dovgyna_ac) ;
xc1:= trunc(xa + abs(sin(gama))* dovgyna_ac) ;
If ( (yc1> ya) and (xa>xc1)) then
yc1:= trunc(ya + abs(cos(gama+180))* dovgyna_ac) ; // рисунок 42 нижній лівий
// очевидно, щ оцей рядок можна переписати так:
yc1:= trunc(ya + abs(cos(gama))* dovgyna_ac) ;
xc1:= trunc(xa - abs(sin(gama-180))* dovgyna_ac) ;
// очевидно, щ оцей рядок можна переписати так:
xc1:= trunc(xa - abs(sin(gama))* dovgyna_ac) ;
If ( (yc1< ya) and ( xa>xc1)) then
yc1:= trunc(ya - abs(sin(gama -270))* dovgyna_ac) ; // рисунок 42 нижній правий
// очевидно, що цей рядок можна переписати так:
yc1:= trunc(ya - abs(cos(gama))* dovgyna_ac) ;
xc1:= trunc(xa - abs(cos(gama-270))* dovgyna_ac) ;
// очевидно, що цей рядок можна переписати так:
xc1:= trunc(xa - abs(sin(gama))* dovgyna_ac) ;
// Виведення значень координат точки С1
SpinEdit9.Value:=xc1;
SpinEdit10.Value:=yc1;
end;
Рисунок 42 – Ілюстрація до пояснення, як визначити координати точки С1,.
3. Запускають прикладну програму і вводять дані X1,X2,Y1,Y2 .Виконують подію OnClick кнопки Button1 і отримують значення кута b для точки B1, Вводять використовуючи тільки прокрутки значення Y3, якщо активною є радіокнопка поруч (рисунок 43), або вводять використовуючи тільки прокрутки значення X3, якщо активною є інша відповідна їй радіокнопка поруч. Отримують значення X3. Виконують подію OnClick кнопки Button2Click. Отримують значення кута g для точки B1, значення кута a. Вводять дані для точки С – координати Xc,Yc. Виконують подію OnClick кнопки Button3 . Отримують координати Xc1,Yc1 точки С1, значення кута gc для точки C1, значення кута bc для точки C і довжину відрізка АС.
Рисунок 43 – Застосунок для встановлення координат точок А,В,С, для визначення кутів a b,g, і координат точки В1, для визначення кутів і координат для точки С1, а також довжини відрізка АС.
З Зразок створення застосунку