Fail story: Пифагоров велосипед.
Приветствую тебя, читатель. Сегодня я начну небольшой цикл заметок о разработке своей очень простенькой, по факту, игры. Делал я её не то что бы очень долго, ибо c# и unity я знаю более менее. Сегодня чуток о мат. части, но для начала немного предыстории. Я не очень часто сталкивался с подобными задачами, чаще занимаясь проектированием всякого: мои отношения с математикой обычно начинались и заканчивались на олимпиадном программировании, которое я подзабросил пару лет назад. Но при этом мне всегда было интересно поведение алгоритмов, созданных мною. Ну да чуть ближе к сути.
Для игры мне потребовалось решить простую задачу: требуется написать функцию, которая выдает следующую ближайшую к цели точку так, чтобы траектория движения персонажа проходила по прямой. Однако задачу я себе решил слегка усложнить, оставив в качестве входных переменных только позицию игрока и точку назначения. Повторюсь, что ожидаемый результат - движение по прямой, насколько это возможно. Подумав, не подумав, что задача плёвая, я наскоро закодил первый пришедший в голову алгоритм, в котором вычислялись расстояния до точки назначения от (x+1;y) и (x;y+1), где (x;y) - координаты персонажа(для упрощения опустим подробности, что точка назначения может быть не только в первой четверти относительно игрока), после чего брала точку с минимальным расстоянием. Казалось бы: почему это может не работать. А вот, собственно, почему:
Затем я решил завязать движение на углах, вычисляемых через арктангенс, между теми же ближайшими точками и желаемой траекторией, брав меньший из них.
Задавшись тем же вопросом: а почему это может не работать, я закодил и это поведение и получил вот это:
На этом этапе я перестал верить в жизнь и ушёл в запой (какао - тоже алкоголь). Однако вернувшись я прошёлся итеративно по алгоритму с понял, что в никуда потратил день жизни, и без задания координат точки отправления задача не разрешима. Затем все стало куда проще - поведение стало таким, каким я себе его представлял изначально:
По сути это та же предыдущая реализация со сравнением углов, только не от текущей точки, а от точки отправления.
Мораль сей басни такова: solid, kiss, scrum, agile и прочие заморские термины безусловно полезны для любой разработки, но все-таки на codeforces для разминки периодически все же надо заходить, что я всем и советую делать. Впрочем, если кто знает способ решения задачи, не вводя дополнительные параметры - прошу в комментарии.
P.S. Сама игра на поздней альфе, если кому интересно - дам ссылку в следующих заметках.
P.P.S. Первопост, прошу кидаться исключительно мягкими камнями.




Не это ли вы ищете? https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80...