Щоб визначити кут між двома відрізками: AB(X1, Y1, X2, Y2) та BC(X2, Y2, X3, Y3):
1. Описуємо потрібні змінні:
Код: Виділити все
VnCutStr : string;
VnCut, X1, Y1, X2, Y2, X3, Y3 : extended;
2. Зверху, після блока var добавляємо функціЇ розрахунку арккосинуса і кута:
Код: Виділити все
// Функция вычисления арккосинуса
function ArcCos(X: extended): extended;
var
Cut : extended;
begin
If X <= -1.0 then
Cut := Pi
else
begin
If X < -Sqrt(2) / 2 then
Cut := Pi + ArcTan(Sqrt(1 - X * X) / X) { левый край }
else
begin
If X <= Sqrt(2) / 2 then
Cut := Pi / 2 - ArcTan(X / Sqrt(1 - X * X)) { центр }
else
begin
If X < 1.0 then
Cut := ArcTan(Sqrt(1 - X * X) / X) { правый край }
else
Cut := 0.0;
end;
end;
end;
Result := (180 / Pi) * Cut;
end;
// Функция расчёта направленного угла между тремя точками
function NaprUgol(X1, Y1, X2, Y2, X3, Y3 : extended; PravUgl : boolean) : extended;
var
CosL, STriangl, Vector1X, Vector1Y, Vector2X, Vector2Y, VectorsL1, VectorsL2, Cut : extended;
begin
// Определяем координаты вектора 1
Vector1X := X2 - X1;
Vector1Y := Y2 - Y1;
// Расчитываем длину вектора 1
VectorsL1 := Sqrt((Vector1X * Vector1X) + (Vector1Y * Vector1Y));
// Определяем координаты вектора 1
Vector2X := X2 - X3;
Vector2Y := Y2 - Y3;
// Расчитываем длину вектора 1
VectorsL2 := Sqrt((Vector2X * Vector2X) + (Vector2Y * Vector2Y));
// Расчитываем угол между векторами (косинус)
CosL := ((Vector1X * Vector2X) + (Vector1Y * Vector2Y)) / (VectorsL1 * VectorsL2);
// Определяем угол в градусах
Cut := ArcCos(CosL);
// Определяем ориентированную площадь треугольника
// (чтобы определить направленный угол, а не угол между векторами)
STriangl := X1 * Y2 + X2 * Y3 + X3 * Y1 - Y1 * X2 - Y2 * X3 - Y3 * X1;
// Определяем реальный угол до 360 градусов
If STriangl = 0 then
Cut := 0.0
else
begin
If PravUgl and (STriangl > 0) then
Cut := 360 - Cut
else
begin
If (PravUgl = false ) and (STriangl < 0) then
Cut := 360 - Cut
end;
end;
Result := Cut;
end;
3. В коді, в потрібному місці треба змінним X1, Y1, X2, Y2, X3, Y3 присвоїти значення координат, де, X1, Y1 - кооринати точки наведення, X2, Y2 - координати точки стояння, а X3, Y3 - координати точки ділянки. Наприклад:
Код: Виділити все
Points.First;
X3 := <Points."X">;
Y3 := <Points."Y">;
Points.Next;
X2 := <Points."X">;
Y2 := <Points."Y">;
Points.Next;
X1 := <Points."X">;
Y1 := <Points."Y">;
Не забувайте: це код лише приклад! Все залежить від того, звідки Ви будете брати координати точок.
4. Потім виконати функції і розкласти кут на градуси, мінути і секунди:
Код: Виділити все
VnCutStr := ''; // Значение угла (строка)
VnCut := NaprUgol(X1, Y1, X2, Y2, X3, Y3, false); // Значение угла
// Формируем строку для угла
VnCutStr := FormatFloat('00', Int(VnCut)) + '° '; // градусы
VnCutStr := VnCutStr + FormatFloat('00', Int(Frac(VnCut) * 60)) + ''' '; // минуты
VnCutStr := VnCutStr + FormatFloat('00.00', Int(Frac(Frac(VnCut) * 60) * 60 * 100) / 100) + '"'; // секунды
Отриманна змінна [VnCutStr] вставляється в потрібне місце.
До речі, вираховуються ліві по ходу кути, але якщо у фукнції NaprUgol останній параметр задати як true:
Код: Виділити все
VnCut := NaprUgol(X1, Y1, X2, Y2, X3, Y3, true);
то будуть вираховуватись праві по ходу кути. Це для універсальності.