Files
rp_pico_display_engine/DrawBezier.c
T
Stanislav N Mikhailov e89eb58de4 decomposition
2025-01-02 00:12:20 +03:00

36 lines
1.3 KiB
C

#include "DrawBezier.h"
#include "SetPixel.h"
// Функция для вычисления базисного полинома Бернштейна
float bernstein(int i, int n, float t) {
// Вычисление биномиального коэффициента C(n, i)
float binomial = 1.0f;
for (int j = 0; j < i; j++) {
binomial *= (n - j) / (float)(j + 1);
}
return binomial * powf(t, i) * powf(1.0f - t, n - i);
}
// Рисование кривой Безье
void draw_bezier(const int *points_x, const int *points_y, size_t num_points, uint16_t color) {
if (num_points < 2) {
return; // Кривая требует минимум 2 точки
}
const int steps = 1000; // Количество шагов для построения кривой
for (int step = 0; step <= steps; step++) {
float t = step / (float)steps;
float x = 0.0f;
float y = 0.0f;
// Вычисление координат точки на кривой
for (size_t i = 0; i < num_points; i++) {
float b = bernstein(i, num_points - 1, t);
x += b * points_x[i];
y += b * points_y[i];
}
// Установка пикселя на экране
set_pixel((int)(x + 0.5f), (int)(y + 0.5f), color);
}
}