2021-05-25

OpenGL交互式绘制三次B样条曲线

代码:

如何插入一段漂亮的代码片

代码片.

#include<gl/glut.h>
#include<math.h>
#include<windows.h>
#include<vector>
#include<algorithm>
using namespace std;
bool mouseRight = false;
struct Point
{
	int x, y;
	Point() {};
	Point(int tx, int ty)
	{
		x = tx;
		y = ty;
	}
};
vector<Point> points;
vector<int> stop;

double caculateDistance(Point a, Point b) 
{
	return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
int getIndexNearMouse(int x, int y) 
{
	double max = 200;		
	int index = -1;
	double min;
	for (int i = 0; i < points.size(); i++)
	{
		double dis = caculateDistance(points[i], Point(x, y));
		if (dis < max)
		{
			if (index == -1)
			{
				index = i;
				min = dis;
			}
			else if (dis < min)
			{
				index = i;
				min = dis;
			}
		}
	}
	return index;
}
void Bspline(Point a, Point b, Point c, Point d)  
{
	int n = 500;
	double derta = 1.0 / n;
	glPointSize(2);
	glColor3d(0, 0, 0);
	glBegin(GL_LINE_STRIP);
	for (int i = 0; i <= n; i++)
	{
		double t = derta * i;
		double ratio[4];
		ratio[0] = -1 * pow(t, 3) + 3 * pow(t, 2) + -3 * t + 1;
		ratio[1] = 3 * pow(t, 3) + -6 * pow(t, 2) + 4;
		ratio[2] = -3 * pow(t, 3) + 3 * pow(t, 2) + 3 * t + 1;
		ratio[3] = 1 * pow(t, 3);
		double x = 0, y = 0;
		x += ratio[0] * a.x + ratio[1] * b.x + ratio[2] * c.x + ratio[3] * d.x;
		y += ratio[0] * a.y + ratio[1] * b.y + ratio[2] * c.y + ratio[3] * d.y;
		x /= 6.0;
		y /= 6.0;
		glVertex2d(x, y);
	}
	glEnd();
}
void myDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT);   


	glPointSize(5);
	glColor3d(1, 0, 0);
	glBegin(GL_POINTS);
	for (int i = 0; i < points.size(); i++)
		glVertex2d(points[i].x, points[i].y);
	glEnd();

	if (points.size() >= 4)
		for (int j = 0; j < stop.size()-1 ; j++)
		{
			for (int i = stop[j]; i < stop[j+1] - 3; i++)
				Bspline(points[i], points[i + 1], points[i + 2], points[i + 3]);
		}
	glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
	if (key == 27)		//ESC
		exit(0);
	if(key == 32)       //space
	{
		stop.push_back(points.size()-1);
	}
}
void mouse(int button, int state, int x, int y)
{
	if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
	{
		Point t(x, y);
		points.push_back(t);
		auto &val = stop.back();
		val = points.size();
		glutPostRedisplay();
	}
	if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)  
		mouseRight = true;
	if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP)
		mouseRight = false;
}
void motion(int x, int y)
{
	if (mouseRight)		
	{
		int index = getIndexNearMouse(x, y);
		if (index == -1)
			return;
		points[index].x = x;
		points[index].y = y;
		glutPostRedisplay();
	}
}
void Reshape(int w, int h)      
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, w, h, 0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void initWindow(int& argc, char* argv[], int width, int height)    
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition((GetSystemMetrics(SM_CXSCREEN) - width) >> 1, (GetSystemMetrics(SM_CYSCREEN) - height) >> 1);       
	glutInitWindowSize(width, height);       
	glutCreateWindow("B样条");

	glClearColor(1, 1, 1, 0);
	glShadeModel(GL_FLAT);
}

int main(int argc, char* argv[])
{
	stop.push_back(0);
	stop.push_back(1);
	initWindow(argc, argv, 1000, 600);

	glutDisplayFunc(myDisplay);
	glutReshapeFunc(Reshape);
	glutMouseFunc(mouse);
	glutMotionFunc(motion);
	glutKeyboardFunc(keyboard);

	glutMainLoop();
	return 0;
}


使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值