mirror of
https://github.com/stasenso/rp_pico_display_engine.git
synced 2026-06-26 21:32:41 +03:00
Besier curve added
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
#include "DrawBezier.h"
|
||||
// Установка пикселя в буфере (с проверкой границ)
|
||||
void set_pixel(int x, int y, uint16_t color) {
|
||||
if (x >= 0 && x < WIDTH && y >= 0 && y < HEIGHT) {
|
||||
frame_buffer[y * WIDTH + x] = color;
|
||||
}
|
||||
}
|
||||
|
||||
// Функция для вычисления базисного полинома Бернштейна
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user