在我点击的地方画一个三角形
OpenGL - Draw a Triangle wherever I click?
我有一个屏幕大小为1000x800的OpenGL项目,我希望能够在点击鼠标左键时绘制一个三角形。
我已经设置了一个鼠标功能,可以正常工作:
struct point
{
int x;
int y;
};
std::vector <point> dots;
point OneDot;
void processMouse(int button, int state, int x, int y)
{
if ((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN))
{
int yy;
yy = glutGet(GLUT_WINDOW_HEIGHT);
y = yy - y; /* In Glut, Y coordinate increases from top to bottom */
OneDot.x = x;
OneDot.y = y;
dots.push_back(OneDot);
}
}
void display(){
for (int i = 0; i < dots.size();i++){
glPointSize(10)
glBegin(GL_POINTS);
glVertex2i(dots[i].x, dots[i].y);
}
}
所以在我的display()
函数中,我如何添加一些代码,在鼠标位置打印一个三角形,当我点击?
更新:
这是我当前的drawCircle函数:
void drawCircle(float cx, float cy, float r, float num_segments) {
// Sets variables for X, Y, Radius and Segments
glColor3f(1.0, 0.0, 0.0); // Red
glBegin(GL_POLYGON);
// To set 0 as origin point
for (int i = 0; i < num_segments; i++) {
float theta = 2.0f * 3.14 * i / num_segments;
float x = r * cosf(theta);
float y = r * sinf(theta);
glVertex2f(x + cx, y + cy);
}
glEnd();
}
是否有一种方法,我可以在鼠标位置以某种方式绘制这个函数,当我左键点击?
在你的代码中,你几乎做到了。您必须添加两件事:在鼠标事件处理程序中,必须设置通知窗口管理器(在本例中为GLUT)刷新显示的标志。该函数为glutPostRedisplay
。
然后在你的显示函数中,你必须推送3个顶点而不是1个,并将原始类型更改为gl_三角形。这样的
void processMouse(int button, int state, int x, int y)
{
if ((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN))
{
int yy;
yy = glutGet(GLUT_WINDOW_HEIGHT);
y = yy - y; /* In Glut, Y coordinate increases from top to bottom */
OneDot.x = x;
OneDot.y = y;
dots.push_back(OneDot);
glutPostRedisplay(); ///<<<<<<<<<<
}
}
和
void display(){
glBegin(GL_TRIANGLES);
for (int i = 0; i < dots.size();i++){
glPointSize(10)
glVertex2i(dots[i].x-3, dots[i].y-5);
glVertex2i(dots[i].x+3, dots[i].y-5);
glVertex2i(dots[i].x, dots[i].y+5);
}
glEnd();
}
或者,如果你想通过点击来定义三角形的角,只需
void display(){
glBegin(GL_TRIANGLES);
for (int i = 0; i < dots.size();i++){
glPointSize(10);
glVertex2i(dots[i].x, dots[i].y);
}
glEnd();
}
你真的不需要检查3 <= dots.size()
,因为OpenGL会简单地画什么。
我没有glbegin符号的经验,但似乎你错过了glend
应该是这样的:
void display(){
glPointSize(10)
glBegin(GL_POINTS);
for (int i = 0; i < dots.size();i++){
glVertex2i(dots[i].x, dots[i].y);
}
glEnd()
}
相关文章:
- 使用strcpy将char数组的元素复制到另一个数组
- 嵌入方指针压缩已禁用
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- CImage::D raw() 画了一幅黑色的图画
- 在图像标签上画一条线并计算距离
- 画一张卡,并打电话给它
- MFC & Kinect:在 Kinect 的图像上画一条线
- QOpenGLWidget不会画三角形
- OpenGL:在两个元素之间画一条线
- 在QGraphicsScene中的视频上画一条线
- 在 QPlainTextEdit 的第 80 列中画一条线
- 开罗翻转一幅画
- Qt和OpenGL,如果我使用属性,可以画一个三角形
- 通过Qconicalgradient只画一条弧,而不是整圈
- 使用qtcreator在c++上画一条线
- c++使用' .reserve() '填充' std::vector '作为防止多线程缓存无效和错误共享的一种方
- 在我点击的地方画一个三角形
- 如果我有一条从点x1,y1到x2,y2的线,我怎么能画出两条从点x2,y2成45度角的线来画箭头呢
- 画一个圆:在OpenGL中选择线条还是平坦的三角形