Другие языки программирования и технологии

кривая безье из 3 точек есть ли формула для считывания любых точек кривой?

MC
Metin Cetin
110
Кривая безье это и ЕСТЬ ФОРМУЛА! Подставляем значения - получаем точечки: https://ru.wikipedia.org/wiki/Кривая_Безье
Kanat Kuandykov
Kanat Kuandykov
84 722
Из моего проекта по компьютерной графики. Всего в проекте 3 800 строк.
Результат работы фрагмента кода на скрине.
Для точек
points.push_back(pair(8 * 10, 8 * 50));
points.push_back(pair(8 * 40, 8 * (-40)));
points.push_back(pair(8 * 190, 8 * 180));
points.push_back(pair(8 * 40, 8 * (-60)));
points.push_back(pair(8 * 80, 8 * 130));
points.push_back(pair(8 * 10, 8 * 50));

//Кривая Безье по свёртке Бернштейна
static Image Bezier_Bernstein(unsigned s_x, unsigned s_y, vector < pair < double, double > > p, double iter)
{
double pii = atan(1) * 4;

vector rz;
unsigned n = p.size() - 1;
for (double t = 0; t <= 1; t += iter)
{
double x = 0;
double y = 0;
for (unsigned u = 0; u <= n; ++u)
{
double b = ((double)Mathem::Factorial(n) / (Mathem::Factorial(u) * Mathem::Factorial(n - u))) * pow(t, u) * pow((1 - t), (n - u));
x += b * p[u].first;
y += b * p[u].second;
}
if (rz.size() == 0)
{
rz.push_back(make_tuple(x, y, 0));
}
else
{
double x_old = get<0>(rz[rz.size() - 1]);
double y_old = get<1>(rz[rz.size() - 1]);
double ang = 180 * (atan((y - y_old) / (x - x_old)) / pii);
rz.push_back(make_tuple(x, y, ang));
get<2>(rz[rz.size() - 2]) = ang;
}
}
auto imm = Quadrature(s_x, s_y, rz);
//auto rzz = Marker(imm, p);
return imm;
}

//Отрисовывает многогранник по переданным точкам
static Image Quadrature(unsigned size_x, unsigned size_y, vector < pair < double, double > > v)
{
RenderWindow window(VideoMode(size_x, size_y), "Quadrature");
Image img;
unsigned n = v.size();

/*for (auto t : v)
{
cout << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << endl;
}*/

while (window.isOpen())
{
Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
window.close();
}
window.clear(Color::Black);

sf::Font font;
if (!font.loadFromFile("C:\\Windows\\Fonts\\arial.ttf"))
{
cout << "Ошибка чтения шрифта" << endl;
}

Text text;

text.setFont(font);

text.setCharacterSize(18); // в пикселях, а не точках!

text.setFillColor(sf::Color::Green);

text.setStyle(sf::Text::Bold);

for (unsigned u = 1; u < n; ++u)
{

double x1 = get<0>(v[u - 1]);
double y1 = get<1>(v[u - 1]);

double x = get<0>(v[u]);
double y = get<1>(v[u]);
/*
RectangleShape line1(sf::Vector2f(20, 2));
line1.rotate(-90);
line1.setPosition(200, 300);
line1.setFillColor(Color(255, 0, 0));
window.draw(line1);
*/
double angle = get<2>(v[u - 1]);

double len = sqrt((x1 - x) * (x1 - x) + (y1 - y) * (y1 - y));
RectangleShape line(sf::Vector2f(len, 5));
line.rotate(angle);
line.setPosition(x1, y1);

line.setFillColor(Color(
0,
255,
0
));

window.draw(line);

}

while (window.pollEvent(event))
{
switch (event.type)
{
case sf::Event::Closed:
{
img = window.capture();
window.close();
break;
}
default:
break;
}
}

window.display();
}
return img;
}