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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
13_Tigers
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 3
#1

Движение точки - C++

18.05.2010, 11:08. Просмотров 2447. Ответов 5
Метки нет (Все метки)

Очень нужна помощь с таким заданием:

написать движение точки по ломанному пути( туда и обратно )

на входе: массив точек - узлы ломанного пути и скорость точки( пиксел в секунду )

точка должна пройти все узлы и вернуться обратно в обратном порядке

рисовать не обязательно - главное чтоб можно было увидеть в коде "механику" движения
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2010, 11:08     Движение точки
Посмотрите здесь:

Найти координаты самой низкой точки траектории и другой наивысшей точки подъема C++
C++ Движение точки по окружности
C++ Массив, заполненный 1 и 0. Найти путь, состоящий из нулей, от точки до точки.
Движение точки по окружности C++
Как найти координаты точки на прямой удаленной от заданной точки на х C++
C++ Дана точка A и множество B из N точек. Найти номер точки из множества B, наиболее удаленной от точки A
Вывести расстояние от заданной точки до точки пересечения диагоналей прямоугольников C++
Движение точки в правильном n - угольнике C++
Во введенной строке заменить все запятые на точки, а точки - на восклицательные знаки C++
C++ Движение материальной точки в двумерном пространстве под действием постоянной силы
В символьной строке вместо каждой точки вставить три точки C++
Найти точки пересечения прямых проходящих через заданные точки C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Maxim Prishchepa
Эксперт С++
1920 / 1032 / 74
Регистрация: 29.03.2010
Сообщений: 3,167
18.05.2010, 11:23     Движение точки #2
Цитата Сообщение от 13_Tigers Посмотреть сообщение
Очень нужна помощь с таким заданием:

написать движение точки по ломанному пути( туда и обратно )

на входе: массив точек - узлы ломанного пути и скорость точки( пиксел в секунду )

точка должна пройти все узлы и вернуться обратно в обратном порядке

рисовать не обязательно - главное чтоб можно было увидеть в коде "механику" движения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct point
{
   int x;
   int y;
};
void goForward(point *mas, const int size)
{
   for(int i=0;i<size-1; i++)
      cout<<"Point go from ("<<mas[i].X<<", "<<mas[i].Y<<") to ("<<mas[i +1].X<<", "<<mas[i +1].Y<<");\n";
}
void goBack(point *mas, const int size)
{
   for(int i=size-1; i>1;i--)
      cout<<"Point go from ("<<mas[i].X<<", "<<mas[i].Y<<") to ("<<mas[i -1].X<<", "<<mas[i -1].Y<<");\n";
}
Ну а дальше добавьте задержку в функцию и если требуется плавное перемещение - растчитывайте путь и выводите промежуточные значения
13_Tigers
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 3
21.05.2010, 05:29  [ТС]     Движение точки #3
Спасибо, а можно поподробнее про плавное перемещение?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
01.04.2013, 17:00     Движение точки #4
как вариант:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
struct Way
{
    float x; // x coordinate.
    float y; // y coordinate.
    int t; // delay.
};
 
class PointWay
{
public:
    PointWay();
    PointWay(float, float, int);
    ~PointWay() {}
    void add_point(float, float, int);
    void show_way();
 
private:
    std::vector<Way> points;
    float ix, iy;
 
    void set_sleep(int);
    float formula_length(std::vector<Way>::const_iterator);
    float get_xfactor(std::vector<Way>::const_iterator);
    float get_yfactor(std::vector<Way>::const_iterator);
    void show_point(std::vector<Way>::const_iterator);
};
 
PointWay::PointWay()
{
    std::clog << "You need initialize point.\n";
    exit(0);
}
 
PointWay::PointWay(float x, float y, int time)
{
    Way pt = { x, y, time };
    ix = x, iy = y;
    points.push_back(pt);
}
 
void PointWay::set_sleep(int t)
{
    clock_t start_count = clock();
    while (clock()/CLOCKS_PER_SEC - start_count/CLOCKS_PER_SEC < t)
        ;
}
 
