Форум программистов, компьютерный форум CyberForum.ru

Как расчитать растояние на координатной плоскости напрямую? - C++

Восстановить пароль Регистрация
 
Krock21rus
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
29.11.2013, 11:42     Как расчитать растояние на координатной плоскости напрямую? #1
по пиратской карте даются указания куда идти (направление и число шагов)
шаги всегда целые
нужно расчитать расстояние напрямую до конечной точки с тосностью до 0.001шага
каким оператором это можно сделать, или какими методами?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2013, 11:42     Как расчитать растояние на координатной плоскости напрямую?
Посмотрите здесь:

В какой координатной четверти плоскости находится точка. C++
Четверти на координатной плоскости C++
C++ Очередь, состоящая из точек координатной плоскости
Проверить входит ли точка с заданными координатами x и y в заштрихованную область на координатной плоскости C++
C++ Графическое изображение геометрических фигур на координатной плоскости
Создать класс Круг на координатной плоскости C++
Поиск точки на координатной плоскости C++
Сравнение двух точек на координатной плоскости C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
29.11.2013, 13:44     Как расчитать растояние на координатной плоскости напрямую? #2
Цитата Сообщение от Krock21rus Посмотреть сообщение
по пиратской карте даются указания куда идти (направление и число шагов)
шаги всегда целые
нужно расчитать расстояние напрямую до конечной точки с тосностью до 0.001шага
каким оператором это можно сделать, или какими методами?
По условию задачи пооожение начальной точки неизвестно. Будем ее искать, чтобы потом найти расстояние.
C++
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
const float PI = 3.14159; // число Пифагора
float xn = 4.0, yn = 3.0; // координаты конечной точки
float x0 = xn, y0 = yn; // координаты начальной точки
float shag = 0.5; // длина шага
const int n = 4; // кол-во шагов
float a[n] = { 0.0, 30.0, 45.0, 20.0 }; // углы направления на шагах
 
for(int i = 0; i < n; i++)
{
  x0 = x0 + shag*cos(PI*a[i]/180.0); // перемещаемся в координаты
  y0 = y0 + shag*sin(PI*a[i]/180.0); // предыдущего шага
  cout << x0 << "\t" << y0 << endl;
}
// а сейчас узнаем расстояние:
float r = pow( pow(xn-x0, 2) + pow(yn-y0, 2), 0.5);
 
cout << "rasstoyanie: " << r << endl;
}
Добавлено через 10 минут
ой! Пора линзы в очках менять.
Ullaluna
 Аватар для Ullaluna
8 / 6 / 1
Регистрация: 11.11.2013
Сообщений: 75
29.11.2013, 16:59     Как расчитать растояние на координатной плоскости напрямую? #3
Я бы решила задачу в общем виде.

Предполагаем, что направление юг-север совпадает с положительным направлением OY, а направление запад-восток - с положительным направлением OX. Также допустим, что инструкция не содержит указаний типа: "пять шагов в направлении норд-норд-вест".

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <cmath>
using namespace std;
 
int main() {
  //float xstart = 0, ystart = 0;
                                           //по смыслу задачи, начало пути находится в точке отсчета с координатами (0,0);
                                           //это не принципиально и легко поправимо
  float xfin, yfin, step, distance;
  int choice, trigger = 1;
  
  while (trigger) {
    cout << "Укажите координаты следующего шага: " << endl;
    cout << "Сколько шагов на восток? " << "\t"; cin >> xfin; //задаем значение х
    cout << "Сколько шагов на север?" << "\t"; cin >> yfin;   //задаем значение y
                                                                                             //Фактически, мы всякий раз записываем новые координаты
                                                                                             //как координаты конца пути. По условию, мы не должны "запомнить"
                                                                                             //весь путь, важны только начало и конец
    
    cout << "Узнать расстояние (1) или указать координаты следующего шага (2): " << endl;
    cin >> choice;
    switch(choice) {
      case 1: trigger = 0; break;
      case 2: trigger = 1; break;
      default: cout << "Отойди от компьютера, сухопутная крыса! " << endl;
    }
  }
  
  distance = sqrt(pow(xfin,2) + pow(yfin,2));  //известная формула из векторной алгебры :)
  cout << "" << distance << endl;
  
  return 0;
}
Код усложнится, если ввести направления на норд-ист, норд-норд-ист, и т.д. Я бы сделала опять функцию выбора направления, чтобы потом программно умножить на синус и косинус. Но для начала, сомневаюсь, что в учебном задании это необходимо.

Добавлено через 1 час 57 минут
Автор, поллундра! Вся задача решается на раз плюнуть, если кто с универа вспомнит полярные координаты:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <cmath>
using namespace std;
#define itsPi 3.1415
 
int main() {
  float  xpos, ypos, xfin = 0, yfin = 0;
  float  angle, distance;
  int stepcount, choice, trigger = 1;
  
  while (trigger) {
    cout << "Сколько шагов надо пройти?" << "\t";
    cin >> stepcount;
    
    cout << "В каком направлении? " << "\n";
    cout << "1.На север." << endl;
    cout << "2.На северо-запад." << endl;
    cout << "3.На восток." << endl;
    //И так далее...
    cin >> choice;
    switch(choice) {
      case 1: angle = itsPi/2; break;
      case 2: angle = 3*itsPi/4; break;
      case 3: angle = 0; break;
      //и так далее...
      default: cout << "Отойди от компьютера, сухопутная крыса! " << endl;
    }
    
    
    cout << "Узнать пройденное расстояние на данный момент (1)"
         << "ИЛИ задать координаты следующего шага (2)"
     << "ИЛИ указать расстояние и выйти из программы (3): "
     << endl;
    cin >> choice;
    switch(choice) {
      case 1:
    xpos = stepcount*cos(angle);
    ypos = stepcount*sin(angle);
    xfin+=xpos;
    yfin+=ypos;
    distance = sqrt(pow(xfin,2) + pow(yfin,2));
    cout << "x = " << xfin << endl;
    cout << "y = " << yfin << endl;
    cout << "Расстояние: " << distance << endl;
    break;
      case 2:
    xpos = stepcount*cos(angle);
    ypos = stepcount*sin(angle);
    xfin+=xpos;
    yfin+=ypos;
    break;
      case 3:
    xpos = stepcount*cos(angle);
    ypos = stepcount*sin(angle);
    xfin+=xpos;
    yfin+=ypos;
    distance = sqrt(pow(xfin,2) + pow(yfin,2));
    cout << "Расстояние: " << distance << endl;
    trigger = 0;
    break;
      default:
    cout << "Последний раз предупреждаю, лопни моя селезенка! " << endl;
    } 
  }
  
  return 0;
}
Примерно так, плюс-минус добавить табличные данные и привести код в годный вид.

И вот тут тебе вся роза ветров для поиска сокровищ, а твой гипотетический пользователь не парится с незнакомой ему математикой. Чтобы результат выводился с точностью до третьего знака, есть какая-то функция. Помню, в 45-м году во время штурма Берлина что-то такое читала в самоучителе. С тех пор не использовала и забыла.
Yandex
Объявления
29.11.2013, 16:59     Как расчитать растояние на координатной плоскости напрямую?
Ответ Создать тему
Опции темы

Текущее время: 20:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru