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

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

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

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

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

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

рисовать не обязательно - главное чтоб можно было увидеть в коде "механику" движения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Maxim Prishchepa
Эксперт С++
 Аватар для Maxim Prishchepa
1761 / 984 / 60
Регистрация: 29.03.2010
Сообщений: 2,975
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
 Аватар для lemegeton
2909 / 1338 / 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     Движение точки
Ответ Создать тему
Опции темы

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