"Перископ" часть3 - пеленг.

Проект Лодка

Часть3 Пеленг.

Начало: часть1; часть2.

А почему же так случилось? Вот наверное правильный вопрос. Ибо действительно сложность невеликая, а сделать не получается. Ищем корень зла.

А корнем стал наш перископ, точнее функционал сохранения пеленга, замете, реальный пеленг перископа и шкала пеленга перископа вещи разные, хоть и говорят об одном и том же. Главная проблема заставить шкалу отображать именно тот пеленг, который реально имеет глаз нашей трубы. В прошлом, мы уже боролись с проблемой правильной пеленгацией, и тогда уже исправляли всевозможные проблемы, текущая задача видимо лишь продолжение проблем. Ох как хочется, чтобы эта беда стала последней на пути завершения работы с прибором.

И так вопрос поставлен, ищем ответ.

У нас есть пеленг, изменяемый в зависимости от угла перископа. Остается взять его, и наложить на шкалу. Первое что сделано – выведение шкалы на ноль. Задача выполнена быстро и успешно. Втрое наше действие получения правильного значения на шкале, в момент поворота перископа на 180 градусов, тобиш на корму. И эту задачу мы выполняем с легкостью. Остается дело техники, получить углы по 90 в обе стороны. Все теперь, после получения правильных значений на шкале, правильного отображения, мы получаем непосредственно шкалу, с сечениями от 0 до 360. Крути верти, а всегда знаешь куда смотришь. ) Успех? Да – однозначно. Но проблема, шкала не может быть замкнутой, она же не на цилиндре нарисована.

А по сути, чего проще, смоделить цилиндр, рассчитать диаметр,  наложить текстуру в виде цилиндра и крути его вокруг своей оси, никакие алгоритмы математические не нужны (нужно взять на заметку, что этот метод, наверное, самый простой, ибо не надо ничего рассчитывать, ну кроме как шага поворота цилиндра).

Но мы не из робкого десятка, верно? Зачем нам простые пути, мы пойдем методом алгоритмизации, мы таки добьем проблему и выпилим алгоритм, который позволит нашей шкале, без дополнительных элементов и моделек показывать правильный пеленг, да еще и смещаться, как положено.

Смещаться написал специально для того, что бы ни возникло желание просто отображать циферку пеленга.

Хотя тоже вить вариант – просто в нужном месте отображаем реальный пеленг в градусах и никакой (Все тот – же «угол по факту») заморочки нет опять же не с алгоритмами, не с модельками. Этот вариант, наверное, самый что ни наесть правильный.  

Но мы, же хотим похожести, похожести и чувства правильности, поэтому шкалу заставим-таки ездить по кругу.

А теперь попробуем-таки помыслить:

Первое: У нас есть шкала диной пусть 400 единиц.

У нас есть пеленг = 0.

Наш пеленг = ноль на шкале смещен на 150 единиц от края. Значит, размещаем шкалу так, чтобы ноль на шкале был и нолем по пеленгу.

Задаем шаг движения шкалы относительно шага поворота перископа. Собственно это не проблема, ибо берем те же переменные, что и на перископ (кстати, тут-то собака и порылась).

Ну, вроде все, шкала побежала, мы ее уже успели вымерить, все славно, все работает, но. Шкала добегает до конца и едет дальше, а дальше то пусто. Вот это нам и надо исправить.

Выбираем нейтральные точки, например, в районе 270 градусов. Достигнув одной из двух точек, шкала должна переметнуться ко второй точки. Желательно все сделать точно, дабы игроку не сильно бросалось в глаза перескок. И так пишем простою вещь, достиг – прыгай. Проверяем – оболом.

Мало того, шкала просто не двигается дальше, застряв на точке перескока. При повороте в другую сторону вновь, достигнув оговоренной точки2, вновь ступор – шкала стоит.

Беда? Конечно беда!

А проблема в том, что при смещении шкала всегда считывает реальный пеленг. И при задании скинуть шкалу в новое место, она всегда натыкается на верность условия переброса, вить при сбросе шкалы на новую позицию пеленг то не сбрасывается, он остается реальным! Вот собственно и корень зла.

Т.е. пеленг продолжает расти.

А вот отсюда начинается решение проблемы. Помните, я говорил, где собака порылась? Да-да это основной пеленг.

Как раз между строк, точнее между моментами писательства и была найдена разгадка.

 

 Первым делом пеленг был приведен к нормальному состоянию, т.е. никаких сотен или тысяч, от 0 до 360. В этом и была суть. Все понимают, что можно 40 раз оббежать вокруг стула, и посчитать круги, и каждый завершенный круг как полную окружность приплюсовать к предыдущей сумме, т.е. 360+360+360 и т.д., но это не отменит правила, что завершив круг на 360 градусе, ты неизменно придешь к 1 градусу. А потом все с начала. Вот тут и было решение. В основном пеленге не было доведено до финала именно обнуление угла при выходе на ноль. Угол продолжал наращиваться. С одной стороны это не является ошибкой, более того вить все знают что 720 градусов тоже не фантастика, это все те же 360 только по второму кругу.

Тык вот. Как только я ограничил пеленг одним кругом, все встало на свои места. И мало того, шкалу после дополнительной выверки удалось запхать и заставить работать без вообще какого либо алгоритма переноса. Все работало исходя из связки «смещение – угол на пеленг». Вот так была решена проблема. Само решение, с момента получения догадки, заняло меньше часа. Дольше шкалу выверял, нежели кодил.

Вот и результат работы:

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