系列文章目录
前文:OpenGL实现可交互的三次多项式曲线(控制鼠标可拖拽)https://editor.youkuaiyun.com/md/?articleId=109129704
前言
记录一次三维计算机图形学作业,继续提高自己的OpenGL编程能力。本次作业未实现旋转图形的功能,很遗憾。
鼠标在点下方移动可以令相应的控制点向下移动,同理上下左右,不是真正意义的拖拽效果
一、功能简介
对于给定的四个点:Vertex p0(0, 0, 0);Vertex p1(2, 2, -2); Vertex c0(2, -1, -1);Vertex c1(4, 0, 0);求得它们对应的三维三次贝塞尔曲线。当左键在它们附近“拖拽”时,可以操控整条贝塞尔曲线的形状。
二、代码
代码如下(示例)请仔细阅读后,理解了代码原理再尝试运行:
#include <iostream>
#include<gl/glut.h>
#include<math.h>
#include<windows.h>
#include<algorithm>
using namespace std;
struct Vertex
{
double x, y, z;
Vertex(double tx, double ty, double tz)
{
x = tx;
y = ty;
z = tz;
}
};
Vertex p0(0, 0, 0); //点1 鼠标坐标系对应坐标100 300
Vertex p1(2, 2, -2); //点2 鼠标坐标系对应坐标273 223
Vertex c0(2, -1, -1); //点3 鼠标坐标系对应坐标255 340
Vertex c1(4, 0, 0); //点4 鼠标坐标系对应坐标366 300
bool mouseLeftIsDown = false; //在鼠标处于不同状态时,监测鼠标左键是否按下
bool mouseRightIsDown = false; //监测鼠标右键是否按下
double caculateSquareDistance1(double x, double y, Vertex b) //判断鼠标距离点的距离
{
double conclusion = (x - 100 - b.x) * (x - 100 - b.x) + (y - 300 - b.y) * (y - 300 - b.y);
//cout << x << " ," << y << endl; //取消注释本行,可以在console上显示当前鼠标坐标系对应坐标
cout << "this is point1 p0:" << conclusion << endl;
return conclusion;
}
double caculateSquareDistance2(double x, double y, Vertex b) //判断鼠标距离点的距离
{
double conclusion = (x - 330 - b.x) * (x - 300 - b.x) + (y - 200 - b.y) * (y - 200 - b.y);
//cout << x << " ," << y << endl;
cout << "this is point2 p1:" << conclusion << endl;
return conclusion;
}
double caculateSquareDistance3(double x, double y, Vertex b) //判断鼠标距离点的距离
{
double conclusion = (x - 320 - b.x) * (x - 320 - b.x) + (