triangle.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "vc.c"
  2. #define WIDTH 960
  3. #define HEIGHT 720
  4. #define BACKGROUND_COLOR 0xFF181818
  5. #define CIRCLE_RADIUS 100
  6. #define CIRCLE_COLOR 0x99AA2020
  7. static uint32_t pixels[WIDTH*HEIGHT];
  8. static float triangle_angle = 0;
  9. static float circle_x = WIDTH/2;
  10. static float circle_y = HEIGHT/2;
  11. static float circle_dx = 100;
  12. static float circle_dy = 100;
  13. float sqrtf(float x);
  14. float atan2f(float y, float x);
  15. float sinf(float x);
  16. float cosf(float x);
  17. #define PI 3.14159265359
  18. static inline void rotate_point(float *x, float *y)
  19. {
  20. float dx = *x - WIDTH/2;
  21. float dy = *y - HEIGHT/2;
  22. float mag = sqrtf(dx*dx + dy*dy);
  23. float dir = atan2f(dy, dx) + triangle_angle;
  24. *x = cosf(dir)*mag + WIDTH/2;
  25. *y = sinf(dir)*mag + HEIGHT/2;
  26. }
  27. Olivec_Canvas vc_render(float dt)
  28. {
  29. Olivec_Canvas oc = olivec_canvas(pixels, WIDTH, HEIGHT, WIDTH);
  30. olivec_fill(oc, BACKGROUND_COLOR);
  31. // Triangle
  32. {
  33. triangle_angle += 0.5f*PI*dt;
  34. float x1 = WIDTH/2, y1 = HEIGHT/8;
  35. float x2 = WIDTH/8, y2 = HEIGHT/2;
  36. float x3 = WIDTH*7/8, y3 = HEIGHT*7/8;
  37. rotate_point(&x1, &y1);
  38. rotate_point(&x2, &y2);
  39. rotate_point(&x3, &y3);
  40. olivec_triangle3c(oc, x1, y1, x2, y2, x3, y3, 0xFF2020FF, 0xFF20FF20, 0xFFFF2020);
  41. }
  42. // Circle
  43. {
  44. float x = circle_x + circle_dx*dt;
  45. if (x - CIRCLE_RADIUS < 0 || x + CIRCLE_RADIUS >= WIDTH) {
  46. circle_dx *= -1;
  47. } else {
  48. circle_x = x;
  49. }
  50. float y = circle_y + circle_dy*dt;
  51. if (y - CIRCLE_RADIUS < 0 || y + CIRCLE_RADIUS >= HEIGHT) {
  52. circle_dy *= -1;
  53. } else {
  54. circle_y = y;
  55. }
  56. olivec_circle(oc, circle_x, circle_y, CIRCLE_RADIUS, CIRCLE_COLOR);
  57. }
  58. return oc;
  59. }