在OpenGL中绘制圆所需的边数
如果给定了圆的半径r和多边形与圆度D的最大偏差,有人知道使用多边形近似圆所需的边数的算法吗?我真的需要找到边的数量,因为我需要在OpenGL中绘制近似圆在OpenGL中绘制圆所需的边数,opengl,geometry,trigonometry,mathematical-optimization,discrete-mathematics,Opengl,Geometry,Trigonometry,Mathematical Optimization,Discrete Mathematics,如果给定了圆的半径r和多边形与圆度D的最大偏差,有人知道使用多边形近似圆所需的边数的算法吗?我真的需要找到边的数量,因为我需要在OpenGL中绘制近似圆 此外,我们有屏幕的分辨率,以p给出的每像素NDC坐标为单位,通过解算D=p/2,我们可以保证我们的圆的精度在半像素以内。我想说,您需要根据半径和缩放(如果允许缩放)这两个变量设置边数 20像素的圆形或半径可以在32到56条边上看起来很好,但是如果对200像素的收音机使用相同数量的边,则边的数量将不够 numberOfSides = radius
此外,我们有屏幕的分辨率,以p给出的每像素NDC坐标为单位,通过解算D=p/2,我们可以保证我们的圆的精度在半像素以内。我想说,您需要根据半径和缩放(如果允许缩放)这两个变量设置边数 20像素的圆形或半径可以在32到56条边上看起来很好,但是如果对200像素的收音机使用相同数量的边,则边的数量将不够
numberOfSides = radius * 3
如果允许放大和缩小,则需要执行类似操作
numberOfSides = radiusOfPaintedCircle * 3
当你放大绘制圆的半径时,它的“属性”会比绘制圆的“属性”大我有一个使用固定函数opengl绘制圆的算法,也许会有帮助 当你说你想“用多边形近似一个圆”时,很难理解你的意思 你会注意到,在我下面的算法中,我没有计算绘制圆所需的线数,我只是在0之间迭代。。2Pi,每次按0.1步进角度,从上一点开始,用glVertex2f绘制一条线到圆上的该点
void Circle::Render()
{
glLoadIdentity();
glPushMatrix();
glBegin(GL_LINES);
glColor3f(_vColour._x, _vColour._y, _vColour._z);
glVertex3f(_State._position._x, _State._position._y, 0);
glVertex3f(
(_State._position._x + (sinf(_State._angle)*_rRadius)),
(_State._position._y + (cosf(_State._angle)*_rRadius)),
0
);
glEnd();
glTranslatef(_State._position._x, _State._position._y, 0);
glBegin(GL_LINE_LOOP);
glColor3f(_vColour._x, _vColour._y, _vColour._z);
for(float angle = 0.0f; angle < g_k2Pi; angle += 0.1f)
glVertex2f(sinf(angle)*_rRadius, cosf(angle)*_rRadius);
glEnd();
glPopMatrix();
void Circle::Render()
{
glLoadIdentity();
glPushMatrix();
glBegin(GL_行);
glColor3f(_vColour._x,_vColour._y,_vColour._z);
glVertex3f(_状态。_位置。_x,_状态。_位置。_y,0);
glVertex3f(
(_状态._位置._x+(sinf(_状态._角度)*_半径)),
(_状态._位置._y+(余弦(_状态._角度)*_半径)),
0
);
格伦德();
glTranslatef(_State._position._x,_State._position._y,0);
glBegin(GL_线_环);
glColor3f(_vColour._x,_vColour._y,_vColour._z);
用于(浮动角度=0.0f;角度
}您在这里描述的实际上是一个质量因素,它通常与误差估计密切相关 我们处理这个问题的常用方法是计算圆周长的一小部分的误差。最简单的方法是确定圆的一部分的弧长与连接圆周上相同两点的线段的弧长之差。您可以使用更有效的措施,如面积差异、半径等,但这种方法应该足够了 想象一个八角形,用一个完美的圆限定。在这种情况下,误差是八角形上两个相邻点之间的直线长度差,以及连接这两个点的圆的弧长 弧长很容易计算:
PI*r*theta
,其中r
是半径,theta
是两个点之间的角度,以弧度为单位,假设从每个点到圆/多边形的中心绘制直线。对于边数为n
的闭合多边形,角度仅为(2*PI/n)
弧度。让与该n
值对应的弧长等于A
,即A=2*PI*r/n
两点之间的直线长度很容易计算。只要把你的圆分成n
等腰三角形,然后每个等腰三角形分成两个直角三角形。你知道每个直角三角形的角度是θ/2=(2*PI/n)/2=(PI/n),斜边是r
。因此,你得到了sin(PI/n)=x/r的方程,其中x
是连接外切多边形上两个相邻点的线段长度的一半。将该值设为B
(即:B=2x
,因此B=2*r*sin(PI/n)
)
现在,只需计算相对误差,E=|A-B |/A
(即:| TrueValue ApproxValue |/| TrueValue |
),就可以得到误差向量的一个很好的小百分比,用十进制表示。您可以使用上述等式设置E
(即:它不能大于某个值,例如1.05)的约束,以使其“看起来不错”
因此,您可以编写一个函数,根据上述等式计算
a
、B
和E
,并循环通过n
的值,当E
的计算值小于您的阈值时,使其停止循环。我得到的是,半径r,多边形与圆度的最大偏差,D。我需要用D和r得出一个三边测量公式,并给出所需的边数,n。@PrabalPoudel好的,也许你可以更新你的问题来反映这一点。你只需向图形卡发送一个四边形,然后在碎片着色器中绘制圆。这应该非常接近完美像素。在这种情况下,您是否预定义了n?否。在我的示例中,我们希望对n
进行反向求解。在上面,我描述了一个函数,它接受质量/误差因子E
,并返回所需的边数n
,以提供基于所需质量的圆的近似值。混淆了。。你能告诉我你是怎么用r和E计算B的吗。。。我得到一个复杂的三角方程,得到n。,开始时,你决定E
作为你的初始约束,然后你计算a
。从方程E=|A-B |/| A |
,可以计算B
。然后,您知道x=B/2
。您已经从一开始就知道了r
,因此可以从sin(PI/n)=x/r
计算n
,因为您现在拥有除n
之外的所有值。现在您已经有了