-
Notifications
You must be signed in to change notification settings - Fork 0
/
Graphics.cpp
72 lines (62 loc) · 2.49 KB
/
Graphics.cpp
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
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include "Graphics.h"
#include "Intersection.h"
void Graphics::simulate()
{
this->loadBackgroundImg();
while (true)
{
// sleep at every iteration to reduce CPU usage
std::this_thread::sleep_for(std::chrono::milliseconds(1));
// update graphics
this->drawTrafficObjects();
}
}
void Graphics::loadBackgroundImg()
{
// create window
_windowName = "Concurrency Traffic Simulation";
cv::namedWindow(_windowName, cv::WINDOW_NORMAL);
// load image and create copy to be used for semi-transparent overlay
cv::Mat background = cv::imread(_bgFilename);
_images.push_back(background); // first element is the original background
_images.push_back(background.clone()); // second element will be the transparent overlay
_images.push_back(background.clone()); // third element will be the result image for display
}
void Graphics::drawTrafficObjects()
{
// reset images
_images.at(1) = _images.at(0).clone();
_images.at(2) = _images.at(0).clone();
// create overlay from all traffic objects
for (auto it : _trafficObjects)
{
double posx, posy;
it->getPosition(posx, posy);
if (it->getType() == ObjectType::objectIntersection)
{
// cast object type from TrafficObject to Intersection
std::shared_ptr<Intersection> intersection = std::dynamic_pointer_cast<Intersection>(it);
// set color according to traffic light and draw the intersection as a circle
cv::Scalar trafficLightColor = intersection->trafficLightIsGreen() == true ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255);
cv::circle(_images.at(1), cv::Point2d(posx, posy), 25, trafficLightColor, -1);
}
else if (it->getType() == ObjectType::objectVehicle)
{
cv::RNG rng(it->getID());
int b = rng.uniform(0, 255);
int g = rng.uniform(0, 255);
int r = sqrt(255*255 - g*g - r*r); // ensure that length of color vector is always 255
cv::Scalar vehicleColor = cv::Scalar(b,g,r);
cv::circle(_images.at(1), cv::Point2d(posx, posy), 50, vehicleColor, -1);
}
}
float opacity = 0.85;
cv::addWeighted(_images.at(1), opacity, _images.at(0), 1.0 - opacity, 0, _images.at(2));
// display background and overlay image
cv::imshow(_windowName, _images.at(2));
cv::waitKey(33);
}