Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pugixml.hpp"
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm> //do sortowania
- #include <cmath> //do sqrt() – pierwiastek
- using namespace std;
- using namespace pugi;
- struct Frame
- {
- struct Pos
- {
- float x; // Współrzędna x (wzdłuż ulicy)
- float y;
- float w;
- } pos; // Pozycja (odczytana z pliku)
- struct Vel
- {
- float vx; //predkosc po x
- float vy; //predkosc po y
- float vw; //predkosc wypadkowa
- } vel;
- struct ael
- {
- float ax; //predkosc po x
- float ay; //predkosc po y
- float aw; //predkosc wypadkowa
- } ael;
- struct zel
- {
- float zx; //predkosc po x
- float zy; //predkosc po y
- float zw; //predkosc wypadkowa
- } zel;
- };
- int maxx(vector<Frame> w)
- {
- double a = 0;
- int b = 0;
- int x = 0;
- for (unsigned i = 0; i<w.size(); i++)
- {
- if (w[i].vel.vw>a)
- {
- a = w[i].vel.vw;
- x = b;
- }
- b++;
- }
- return x;
- };
- class Samochod
- {
- public:
- vector<Frame> ramki; //wektor ramek pojazdu
- static const int dt = 40; //odległość w czasie między kolejnymi ramkami w ms
- int numer; //numer pojazdu, w końcu mamy to posortować wiec się przyda
- double v_max; //predkosc max
- bool load(string name) //wczytaj z pliku
- {
- xml_document doc;
- xml_parse_result result;
- result = doc.load_file(name.c_str()); //wczytywanie pliku
- if (result.status != status_ok) //sprawdzenie
- return false;
- xml_node root = doc.first_child();
- xml_node frames = root.first_child();
- xml_node frame = frames.first_child();
- xml_node pos = frame.child("pos");
- Frame ramka;
- unsigned i = 0;
- while (true)
- //wczytywanie z xml do naszej struktury
- {
- if (i)frame = frame.next_sibling();
- pos = frame.child("pos");
- i++;
- if (!frame) break;
- ramka.pos.x = atof(pos.child("x").child_value());
- ramka.pos.y = atof(pos.child("y").child_value());
- ramka.pos.w = sqrt(ramka.pos.x*ramka.pos.x + ramka.pos.y*ramka.pos.y);
- //liczenie wypadkowej -> pierwiastek z sumy kwadratow
- ramki.push_back(ramka);
- }
- }
- bool nowy_brumbrum(string name, int number)
- {
- if (!load(name)) return false;
- numer = number;
- calc_inst_vel();
- calc_max_vel();
- calc_acc();
- zmiany_ruchu();
- return true;
- }
- bool wprint(unsigned a, unsigned b)
- {
- if (a>b || a>ramki.size() || b >= ramki.size())
- return false;
- for (unsigned i = a; i <= b; i++)
- if
- cout << "pomiar" << i << "\n"<<" pozycja x \t" << ramki[i].pos.x << "\n pozycja x \t" << ramki[i].pos.y << "\n predkosc x \t" << ramki[i].vel.vx << "\n predkosc y \t" << ramki[i].vel.vy << "\n predkosc w \t" << ramki[i].vel.vw << "\n przyspieszenie \t" << ramki[i].ael.aw << "\n tg skretu \t" << ramki[i].zel.zw << endl;
- return true;
- }
- void wprint()
- {
- for (unsigned i = 0; i<ramki.size(); i++)
- cout <<"pomiar " <<i<<"\n"<< " pozycja x \t" << ramki[i].pos.x << "\n pozycja y \t" << ramki[i].pos.y << "\n predkosc x \t" << ramki[i].vel.vx << "\n predkosc y \t" << ramki[i].vel.vy << "\n predkosc w \t" << ramki[i].vel.vw << "\n przyspieszenie \t" << ramki[i].ael.aw << "\n tg skretu \t"<<ramki[i].zel.zw << endl;
- }
- void calc_acc() //przyspieszenie
- {
- ramki[0].ael.ax = 0;
- ramki[0].ael.aw = 0;
- for (unsigned i = 1; i < ramki.size(); i++)
- {
- ramki[i].ael.ax = 40 * (ramki[i].vel.vx - ramki[i - 1].vel.vx) / dt;
- ramki[i].ael.ay = 40 * (ramki[i].vel.vy - ramki[i - 1].vel.vy) / dt;
- double a = ramki[i].ael.ax*ramki[i].ael.ax +
- ramki[i].ael.ay*ramki[i].ael.ay;
- ramki[i].ael.aw = sqrt(a);
- }
- }
- void calc_inst_vel() //policz predkosc w kolejnych ramkach
- {
- ramki[0].vel.vx = 0; //zakladam ze predkosc poczatkowa =0
- ramki[0].vel.vy = 0;
- ramki[0].vel.vw = 0;
- for (unsigned i = 1; i<ramki.size(); i++)
- {
- ramki[i].vel.vx = 40 * (ramki[i].pos.x - ramki[i - 1].pos.x) / dt;
- ramki[i].vel.vy = 40 * (ramki[i].pos.y - ramki[i - 1].pos.y) / dt;
- double a = ramki[i].vel.vx*ramki[i].vel.vx +
- ramki[i].vel.vy*ramki[i].vel.vy;
- ramki[i].vel.vw = sqrt(a);
- }
- }
- void zmiany_ruchu()//zmiana kierunku
- {
- ramki[0].zel.zx = 0; //zakladam ze predkosc poczatkowa =0
- ramki[0].zel.zy = 0;
- ramki[0].zel.zw = 0;
- for (unsigned i = 1; i<ramki.size(); i++)
- {
- ramki[i].zel.zx = 40 * (ramki[i].pos.x - ramki[i - 1].pos.x) / dt;
- ramki[i].zel.zy = 40 * (ramki[i].pos.y - ramki[i - 1].pos.y) / dt;
- double a = ramki[i].zel.zx*ramki[i].zel.zx /
- ramki[i].zel.zy*ramki[i].zel.zy;
- ramki[i].zel.zw = sqrt(a);
- }
- }
- void calc_max_vel() //znajdz predkosc max
- {
- v_max = ramki[maxx(ramki)].vel.vw;
- }
- };
- bool sortuj1(Samochod a, Samochod b)
- {
- return a.v_max<b.v_max;
- }
- void sortuj(vector<Samochod> &samochody)
- {
- sort(samochody.begin(), samochody.end(), sortuj1);
- }
- int main()
- {
- vector<Samochod> brumbrumki;
- for (unsigned i = 0;; i++)
- {
- cout << "POJAZD" << i<< "\n";
- Samochod brumbrumek;
- string name = "pojazd";
- name += to_string(i + 1);
- name += ".xml";
- if (!brumbrumek.nowy_brumbrum(name.c_str(), i + 1)) break;
- brumbrumki.push_back(brumbrumek);
- brumbrumek.wprint();
- }
- cin.ignore(1);
- exit(-1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement