圆柱算法很奇怪

时间:2014-09-28 15:22:25

标签: java algorithm opengl lwjgl

我想在Opengl中渲染一个圆柱体。为此,我写了一个简单的算法,那 通过参数radius,height,xSubDivisions和ySubDivisions为我生成点网格: (Java)的

for(int yDivision = 0; yDivision < yDivisionCount; yDivision++){
    for(int xDivision = 0; xDivision < xDivisionCount; xDivision++){
        float line[] = getVboLine(xDivision, yDivision, radius, height, xDivisionCount, yDivisionCount);
        string.append(line[0] + ", " + line[1] + ", " + line[2] + ", " + line[3] + ", " + line[4] + ", ");
    }
}



public float[] getVboLine(int xDivision, int yDivision, float radius, float height, int xDivisionCount, int yDivisionCount){
    float xDegrees = 360.0f / xDivisionCount * xDivision;
    float xRadian = (float) Math.toRadians(xDegrees);
    float x = (float) Math.sin(xRadian) * radius;
    float z = (float) Math.cos(xRadian) * radius;
    float y = (float) yDivision * (height / (yDivisionCount - 1));
    float s = xDegrees * (1.0f / 360.0f);
    float t = yDivision * (1.0f / (yDivisionCount - 1));
    return new float[]{
            x, y, z, s, t
    };
}

结果实际上是一个圆柱体,(我创建了一个IBO来渲染这个点),但有时候,x和yDivisions的输入不同,它有一个奇怪的差距。 我找不到规则,但我发现这个错误的值是200,100。 要调试我只渲染点。结果是:

enter image description here

这怎么可能?缺少一点(我用油漆添加了芦苇圈)。 算法的问题在哪里?

1 个答案:

答案 0 :(得分:1)

我不是JAVA编码器,但你正在混合int和float一起

  • 例如:
  • xDegrees = 360.0f / xDivisionCount * xDivision
  • [float] [float] [int] [int]
  • 我宁愿用这个:
  • xDegrees = float(360*xDivision)/float(xDivisionCount)
  • 乘法应该始终排在第一位(如果操作数是&gt; = 1)
  • 之后
  • 除法以保持准确性
  • 一些奇怪的舍入可能会导致您的问题,但对于较低的xDivisionCount而不是较大的一个
  • 会更明显

错误断点

  • 添加到您的代码上次生成的点
  • 新点计算后
  • 计算距离最后一点的距离
  • 添加if (|distance-some_avg_distance|>1e-10)
  • 并在
  • 中添加断点
  • some_avg_distance按距离设置(从跟踪中获取)
  • 这样你可以断点导致问题的点(或下一个点)
  • 所以你实际上可以看到出了什么问题
  • 我的赌注是通过四舍五入得到与上一个/下一个点相同的角度
  • 因此您没有遗漏点,但有些重复
  • 您也可以Blending
  • 查看