В связи с тем что сайт немного кривоват, я не смог добавить еще сообщение и мне пришлось открыть новый вопрос

Первый вопрос

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

Ссылка на видео вопрос

Заранее спасибо за ваши ответы и уравнения =)

задан 4 Июл '14 1:29

@FreeZa: я посмотрел видеозапись. Постановка задачи теперь полностью ясна. Фактически, Вам надо составить путь из клеточек, наилучшим образом приближающий прямолинейный. Как это сделать, объяснила @cartesius в прошлой записи. Я могу здесь рассмотреть какой-нибудь численный пример, чтобы стало понятнее, как это работает.

(4 Июл '14 3:21) falcao
10|600 символов нужно символов осталось
0

Рассмотрим частный случай задачи, когда надо соединить точку $%(0;0)$% с точкой $%(a;b)$%. Если $%a=b$%, то соединяем всё по диагонали. Пусть $%a > b$%. Тогда каждому $%x=0,1,2,\ldots,a$% мы сопоставляем координату $%y$% по следующей простой формуле: $%y={\mathop{\rm trunc}}\frac{bx}a$%, где trunc означает округление до ближайшего целого. Полуцелые числа стандартно можно округлять в сторону увеличения, то есть $%{\mathop{\rm trunc}}(3.5)=4$%.

Пример: пусть $%a=13$%, $%b=8$%. Тогда при $%x=5$% мы получим $%y={\mathop{\rm trunc}}\frac{40}{13}=3$%, а при $%x=8$% будет $%y={\mathop{\rm trunc}}\frac{64}{13}=5$%.

Для случая $%a < b$% поступаем аналогично, только теперь уже каждому $%y=0,1,2,\ldots,b$% сопоставляем координату $%x$% по формуле $%x={\mathop{\rm trunc}}\frac{ay}{b}$%.

Заметим, что в обоих случаях должно иметь место приближённое равенство $%ay\approx bx$%, и в таком виде его легко запомнить как "ключевое".

Теперь сведём общую задачу к этому случаю. Допустим, нам надо соединить точку $%(a;b)$% с точкой $%(c;d)$%. Вычитая из обоих точек $%(a;b)$% покоординатно, мы сводим всё к случаю соединения точек $%(0;0)$% и $%(c-a,d-b)$%. У второй точки одна или обе координаты могут быть отрицательны. Тогда отбрасываем знаки, то есть переходим к абсолютным величинам. Это даёт точки $%(0;0)$% и $%(|c-a|,|d-b|)$%, а такую задачу мы решать уже умеем. Составляем для неё путь по описанному выше алгоритму, а потом возращаем знак минус там, где мы его убирали. После этого ко всем полученным координатным точкам прибавляем $%(a,b)$%, и это даёт искомый путь из $%(a;b)$% в $%(c;d)$%.

Пример: пусть надо соединить $%(4;17)$% и $%(11;12)$%. Вычитаем координаты первой точки. Получается задача соединения $%(0;0)$% и $%(7;-5)$%. Меняем знак у второй координаты, соединяя $%(0;0)$% и $%(7;5)$%. Берём дробь $%\frac57$% и умножаем её на числа от 0 до 7 включительно, округляя получающиеся при этом дроби до ближайшего целого. Получаются числа 0, 1, 1, 2, 3, 4, 4, 5. Это значит, что у нас получился такой путь: $%(0;0)$%, $%(1;1)$%, $%(2;1)$%, $%(3;2)$%, $%(4;3)$%, $%(5;4)$%, $%(6;4)$%, $%(7;5)$%.

Теперь возвратим знак минус у второй координаты, поскольку мы его убирали. Получится путь $%(0;0)$%, $%(1;-1)$%, $%(2;-1)$%, $%(3;-2)$%, $%(4;-3)$%, $%(5;-4)$%, $%(6;-4)$%, $%(7;-5)$%. Осталось прибавить ко всем точкам этого пути начальную точку, то есть $%(4;17)$%. Это даёт путь $%(4;17)$%, $%(5;16)$%, $%(6;16)$%, $%(7;15)$%, $%(8;14)$%, $%(9;13)$%, $%(10;13)$%, $%(11;12)$%, который и требовалось создать.

ссылка

отвечен 4 Июл '14 3:54

ОГРОМНЕЙШЕЕ ВАМ СПАСИБО!РАБОТАЕТ! Неужели все так просто?! Я то думал будет намного больше вычислений! а оказалось так просто =) еще раз огромное спасибо!

(4 Июл '14 5:39) FreeZa

Ох продолжаю мучиться =) запрограммировал расчеты, с примером (4:17) и (11;12) все получилось хорошо, программа сработала и выдала правильные координаты.

Но когда я вводил другие координаты наткнулся на ряд проблем. Для координат (8;10) и (12;5) и еще некоторых, началась неправильная прорисовка вектора, просчитал в ручную и убедился что это не проблема в коде, а в моем понимании данной вами инструкции.

вот мои расчеты для этих координат:

(8;10)(12;5) - начальные данные (-4;5) - высчитал вектор (4;5) - привел все числа к положительным 4/8=0,8

(4 Июл '14 13:35) FreeZa

делаю расчет от 0 до 5 включительно (0,8x0 = 0)
(0,8x1 = 1) (0,8x2 = 2) (0,8x3 = 2) (0,8x4 = 3) (0,8x5 = 4)

возвращаю минус на место, получаю: и конвертирую в координаты от 0 до 5 включительно: (0;0) (1;-1) (2;-2) (3;-2) (4;-3) (5;-4) прибавляю начальную точку (12;5) (12;5) (11;6) (10;7) (9;7) (8;8) (7;9) то есть координата (7;9) находится от координаты 8;10 близко, но это не она. она вообще получается выше и левее, то есть вектор по какойто причине отклоняется =(

(4 Июл '14 13:35) FreeZa

Сначала грешил на то что нужно другую координату подставить, но расчет такой-же, следовательно все и получается зеркально, поэтому не знаю даже куда копать, просидел всю ночь, думал ошибка где-то в коде, но пересчитав разные варианты в ручную, понял что скорее всего я где-то сам в расчетах чего-то недопонял =(

(4 Июл '14 13:35) FreeZa

@FreeZa: у меня в примере был разобран случай соединения (0;0) с (7;5). Обратите внимание, что $%7 > 5$%. У Вас в ходе вычислений требуется соединить (0;0) с (4;5). Здесь всё наоборот: $%4 < 5$%. Поэтому координаты меняются ролями. Чтобы не было путаницы, можно свести всё к первому случаю, то есть временно поменять координаты местами и построить путь до (5;4). Но потом надо переставить координаты снова, чтобы всё вернулось на место, и только после этого менять знак у второй координаты.

(4 Июл '14 19:50) falcao
10|600 символов нужно символов осталось
Ваш ответ

Если вы не нашли ответ, задайте вопрос.

Здравствуйте

Математика - это совместно редактируемый форум вопросов и ответов для начинающих и опытных математиков, с особенным акцентом на компьютерные науки.

Присоединяйтесь!

отмечен:

×1,589
×243
×106

задан
4 Июл '14 1:29

показан
793 раза

обновлен
4 Июл '14 19:50

Отслеживать вопрос

по почте:

Зарегистрировавшись, вы сможете подписаться на любые обновления

по RSS:

Ответы

Ответы и Комментарии

Дизайн сайта/логотип © «Сеть Знаний». Контент распространяется под лицензией cc by-sa 3.0 с обязательным указанием авторства.
Рейтинг@Mail.ru