Другие языки программирования и технологии
кривая безье из 3 точек есть ли формула для считывания любых точек кривой?
Кривая безье это и ЕСТЬ ФОРМУЛА! Подставляем значения - получаем точечки: https://ru.wikipedia.org/wiki/Кривая_Безье
Из моего проекта по компьютерной графики. Всего в проекте 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;
}

Результат работы фрагмента кода на скрине.
Для точек
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;
}

Похожие вопросы
- Нужен исходник Кривой Безье на С# Visual studio
- кривые Безье и геометрия
- Как двигать изображение по кривой прямой
- как перевести все объекты в corel draw в кривые?
- как в фотошопе поставить шрифты в кривые? требование к макету-все шрифты должны быть переведены в кривые шрифты
- Подскажите как быстро соединить конечные точки у разомкнутых кривых в Corel
- СРОЧНО! Как сохранить в Corel в кривых
- Corel Draw. Сделать сегмент замкнутой кривой невидимым\изменить цвет.
- Зачем люди, которые прогают на Бейсике, ведут его пропаганду, хотя сами же понимают, что он магко выражаясь "кривой"?
- Как шрифты перевести в кривые в фотошопе?