// Уравновешивание замкнутого теодолитного хода
// scilab 6.1 
// version: 2021-03-19  2.10

clear
funcprot(0)

// Вспомогательные функции
function v=to_degree(deg, mins, secs)
    // Преобразование из градусов, минут, секунда 
    // в градусы и десятые градуса для sind/cosd
    v = deg + mins/60 + secs/60/60
endfunction

function [deg, mins, secs]=from_degree(v)
    deg  = floor(v)
    mins_secs = v - floor(v)
    
    mins  = floor(mins_secs * 60)
    secs = round((mins_secs * 60 - mins) * 60)
endfunction    

// Функции для печати значений в правильном формате

function print_dgr(label, valvec)
    // Печатает значение углов в градусах и десятых градуса как градусы, минуты, секунды
    function __print_dgr(label, varargin)
    
      if size(varargin) == 1 then
        
          v = varargin(1)
          [deg, mins, secs] = from_degree(v)
          printf("%s: %d°%d''%d""\n", label, deg, mins, secs)

      elseif size(varargin) == 2 then   
    
          idx = varargin(1)
          v = varargin(2)
          [deg, mins, secs] = from_degree(v)
          printf("%s %d: %d°%d''%d""\n", label, idx, deg, mins, secs)

      else
        assert_checktrue ( false );    
      end
    endfunction

    // Печатает вектор углов
    for i = 1 : size(valvec, "*")
        __print_dgr(label,i,valvec(i))
    end
endfunction    

function print_xy(label, valvec_x, valvec_y)
    // Печатает вектор координат

    function __print_xy(label, varargin)
       // Печатает координаты
    
      if size(varargin) == 2 then
        
          x = varargin(1)
          y = varargin(2)        
          printf("%s: %0.4f,%0.4f\n", label, x, y)
        
      elseif size(varargin) == 3 then
        
          idx = varargin(1)
          x   = varargin(2)
          y   = varargin(3)        
          printf("%s %d: %0.4f,%0.4f\n", label, idx, x, y)

      else
          assert_checktrue ( false );    
      end        
        
   endfunction

    assert_checkequal (size(valvec_x,"*"), size(valvec_y,"*"));

    for i = 1 : size(valvec_x, "*")
        __print_xy(label,i,valvec_x(i), valvec_y(i))
    end
endfunction    

// *****  Дано ******
// Измеренные горизонтальные углы
angles = [ to_degree(105, 24, 0), to_degree(123, 10, 0), to_degree( 79, 24, 0), to_degree(140, 39, 0), to_degree( 91, 21, 0) ]

// Горизонтальное положение: 12 23 34 45 51 ...
d_hors = [ 135.62, 159.82, 142.15,  138.61, 153.71 ]

// Дирекционные углы, 
// первый должен быть задан, остальные вычисляются
dirs = [ to_degree(44, 44, 0) ]

// Координаты точек, 
// координаты первой точки должны быть заданы, остальные вычисляются
pX = [ 250.00 ]
pY = [-780.00 ]

// *********** Начало вычислений *****
// Количество точек
n_points = size(angles, "*")

// Количество горизонтальных положений должно быть равно количеству точек
assert_checkequal (size(d_hors,"*"), n_points);

// Определяют практическую сумму углов Sпр и угловую невязку f, 
//  равную разности практической и теоретической сумм углов в полигоне 

// Теоретическая сумма углов в полигоне
St = 180 * (n_points - 2)

// Практическая сумма углол в полигоне 
Sp = sum(angles)

// Угловая невязка
f = abs(St - Sp)

// Промежуточная печать
print_dgr("Теоретическая сумма уголов", St)
print_dgr("Практическая сумма уголов", Sp)
print_dgr("Угловая невязка", f)

// Угловую невязку f распределяют с обратным знаком поровну на все измеренные углы, с точностью до 0',1.
// Поправка
ppr = f/n_points
print_dgr("Поправка", ppr)

// Углы с поправкой
angles = angles + ppr

// Вычисляют дирекционные углы (азимуты) линий.
// dir_1 - pre-calculated, don't set

for i = 2 : n_points
    dirs(i) = dirs(i - 1) + 180 - angles(i)
end    

print_dgr("Дирекционный угол", dirs)

// Вычисляем румбы, в дальнейших расчетах они не участвуют
for i = 1 : n_points
    if dirs(i) <= 90 then
        rumbs(i) = dirs(i)
    elseif dirs(i) > 90 && dirs(i) <= 180 then   
        rumbs(i) = 180 - dirs(i)
    elseif dirs(i) > 180 && dirs(i) <= 270 then   
        rumbs(i) = dirs(i) - 180
   elseif dirs(i) > 270 then   
        rumbs(i) = 360 - dirs(i)
   end
end   

print_dgr("Румб", rumbs)

// Приращение координат
for i = 1 : n_points
    dX(i) = d_hors(i) * cosd(dirs(i))
    dY(i) = d_hors(i) * sind(dirs(i))
end

print_xy("Приращение координат", dX, dY)

// Невязка равна сумме приращений 
FdX = sum(dX)
FdY = sum(dY)

print_xy("Невязка", FdX, FdY)

// Поправки
Sd = sum(d_hors)

for i = 1 : n_points
  sigma_X(i) = (FdX * d_hors(i))/ Sd 
  sigma_Y(i) = (FdY * d_hors(i))/ Sd 
end

print_xy("Поправки", sigma_X, sigma_Y)

// Приращение координат с поправками 
for i = 1: n_points
    dXc(i) = dX(i) + sigma_X(i) * -1
    dYc(i) = dY(i) + sigma_Y(i) * -1
end

print_xy("Приращение координат с поправками", dXc, dYc)

// Невязка равна сумме приращений 
FdXc = sum(dXc)
FdYc = sum(dYc)

print_xy("Невязка с поправками", FdXc, FdYc)

// Невязка с поправками должна быть равна нулю
assert_checkequal (round(FdXc), 0);
assert_checkequal (round(FdYc), 0);

// Вычисляем координаты
for i = 2 : n_points
   pX(i) = pX(i-1) + dXc(i-1)
   pY(i) = pY(i-1) + dYc(i-1)
end

// Полигон должен быть замкнутым
pX(n_points + 1) = pX(n_points) + dXc(n_points)
pY(n_points + 1) = pY(n_points) + dYc(n_points)

print_xy("Координаты", pX, pY)

assert_checkequal (round(pX(n_points + 1)), pX(1));
assert_checkequal (round(pY(n_points + 1)), pY(1));

plot(pX, pY, "b")

// The End
  • If you installed windows 10 on old Thinkpad T420 and you realize that neither bluetooth nor wifi are working properly (windows reports that it is turned off and can't turn it on)
  • do following:
  • 1. Make sure that small switch located on the right side of laptop right after the CD bay is turned on (green is shown, knob is under computer icon)
  • 2. Make sure that wifi and bluetooth access is enabled in the BIOS, check Security::I/O Ports section.
  • 3. Make sure that Fn and CRL buttons is not swapped in BISO, check Config::Keyboard section
  • 4. Go to the Device Manager and check that Intel Centrino adapter is present, update it's driver  - let autoupdate find appropriate one
  • 5. Install  Thinkpad Hotkey Features Integration software from http://support.lenovo.com including all aditional utilities, like on-screen menu
  • 6. Reboot you PC
  • 7. Press Fn + F5 and enable Bluetooth and WiFi 
  • You should be able to use WiFi/Bluetooth now.