Просмотр полной версии : Путешествие робота
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. Если взрыв существенный, то точность не важна :)
На программирование
У мну получается 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 поделить. Исправил.
У меня: 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, (Впрочем, на особую точность у чисел с плавающей запятой я-б рассчитывать не стал)
местами координаты перепутал.
Необратил внимание. :) На чём считали и как? Я так прям в лоб на 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)
vBulletin® v3.8.5, Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot