В связи с тем что сайт немного кривоват, я не смог добавить еще сообщение и мне пришлось открыть новый вопрос Собственно внес несколько поправок в вопрос и записал его в видео формате, чтобы не упустить каких либо деталей, да и в целом показать наглядно всегда проще чем объяснять на пальцах Заранее спасибо за ваши ответы и уравнения =) задан 4 Июл '14 1:29 FreeZa |
Рассмотрим частный случай задачи, когда надо соединить точку $%(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 falcao ОГРОМНЕЙШЕЕ ВАМ СПАСИБО!РАБОТАЕТ! Неужели все так просто?! Я то думал будет намного больше вычислений! а оказалось так просто =) еще раз огромное спасибо!
(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 до 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
|
@FreeZa: я посмотрел видеозапись. Постановка задачи теперь полностью ясна. Фактически, Вам надо составить путь из клеточек, наилучшим образом приближающий прямолинейный. Как это сделать, объяснила @cartesius в прошлой записи. Я могу здесь рассмотреть какой-нибудь численный пример, чтобы стало понятнее, как это работает.