Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 给定分段数的近似圆_C++_Algorithm_Geometry - Fatal编程技术网

C++ 给定分段数的近似圆

C++ 给定分段数的近似圆,c++,algorithm,geometry,C++,Algorithm,Geometry,是否有更好的方法从半径和顶点数计算圆? 我的解决方案计算每个顶点的sin和cos。有必要吗 void getCircle2D(Vector2 * perimeterPointsArray, int32 numOfPoints, Vector2 & center, flt32 radius) { ASSERT(numOfPoints >= 3); flt32 pieceAngle = MathConst::TAU / numOfPoints; flt32 it

是否有更好的方法从半径和顶点数计算圆? 我的解决方案计算每个顶点的
sin
cos
。有必要吗

void getCircle2D(Vector2 * perimeterPointsArray, int32 numOfPoints, Vector2 & center, flt32 radius)
{
    ASSERT(numOfPoints >= 3);
    flt32 pieceAngle = MathConst::TAU / numOfPoints;
    flt32 iterAngle = 0;
    for (int32 i = 0; i < numOfPoints; ++i)
    {
        perimeterPointsArray[i] = Vector2(radius * cos(iterAngle) + center.x, radius * sin(iterAngle) + center.y);
        iterAngle += pieceAngle;
    }
}
void getCircle2D(矢量2*周长点阵列,int32个点,矢量2和中心,flt32半径)
{
断言(numOfPoints>=3);
flt32 pieceAngle=Mathcont::TAU/numOfPoints;
flt32 iterAngle=0;
对于(int32 i=0;i
你不需要正反两面:


。它的像素图形,但应该是非常容易修改,以创建验证。当然,只有当顶点的数量与像素的数量相当时(比如说一个数量级更小),这才有意义。

您可以计算一半的点,然后围绕X中心镜像。

您建议的方法应该是通常的方法。但是,也许你可以使用以下加法定理来进行迭代计算(参见):

在你的例子中,
a
是前一个角度(你刚刚计算了它的cos和sin),而
b
是恒定的角度步长(当然,它的cos和sin也是恒定的)。所以像这样的东西可以起作用:

void getCircle2D(Vector2 * perimeterPointsArray, int32 numOfPoints, Vector2 & center, flt32 radius)
{
    flt32 pieceAngle = MathConst::TAU / numOfPoints;
    flt32 sinb = sin(pieceAngle), cosb = cos(pieceAngle);
    flt32 sina = 0.0, cosa = 1.0;
    for (int32 i = 0; i < numOfPoints; ++i)
    {
        perimeterPointsArray[i] = Vector2(radius * cosa + center.x, radius * sina + center.y);
        flt32 tmp = sina * cosb + cosa * sinb;
        cosa = cosa * cosb - sina * sinb;
        sina = tmp;
    }
}
void getCircle2D(矢量2*周长点阵列,int32个点,矢量2和中心,flt32半径)
{
flt32 pieceAngle=Mathcont::TAU/numOfPoints;
flt32 sinb=sin(片角),cosb=cos(片角);
flt32 sina=0.0,cosa=1.0;
对于(int32 i=0;i
在这里,您只需要计算一个sin和一个cos(如果编译时已知点数,甚至可以预先计算)


@yi_H我不知道圆光栅化算法是否真的适合浮点圆逼近,但可能在浮点运算中它推广到上述迭代计算。

你是对的,如果你有这样的严格要求(它应该适用于奇数),那么我不会。。。但我觉得这不现实。@yiuh,如果分数是奇数,四分之一不起作用。对于一个极端的例子,考虑3点。YEPP我也说过同样的话。但是你通常会用100个或更多的顶点来近似一个圆,我不认为这是一个现实的场景,你需要101个顶点。
void getCircle2D(Vector2 * perimeterPointsArray, int32 numOfPoints, Vector2 & center, flt32 radius)
{
    flt32 pieceAngle = MathConst::TAU / numOfPoints;
    flt32 sinb = sin(pieceAngle), cosb = cos(pieceAngle);
    flt32 sina = 0.0, cosa = 1.0;
    for (int32 i = 0; i < numOfPoints; ++i)
    {
        perimeterPointsArray[i] = Vector2(radius * cosa + center.x, radius * sina + center.y);
        flt32 tmp = sina * cosb + cosa * sinb;
        cosa = cosa * cosb - sina * sinb;
        sina = tmp;
    }
}