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;
}
}