#pragma once #include #include "../datatypes.cpp" #include "../helpers.cpp" #include "../buffer.cpp" namespace UwU { // trapezoid (horizontally constrained) class Trapezoid { public: Trapezoid(uint16_t y0, uint16_t y1, uint16_t xl0, uint16_t xl1, uint16_t xr0, uint16_t xr1) { this->y0 = y0; this->y1 = y1; this->xl0 = xl0; this->xl1 = xl1; this->xr0 = xr0; this->xr1 = xr1; } Trapezoid() {} uint16_t y0; uint16_t y1; uint16_t xl0; uint16_t xl1; uint16_t xr0; uint16_t xr1; // Draw a horizontally bounded trapezoid // y1 >= y0 // todo move to private and add public checks void draw (Buffer buffer, Color color) { // printf("(%u, %u, %u, %u, %u, %u)", coords.y0, coords.y1, coords.xl0, coords.xl1, coords.xr0, coords.xr1); uint16_t height = 1 + y1 - y0; int16_t LeftBound[height]; int16_t RightBound[height]; Helpers::bresenham(0, xl0, y1 - y0, xl1, LeftBound); Helpers::bresenham(0, xr0, y1 - y0, xr1, RightBound); // printf("leftbound\n"); for (uint16_t i = 0; i < height; i++) { // printf("(%u, %u)\n", i, LeftBound[i]); } // printf("rightbound\n"); for (uint16_t i = 0; i < height; i++) { // printf("(%u, %u)\n", i, RightBound[i]); } for (uint16_t i = 0; i < height; i++) { for (uint16_t x = LeftBound[i]; x <= RightBound[i]; x++) { // printf("(%u, %u)", x, i + coords.y0); buffer.drawPixel(Coord2(x, i + y0), color); } } return; } }; }