PDA

Просмотр полной версии : Путешествие робота


Shuhrat Ismailov
04.07.2014, 11:25
Робот отправляется в путешествие на северо-восток из точки (0,0) в системе координат.
На каждом этапе он может двигаться вперед, а затем вращаться на месте.
Алгоритм путешествия :

SUB JOURNEY
DISTANCE = 1000
WHILE (DISTANCE > 0.001)
MOVE DISTANCE
STOP
ROTATE(90, DEGREES, CLOCKWISE)
DISTANCE = DISTANCE / 2
END WHILE
EXPLODE
END SUB


Перевод
Подпрограмма ПУТЕШЕСТВИЕ
РАССТОЯНИЕ = 1000
ПОКА (РАССТОЯНИЕ> 0,001)
Перемещение на РАССТОЯНИЕ
СТОП
ПОВОРОТ (90 градусов по часовой стрелке)
РАССТОЯНИЕ = РАССТОЯНИЕ / 2
Конец цикла
Взрыв
Конец подпрограммы

Вопрос: В какой точке взорвется робот?

Nadir Zaitov
04.07.2014, 11:37
Эта задачка на программирование или по математике?
В точке (800,400) с точностью 0,001. Если взрыв существенный, то точность не важна :)

Timofeus
04.07.2014, 12:00
В точке (800,400) с точностью 0,001. Если взрыв существенный, то точность не важна Наверное, все-таки (400;200), плюс нужно повернуть координаты на 45 гр., т.к. северо-восток.

Типа (141;424)

shumbola
04.07.2014, 12:06
Не взорвется, до взрыва не дойдет, Брюс остановить бомбу. :-)

Shuhrat Ismailov
04.07.2014, 12:48
Эта задачка на программирование или по математике?
В точке (800,400) с точностью 0,001. Если взрыв существенный, то точность не важна :)
На программирование

Nestik
04.07.2014, 14:01
У мну получается 1200 400.

DarkUser
04.07.2014, 14:08
У меня: x: 282, y: 848. (округленно до целых)

Nadir Zaitov
04.07.2014, 14:13
Получилось так: 848,5273 282,8424

(Решалось в Excel)

До этого я двигался сразу по оси X и потом поворачивал против часовой стрелки. Т.е. нарушено:
ROTATE(90, DEGREES, CLOCKWISE)
на северо-восток

Пришлось исправить:

https://img.uforum.uz/images/zhycfzt5261803.png

Т.е. я сначала все сделал двигаясь по оси ОX, а в конце сделал поворот результата на 45° против часовой стрелки.

UPD: Забыл на 2 поделить. Исправил.

Nestik
04.07.2014, 14:17
У меня: x: 282, y: 848. (округленно до целых)

Вы правы! Не учёл пифагора. :)

Nadir Zaitov
04.07.2014, 14:37
Вот результат в картинках:

https://img.uforum.uz/images/wuqebsh2848006.png

DarkUser
04.07.2014, 14:39
Вы правы!Фигу, как минимум направление поворота взял неправильно, и как следствие - местами координаты перепутал.

Получилось так: 848,5273 282,8424
x: 848.5273282043654, y: 282.8424427347886, (Впрочем, на особую точность у чисел с плавающей запятой я-б рассчитывать не стал)

Nestik
04.07.2014, 14:44
местами координаты перепутал.
Необратил внимание. :) На чём считали и как? Я так прям в лоб на pl/sql что под рукой было.

create or replace procedure test_robot is
distance number;
angle number;
x number;
y number;
begin
distance := 1000;
angle := 1;
x := 0;
y := 0;
loop
if angle = 5 then
angle := 1;
end if;
if angle = 1 then
x := x+(SQRT((power(distance,2))/2));
y := y+(SQRT((power(distance,2))/2));
end if;
if angle = 2 then
x := x+(SQRT((power(distance,2))/2));
y := y-(SQRT((power(distance,2))/2));
end if;
if angle = 3 then
x := x-(SQRT((power(distance,2))/2));
y := y-(SQRT((power(distance,2))/2));
end if;
if angle = 4 then
x := x-(SQRT((power(distance,2))/2));
y := y+(SQRT((power(distance,2))/2));
end if;
distance:=distance/2; --расстояние на 2
angle := angle+1; --поворот на 90 градусов
exit when (distance < 0.001); --взрыв
end loop;
dbms_output.put_line(to_char(x)||'--'||to_char(y));
end test_robot;

Nadir Zaitov
04.07.2014, 14:44
Shuhrat Ismailov, Если это задачка студентам, то вывод их решения должен быть примерно таким:

https://img.uforum.uz/images/aisdmhd1029961.png

Nadir Zaitov
04.07.2014, 15:16
package qrobot;
import static java.lang.Math.sqrt;

public class QRobot {

public static void main(String[] args) {

final double sqr2=sqrt(2.0)/2.0;
double distance=1000.0;
double vX=sqr2, vY=sqr2;
double x=0, y=0;
while (distance>0.001) {
x+=vX*distance;
y+=vY*distance;
// Подготовка к следующей итерации
distance*=0.5;
vX+=vY;
vY-=vX;
vX+=vY;
}
System.out.println("x="+x+", y="+y);
}

Ответ: x=848.5273282043652, y=282.8424427347887

DarkUser
04.07.2014, 15:33
var Bot = function(x, y, angle) {
var state = {x: x || 0, y: y || 0, angle: angle || 0};

this.rotate = function(angle) {
state.angle = state.angle + angle;
return this;
};

this.move = function(distance) {
state.x = state.x + distance * Math.cos(state.angle);
state.y = state.y + distance * Math.sin(state.angle);
return this;
};

this.getPos = function() {
return {x: state.x, y: state.y};
};

this.toString = function() {
return JSON.stringify(state);
}
};

var distance = 1000, angleStart = Math.PI / 4, angleStep = -Math.PI / 2
var step = 1;
var bot = new Bot(0, 0, angleStart);

while (distance > 0.001) {
bot.move(distance);
bot.rotate(angleStep);
console.log(step++, ":", bot.getPos());
distance = distance / 2;
};

alert ("step:" + step + "; " + bot);


Демка (http://jsfiddle.net/3sF4D/) (оси и разметку рисовать было откровенно лень)

Nadir Zaitov
04.07.2014, 17:21
На работе сказали, что эта часть кода плохо читается:
vX+=vY;
vY-=vX;
vX+=vY;

Это поворот вектора (vX, vY) на 90° по часовой стрелке.
А если «по-русски», то: (vX, vY) → (-vY, vX)