当前位置:网站首页>Experiment 10 Bezier curve generation - experiment improvement - interactive generation of B-spline curve
Experiment 10 Bezier curve generation - experiment improvement - interactive generation of B-spline curve
2022-06-12 18:39:00 【Walker 08】
This code generates three times through interaction B Splines . The main function :
- The control point is generated according to the left mouse button click , The control points are generated three times B Splines ;
- Right click to pop up the menu “New B-Spline Curve” Clear current curve , And start a new curve .
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
struct Point
{
int c[2];
int& x = c[0];
int& y = c[1];
Point() { x = 0, y = 0; }
Point(int x0, int y0) { x = x0, y = y0; }
Point(const Point& pt) { x = pt.x, y = pt.y; }
int& operator[](const int i) { return c[i]; }
};
vector<Point> GctrlPt, GbsCurvePt;
int GnumSegment = 10;
void CalcBSPoints()
{
int numCtrPt = GctrlPt.size();
float F0[2], F1[2], F2[2], F3[2];
for (int i = 0; i < 2; i++)
{
F0[i] = (GctrlPt[numCtrPt - 4][i] + 4 * GctrlPt[numCtrPt - 3][i] + GctrlPt[numCtrPt - 2][i]) / 6;
F1[i] = (-3 * GctrlPt[numCtrPt - 4][i] + 3 * GctrlPt[numCtrPt - 2][i]) / 6;
F2[i] = (3 * GctrlPt[numCtrPt - 4][i] - 6 * GctrlPt[numCtrPt - 3][i] + 3 * GctrlPt[numCtrPt - 2][i]) / 6;
F3[i] = (-GctrlPt[numCtrPt-4][i] + 3 * GctrlPt[numCtrPt-3][i] - 3 * GctrlPt[numCtrPt-2][i] + GctrlPt[numCtrPt-1][i]) / 6;
}
float t = 0;
float dt = 1 / (float)GnumSegment;
// The first paragraph NumSubSegment + 1 A little bit , After the second paragraph, each paragraph is NumSubSegment A little bit , Because the starting point after the second paragraph is the end point of the previous paragraph
int numCurvePoint = (GnumSegment + 1) + GnumSegment * (numCtrPt - 4);
GbsCurvePt.resize(numCurvePoint);
int startIdx = GnumSegment * (numCtrPt - 4);
// The starting point number of the first paragraph is 0, After the second paragraph 1, The reasons are as follows
for (int i = (numCtrPt == 4)? 0:1; i < GnumSegment + 1; i++)
{
for (int j = 0; j < 2; j++)
{
GbsCurvePt[i + startIdx][j] = F0[j] + F1[j] * t + F2[j] * t*t + F3[j] * t*t*t;
}
t += dt;
}
}
void ControlPoint(const vector<Point>& vpt)
{
glPointSize(3);
glBegin(GL_POINTS);
for (unsigned int i = 0; i < vpt.size(); i++)
{
glVertex2f(vpt[i].x, vpt[i].y);
}
glEnd();
}
void PolylineGL(const vector<Point>& vpt)
{
glBegin(GL_LINE_STRIP);
for (unsigned int i = 0; i < vpt.size(); i++)
{
glVertex2i(vpt[i].x, vpt[i].y);
}
glEnd();
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 0.0f, 0.0f);
ControlPoint(GctrlPt);
glColor3f(0.0f, 1.0f, 0.0f);
PolylineGL(GctrlPt);
if (GctrlPt.size() >= 4)
{
glColor3f(1.0f, 1.0f, 1.0f);
CalcBSPoints();
PolylineGL(GbsCurvePt);
}
glFlush();
}
void Init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
printf("Please Click left button of mouse to input control point of B-Spline Curve.\n");
printf("Please Click right button of mouse to new a B-Spline Curve.\n");
}
void myReshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
void myMouse(int button, int state, int x, int y)
{
Point pt;
int numCtrPt = GctrlPt.size();
switch (button)
{
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
{
pt.x = x;
pt.y = 480 - y;
GctrlPt.push_back(pt);
glutPostRedisplay();
}
break;
default:
break;
}
}
void processMenuEvents(int option)
{
switch (option) {
case 1:
GctrlPt.clear();
glutPostRedisplay();
break;
}
}
void createGLUTMenus(){
int menu;
// Create a menu and tell GLUT,processMenuEvents Handle menu events .
menu = glutCreateMenu(processMenuEvents);
// Add items to the menu
glutAddMenuEntry("New B-Spline Curve", 1);
// Associate the menu with the right mouse button .
glutAttachMenu(GLUT_RIGHT_BUTTON);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(640, 480);
glutCreateWindow("B-Spline Curve");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(myReshape);
glutMouseFunc(myMouse);
createGLUTMenus();
glutMainLoop();
return 0;
}边栏推荐
- C语言练习(4)——大数乘除
- Typescript common types (I)
- Vue —— 进阶 vue-router 路由(二)(replace属性、编程式路由导航、缓存路由组件、路由的专属钩子)
- JS get the start and end dates of this week according to the nth week of the N year
- Problems that the sap Spartacus e-commerce cloud UI shipping method does not display in the unit test environment
- Review of MySQL (3): query operation
- 基于STM32设计智能家居控制系统(OneNet)_2022
- Gospel of audio and video developers, rapid integration of AI dubbing capability
- Can tonghuashun open an account? Can tonghuashun directly open the security of securities companies on the app
- GD32F4xx控制DGUS 变量显示
猜你喜欢

A story on the cloud of the Centennial Olympic Games belonging to Alibaba cloud video cloud

A story on the cloud of the Centennial Olympic Games belonging to Alibaba cloud video cloud

Common methods and examples of defect detection based on Halcon

间隔两个月,我的第二次上榜纪念日【2022.6.2】

Redis(三十二)-用Redis做分布式锁

从应无所住说起

Partial scratch and corrosion detection of bolts and screws based on Halcon

Topic 66: input array, exchange the largest element with the first element, exchange the smallest element with the last element, and output array.

OpenGL shadow implementation (hard shadow)

Review of MySQL (V): Joint table query and sub query
随机推荐
Gossip about the 88 of redis source code
General differences between SQL server versions released by Microsoft in different periods so far, for reference
干货 | 一文搞定 pytest 自动化测试框架(二)
VirtualLab基础实验教程-6.闪耀光栅
OpenGL shadow implementation (hard shadow)
C language operation database (SQLite3) call interface function
GD32F4xx控制DGUS触控按键
Summary of interview questions
wireshark基本使用命令
C语言学习——数据在内存中的存储
bilibili视频列表名字太长显示不全的解决方法
When openharmony meets openeuler
JS quick sort
Gd32f4xx controls dgus variable display
Basic SQL statement - select (single table query)
In 2021, the global spice and seasoning revenue is about 18720million US dollars, and it is expected to reach 25960million US dollars in 2028
01 complexity
A story on the cloud of the Centennial Olympic Games belonging to Alibaba cloud video cloud
Solution to the problem that the anaconda navigator card logo cannot be opened and the card will flash back - replace the alicloud image source
Interior design style type, rendering 100 invitation code [1a12]