Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.15 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <SFML/Window.hpp>
  3. #include <SFML/System.hpp>
  4. #include <list>
  5. #include <math.h>
  6. #include <iostream>
  7.  
  8. // Pi
  9. #define PI 3.1415926535f
  10.  
  11. using namespace std;
  12.  
  13. // Structures
  14. struct sPoint
  15. {
  16. float x = 0;
  17. float y = 0;
  18. };
  19. struct sSpline
  20. {
  21. std::vector<sPoint> points;
  22. std::vector<sf::Sprite*> sprites;
  23.  
  24. sPoint getSplinePoint(float t)
  25. {
  26. sPoint p;
  27.  
  28. int p0, p1, p2, p3;
  29. p1 = (int)t + 1;
  30. p2 = p1 + 1;
  31. p3 = p2 + 1;
  32. p0 = p1 - 1;
  33.  
  34. float tt = t * t;
  35. float ttt = tt * t;
  36.  
  37. float q1 = -ttt + 2.0f * tt - t;
  38. float q2 = 3.0f * ttt - 5.0f * tt + 2.0f;
  39. float q3 = -3.0f * ttt + 4.0f * tt + t;
  40. float q4 = ttt - tt;
  41.  
  42. p.x = 0.5f * (points[p0].x * q1 + points[p1].x * q2 + points[p2].x * q3 + points[p3].x * q4);
  43. p.y = 0.5f * (points[p0].y * q1 + points[p1].y * q2 + points[p2].y * q3 + points[p3].y * q4);
  44.  
  45. return p;
  46. }
  47. };
  48.  
  49. // Prototypes
  50. void UserInput(std::vector<sPoint> &ControlPoints, std::vector<sf::Sprite*> &ControlPointsSprites, int &ControlPointHandler);
  51. void MoveControlPoint(std::vector<sPoint> &ControlPoints, std::vector<sf::Sprite*> &ControlPointsSprites, int &ControlPointHandler);
  52. void drawSpline(sSpline &spline, std::vector<sPoint> &ControlPoints, sf::RenderWindow &window);
  53.  
  54. int main()
  55. {
  56.  
  57. // Fenster öffnen
  58. sf::RenderWindow window(sf::VideoMode(1920, 1080), "Bezier Curve", sf::Style::Fullscreen);
  59.  
  60. // Hintergrundbild
  61. sf::Sprite s;
  62. sf::IntRect r;
  63. sf::Texture t;
  64.  
  65. t.loadFromFile("Data/Graphics/Background3.png");
  66. r.top = 0.0f;
  67. r.left = 0.0f;
  68. r.width = 1920.0f;
  69. r.height = 1080.0f;
  70.  
  71. s.setTexture(t);
  72. s.setTextureRect(r);
  73. window.draw(s);
  74.  
  75. // Punkte
  76. sPoint p1;
  77. p1.x = 100.0f;
  78. p1.y = 500.0f;
  79. sPoint p2;
  80. p2.x = 300.0f;
  81. p2.y = 500.0f;
  82. sPoint p3;
  83. p3.x = 500.0f;
  84. p3.y = 500.0f;
  85. sPoint p4;
  86. p4.x = 700.0f;
  87. p4.y = 500.0f;
  88. // Add to vector
  89. std::vector<sPoint> ControlPoints;
  90. ControlPoints.push_back(p1);
  91. ControlPoints.push_back(p2);
  92. ControlPoints.push_back(p3);
  93. ControlPoints.push_back(p4);
  94. // Vector for sprites
  95. std::vector<sf::Sprite*> ControlPointsSprites;
  96.  
  97. // Draw ControlPoints
  98. for (int i = 0; i < ControlPoints.size(); i++)
  99. {
  100. // Init
  101. sf::Sprite *sprite = new sf::Sprite;
  102. sf::Texture *texture = new sf::Texture;
  103. sf::IntRect *rect = new sf::IntRect;
  104.  
  105. // Def
  106. texture->loadFromFile("Data/Graphics/black.png");
  107. rect->left = 0;
  108. rect->top = 0;
  109. rect->width = 16.0f;
  110. rect->height = 16.0f;
  111. sprite->setTexture(*texture);
  112. sprite->setTextureRect(*rect);
  113. sprite->setOrigin(8.0f, 8.0f);
  114. sprite->setPosition(ControlPoints.at(i).x, ControlPoints.at(i).y);
  115.  
  116. ControlPointsSprites.push_back(sprite);
  117. }
  118.  
  119. // Variables for main loop
  120. bool beenden = false;
  121. int ControlPointsHandler = 100;
  122. sSpline spline;
  123. spline.points = ControlPoints;
  124. drawSpline(spline, ControlPoints, window);
  125.  
  126. while (!beenden)
  127. {
  128. // Clear
  129. window.clear();
  130.  
  131. // Events
  132. sf::Event e;
  133. if (window.pollEvent(e))
  134. {
  135. if (e.type = sf::Event::KeyPressed)
  136. if(e.key.code == sf::Keyboard::LAlt)
  137. beenden = true;
  138. }
  139.  
  140. // Handle UserInput
  141. UserInput(ControlPoints, ControlPointsSprites, ControlPointsHandler);
  142. MoveControlPoint(ControlPoints, ControlPointsSprites, ControlPointsHandler);
  143.  
  144. // Draw
  145. // BackgroundImage
  146. window.draw(s);
  147. // ControlPoints
  148. for (int i = 0; i < ControlPointsSprites.size(); i++)
  149. window.draw(*ControlPointsSprites.at(i));
  150. // Spline points
  151. for (int i = 0; i < spline.sprites.size(); i++)
  152. window.draw(*spline.sprites.at(i));
  153.  
  154. // Display
  155. window.display();
  156. }
  157.  
  158. return 0;
  159. }
  160.  
  161. void UserInput(std::vector<sPoint> &ControlPoints, std::vector<sf::Sprite*> &ControlPointsSprites, int &ControlPointHandler)
  162. {
  163. if (sf::Mouse::isButtonPressed(sf::Mouse::Button::Left) && ControlPointHandler == 100)
  164. {
  165. for (int i = 0; i < ControlPoints.size(); i++)
  166. {
  167. if (ControlPointsSprites.at(i)->getGlobalBounds().contains(sf::Mouse::getPosition().x,
  168. sf::Mouse::getPosition().y))
  169. {
  170. ControlPointHandler = i;
  171. ControlPointsSprites.at(ControlPointHandler)->setColor(sf::Color::Red);
  172. }
  173. }
  174. }
  175. if (!sf::Mouse::isButtonPressed(sf::Mouse::Button::Left))
  176. {
  177. if(ControlPointHandler != 100)
  178. ControlPointsSprites.at(ControlPointHandler)->setColor(sf::Color::Black);
  179. ControlPointHandler = 100;
  180. }
  181. }
  182. void MoveControlPoint(std::vector<sPoint> &ControlPoints, std::vector<sf::Sprite*> &ControlPointsSprites, int &ControlPointHandler)
  183. {
  184. if (ControlPointHandler != 100)
  185. {
  186. ControlPoints.at(ControlPointHandler).x = sf::Mouse::getPosition().x;
  187. ControlPoints.at(ControlPointHandler).y = sf::Mouse::getPosition().y;
  188. ControlPointsSprites.at(ControlPointHandler)->setPosition(ControlPoints.at(ControlPointHandler).x, ControlPoints.at(ControlPointHandler).y);
  189. }
  190. }
  191. void drawSpline(sSpline &spline, std::vector<sPoint> &ControlPoints, sf::RenderWindow &window)
  192. {
  193. for (float t = 0.0f; t < 1.0f; t += 0.01f)
  194. {
  195. // Punkt
  196. sPoint pos = spline.getSplinePoint(t);
  197.  
  198. // Draw
  199. sf::Sprite *sprite = new sf::Sprite;
  200. sf::IntRect *rect = new sf::IntRect;
  201. sf::Texture *texture = new sf::Texture;
  202.  
  203. // Winkel zwischen Punkten
  204. float gegenkathete = spline.points.at(t).y - ControlPoints.at(t - 0.01f).y;
  205. float ankathete = spline.points.at(t).x - ControlPoints.at(t - 0.01f).x;
  206. float hypothenuse = std::pow(gegenkathete, 2) + std::pow(ankathete, 2);
  207. float winkel = atan(gegenkathete / ankathete) * 180 / PI;
  208.  
  209. texture->loadFromFile("Data/Graphics/red.png");
  210. rect->top = 0.0f;
  211. rect->left = 0.0f;
  212. rect->width = 16.0f;
  213. rect->height = 16.0f;
  214.  
  215. sprite->setTexture(*texture);
  216. sprite->setTextureRect(*rect);
  217. sprite->setRotation(winkel);
  218. sprite->setScale(std::pow(hypothenuse, 0.5f) / 2.0f, 1);
  219. sprite->setOrigin(rect->width / 2, rect->height / 2);
  220. sprite->setPosition(spline.points.at(t).x, spline.points.at(t).y);
  221.  
  222. spline.sprites.push_back(sprite);
  223.  
  224. window.draw(*sprite);
  225. }
  226. }
  227.  
  228.  
  229. /*void drawBezier(Point p1, Point p2, Point p3, sf::RenderWindow &window)
  230. {
  231. std::list<Point> p;
  232.  
  233. for (float t = 0.0f; t < 1; t += 0.01f)
  234. {
  235.  
  236. Point P;
  237. P.x = std::pow(1 - t, 2) * p1.x + (1 - t) * 2 * t * p2.x + t * t * p3.x;
  238.  
  239. P.y = std::pow(1 - t, 2) * p1.y + (1 - t) * 2 * t * p2.y + t * t * p3.y;
  240. p.push_back(P);
  241. }
  242.  
  243. // Iterator
  244. std::list<Point>::iterator it = p.begin();
  245. Point lastPoint = *it;
  246. it++;
  247.  
  248. while(it != p.end())
  249. {
  250. // SFML Graphic
  251. sf::Sprite *S = new sf::Sprite;
  252. sf::IntRect *R = new sf::IntRect;
  253. sf::Texture *T = new sf::Texture;
  254.  
  255. // Winkel zwischen Punkten
  256. float gegenkathete = it->y - lastPoint.y;
  257. float ankathete = it->x - lastPoint.x;
  258. float hypothenuse = std::pow(gegenkathete, 2) + std::pow(ankathete, 2);
  259. float winkel = atan(gegenkathete / ankathete) * 180 / PI;
  260.  
  261. T->loadFromFile("Data/Graphics/dot.png");
  262. R->top = 0.0f;
  263. R->left = 0.0f;
  264. R->width = 2.0f;
  265. R->height = 2.0f;
  266.  
  267. S->setTexture(*T);
  268. S->setTextureRect(*R);
  269. S->setRotation(winkel);
  270. S->setScale(std::pow(hypothenuse, 0.5f) / 2.0f, 1);
  271. //S->setOrigin(R->width / 2, R->height / 2);
  272.  
  273. S->setPosition(it->x, it->y);
  274. lastPoint = *it;
  275. it++;
  276.  
  277. window.draw(*S);
  278. }
  279. }
  280. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement