C ++ / OpenGL - 2D - 如何在矩形边界框中剪切圆

Posted

技术标签:

【中文标题】C ++ / OpenGL - 2D - 如何在矩形边界框中剪切圆【英文标题】:C++ / OpenGL - 2D - How to clip a circle in a rectangle boundary box 【发布时间】:2012-03-31 09:44:10 【问题描述】:

我只是想知道如何在矩形边界框中剪切一个圆?我目前在我的程序中使用 Cohen–Sutherland 算法进行线剪裁,到目前为止,我已经设法剪裁矩形和多边形。但是,对于圆形剪辑,我不知道如何实现这一点。我正在使用以下内容来构建我的圈子:

glBegin(GL_POLYGON);
double radius = 50;  
for(int angle = 0; angle <= 360; angle++ )
    float const curve = 2 * PI * (float)angle / (float)360;
    glVertex2f(point.x + sin(curve) * radius, point.y + cos(curve) * radius);

glEnd();

我的裁剪算法和这里的一样:http://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm。但是,它返回代表新线的 2 个点,以便稍后用于绘制剪裁的形状。所以基本上我已经尝试过这样做:

line Lines[360] // an array with size 360 with data type line, which is a struct holding two points (x1, y1, x2, y2) of the new line returned by my clipping function.

double radius = 50;
for(int angle = 0; angle < 360; angle++)
    float const currentCurve = 2 * PI * (float)angle / (float)360;
    float const nextCurve = 2 * PI * (float)(angle+1) / (float)360;
    int x1 = (int)(point[i].x + sin(currentCurve) * radius); // point is another struct holding only a single point. 
    y1 = (int)(point[i].y + cos(currentCurve) * radius);
    x2 = (int)(point[i+1].x+ sin(nextCurve) * radius);
    y2 = (int)(point[i+1].y + cos(nextCurve) * radius);=
    // Clip the points with the clipping algorithm:
    Lines[i] = Clipper(x1, y1, x2, y2);


// Once all lines have been clipped or not, draw:

glBegin(GL_POLYGON);
for(int i = 0; i < 360; i++)
    glVertex2f(Lines[i].x1, Lines[i].y1);
    glVertex2f(Lines[i].x2, Lines[i].y2);

glEnd();

请注意,我用鼠标在屏幕上画了一个圆圈,并将每个 360 个点存储到一个名为 point 的结构数组中,它是链表的一部分。所以我喜欢 1 个节点代表屏幕上的一个圆圈。

无论如何,通过上述方法,我的圆圈没有被裁剪(或根本没有绘制),并且我的应用程序在单击几下鼠标后崩溃。

【问题讨论】:

您使用变量 i 来索引数组 Lines,但实际上我认为您应该在上面的 for 循环中使用变量“角度”。如果线条完全在矩形之外,我不太确定你的剪裁器会返回什么。在这种情况下,您根本不应该画线。 【参考方案1】:

使用剪刀测试 - 阅读 glScissor():http://www.opengl.org/sdk/docs/man/xhtml/glScissor.xml

【讨论】:

以上是关于C ++ / OpenGL - 2D - 如何在矩形边界框中剪切圆的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL/C++ 中“2D”相机的移动

OpenGL 2D纹理无法正确显示c ++

3D 空间中的 OpenGL 2D 文本 [C++/GLM] 矩阵乘法

如何使用opengl函数制作一个用于在c中绘制3D点的3D窗口?

从位图图像中读取2D纹理(C ++,OpenGL)

如何将 2D 世界转换为屏幕坐标 OpenGL