float PointWay::formula_length(std::vector<Way>::const_iterator i)
{
    return sqrt( (ix - i->x) * (ix - i->x) +
                 (iy - i->y) * (iy - i->y) );
}
 
float PointWay::get_xfactor(std::vector<Way>::const_iterator i)
{
    if (i->x > ix)
    {
        return (i->x - ix) / formula_length(i);
    }
    else
    {
        return -((ix - i->x) / formula_length(i));
    }
}
 
float PointWay::get_yfactor(std::vector<Way>::const_iterator i)
{
    if (i->y > iy)
    {
        return (i->y - iy) / formula_length(i);
    }
    else
    {
        return -((iy - i->y) / formula_length(i));
    }
}
 
void PointWay::add_point(float x, float y, int time)
{
    Way addin = { x, y, time };
    points.push_back(addin);
}
 
void PointWay::show_point(std::vector<Way>::const_iterator it)
{
    float fact_x = get_xfactor(it);
    float fact_y = get_yfactor(it);
    for (int i = formula_length(it); i > 0; --i)
    {
        std::cout.precision(3);
        std::cout << "x: " << (ix += fact_x) << "\t y: " << (iy += fact_y) << '\n';
        set_sleep(it->t);
    }
}
 
void PointWay::show_way()
{
    std::vector<Way>::iterator the_point = points.begin();
    ++the_point; // set to the next position, couse first positioni is
    // initialize by constructor;
 
    // front move.
    for ( ; the_point != points.end(); ++the_point)
    {
        show_point(the_point);
        std::cout << '\n';
    }
 
    // move back.
    for ( --the_point; points.size() > 0; --the_point)
    {
        show_point(the_point);
        std::cout << '\n';
        points.erase(the_point);
        the_point = points.end();
    }
}
 
int main()
{
    PointWay obj(1, 1, 1);
    obj.add_point(-3, 5, 1);
    obj.show_way();
}
lemegeton
2917 / 1346 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
01.04.2013, 18:36     Движение точки #5
Ну вы загнули. Фиг разогнешь. Ларчик, между тем, открывается просто, через подобные треугольники.

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
#include <iostream>
#include <iomanip>
#include <string>
#include <ctime>
#include <cstdlib>
#include <cmath>
 
struct Point {
  double x, y;
  // это, конечно, моветон, но для примера сойдет.
  Point() : x(rand() % 20), y(rand() % 20) {}
  Point(const double &x, const double &y) : x(x), y(y) {}
  double getDistanceTo(const Point &a) {
    return sqrt(pow(x - a.x, 2) + pow(y - a.y, 2));
  }
  Point advanceTowards(const Point &a, double amount) {
    double distance = getDistanceTo(a);
    return Point(x + (amount * (a.x - x)) / distance,
      y + (amount * (a.y - y)) / distance);
  }
};
 
std::ostream &operator<<(std::ostream &stream, const Point &p) {
  return stream << std::fixed << std::setprecision(4) << 
    "[" << std::setw(7) << p.x << ", " << std::setw(7) << p.y << "]";
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
 
  const size_t numberOfPoints = 10;
  Point points[numberOfPoints];
  Point point;
  double step = (rand() % 10 + 1) / 10.;
 
  for (size_t i = 0; i < numberOfPoints; ++i) {
    while (point.getDistanceTo(points[i]) >= step) {
      std::cout << point << " -> " << points[i] << ", step = " <<
        step << std::endl;
      point = point.advanceTowards(points[i], step);
    }
    point = points[i];
    std::cout << "Point has come to " << points[i] << std::endl;
  }
 
  std::cin.get();
  return 0;
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
02.04.2013, 02:51     Движение точки #6
смысл тотже)

Добавлено через 7 минут
Хотя наверное более стуктурировано

Добавлено через 5 минут
Вынужден признать - хороший код.
Yandex
Объявления
02.04.2013, 02:51     Движение точки
Ответ Создать тему
Опции темы

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