Конструктор G-кода и геометрические функции при генерации файла

В процессе разработки программы, и появления новых пользователей, и идей, возникла необходимость при генерации теста с G-кодом, дополнительно использовать различные геометрические функции, которые добавил в версии 3.3.0.33 (данная версия появится в ближайшее время).

Добавлены следующие функции:

  • CreatePoint(X,Y) – создание точки с указанными координатами
  • getAngleFrom2Points(point1, point2) – вычисление угла относительно оси Х, и прямой образованной 2-мя точками
  • GetAngleFrom3Points(point1, point2, point3) – вычисление угла в точке №2
  • GetDistanceBetweenPoints(point1,point2 ) – вычисление дистанции между 2-мя точками
  • GetPointInCircle(centerPoint,radius,angle) – получение точки на окружности

Функция CreatePoint(X,Y)

Позволяет создать новую точку, которую можно в дальнейшем использовать в коде. Создание и её использование, будет приведено ниже в данном описании.

Функция getAngleFrom2Points(point1, point2)

Данная функция получает угол образованный отрезком из 2-х точек и осью X, причем угол увеличивается, в положительную сторону, если направление против часовой стрелки, и в минус, если по часовой стрелке.

Есть следующая особенность, которая заключается в том что после 180 градусов дальше будет -179 градусов, и собственно после -179 далее будет 180 градусов. Это связано с тем что без 3-й точки нет возможности понять что угол может быть более 180 градусов.

Пример позволяющий использовать функцию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
FORMAT:SetFormat("#0.00",".")
FILE: Create()

FILE: AddLine("// начало теста ")

for indx = 0, DATA.Items.Count - 1, 1 do
   
    primitiv = DATA.Items[indx]

    lastPoint = primitiv.Items[0];
   

    FILE:AddLine("X"..FORMAT:Fd(lastPoint.X).. " Y"..FORMAT:Fd(lastPoint.Y))
           
    for indxP = 1, primitiv.Items.Count - 1, 1 do
        point = primitiv.Items[indxP]
       
        angle = FORMAT:Fd(GEOMETRY:getAngleFrom2Points(lastPoint,point))
        FILE:AddLine("X"..FORMAT:Fd(point.X).. " Y"..FORMAT:Fd(point.Y) .. " //(угол: " .. angle .. ")")

        lastPoint = point
    end

    FILE: AddLine(" ")
end


FILE: AddLine("// окончание теста")
FILE: Save()

В строке №18 пример вычисления угла, и ниже скриншот результата:

Функция GetAngleFrom3Points(point1, point2, point3)

Вычисляет угол в точке №2, образованный 2-мя отрезками:

В коде используется так:

1
angle = FORMAT:Fd(GEOMETRY:getAngleFrom2Points(point1,point2,point3))


Функция GetDistanceBetweenPoints(point1,point2 )

Данная функция вычисляет расстояние между указанными точками, в коде это используется так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FORMAT:SetFormat("#0.00",".")
FILE: Create()

FILE: AddLine("// начало теста ")


point1 = GEOMETRY:CreatePoint(0,0)
point2 = GEOMETRY:CreatePoint(10,10.5)

Distance = FORMAT:Fd(GEOMETRY:GetDistanceBetweenPoints(point1,point2))


FILE:AddLine("расстояние между точками = "..FORMAT:Fd(Distance))

FILE: AddLine("// окончание теста")
FILE: Save()

Даёт такой результат:

// начало теста 
расстояние между точками = 14.50
// окончание теста

Функция GetPointInCircle(centerPoint,radius,angle)

Применяется если нужно получить точку на окружности, например такой код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FORMAT:SetFormat("#0.00",".")
FILE: Create()

FILE: AddLine("// начало теста ")

CenterPoint = GEOMETRY:CreatePoint(0,0)

point1 = GEOMETRY:GetPointInCircle(CenterPoint,10,0)
point2 = GEOMETRY:GetPointInCircle(CenterPoint,10,45)

FILE:AddLine("точка 1 ("..FORMAT:Fd(point1.X) ..","..FORMAT:Fd(point1.Y)..")")
FILE:AddLine("точка 2 ("..FORMAT:Fd(point2.X) ..","..FORMAT:Fd(point2.Y)..")")

FILE: AddLine("// окончание теста")
FILE: Save()

Что даёт такой результат:

// начало теста 
точка 1 (10.00,0.00)
точка 2 (7.07,7.07)
// окончание теста

2 комментария

  • Пока так и не понял зачем это необходимо.

    • Для применения специального ножа, который позволяет вырезать на материале, но у него смещена режущая часть от центра оси, и требуется учитывать эти особенности, когда будет возможность, обязательно опишу данную процедуру! 😉

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Protected with IP Blacklist CloudIP Blacklist Cloud