c# - XNA 画一个实心圆

标签 c# math c#-4.0 xna xna-4.0

在 XNA 的另一个线程中,Callum Rogers wrote some code它创建了一个带有圆形轮廓的纹理,但我正在尝试创建一个充满颜色的圆圈。我必须对此代码进行哪些修改才能用颜色填充圆圈?

public Texture2D CreateCircle(int radius)
{
    int outerRadius = radius*2 + 2; // So circle doesn't go out of bounds
    Texture2D texture = new Texture2D(GraphicsDevice, outerRadius, outerRadius);

    Color[] data = new Color[outerRadius * outerRadius];

    // Colour the entire texture transparent first.
    for (int i = 0; i < data.Length; i++)
        data[i] = Color.Transparent;

    // Work out the minimum step necessary using trigonometry + sine approximation.
    double angleStep = 1f/radius;

    for (double angle = 0; angle < Math.PI*2; angle += angleStep)
    {
        // Use the parametric definition of a circle: http://en.wikipedia.org/wiki/Circle#Cartesian_coordinates
        int x = (int)Math.Round(radius + radius * Math.Cos(angle));
        int y = (int)Math.Round(radius + radius * Math.Sin(angle));

        data[y * outerRadius + x + 1] = Color.White;
    }

    texture.SetData(data);
    return texture;
}

最佳答案

不要为这样的东西使用纹理(尤其是对于单一颜色的东西!) - 也不要尝试逐个像素地进行处理。您获得 3D 加速是有原因的。

只需使用三角扇绘制类似于饼图的圆圈即可。您将需要以下顶点。

  • 圆心
  • x 点在圆的边界上。

前两个点将定义圆心和圆边界之间的一条线。第三个顶点将定义第一个多边形。然后顶点 1、3 和 4 将定义第二个多边形等。

要获取圆边界上的点,请使用示例中的公式。第一个角度为 0°,后面的角度为(360°/圆上的点数)的倍数。要获得一个完整的圆圈,您需要一个额外的点来匹配第二个点(边界上的第一个点)。

根据圆上顶点的数量,您会得到不同的 n 边形。您使用的顶点越多,形状看起来就越圆(以某些性能成本为代价):

  • (不能少于 2 个顶点,因为多边形至少需要绘制 3 个顶点。)
  • 总共 4 个点(圆圈上有 3 个点)会形成一个三角形。
  • 总共 5 个点(圆圈上有 4 个点)将形成一个正方形。
  • 总共 6 个点(圆圈上有 5 个点)会形成一个五边形
  • ...

实际上是XNA example for drawing primites演示如何使用三角形扇形绘制圆(或多边形)。

关于c# - XNA 画一个实心圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5641579/

相关文章:

c# - asp.net web api - 如何验证用户身份

c# - 是否可以保存当前的 XMLReader Position 供以后使用?

java - 特征脸的相关矩阵 - Java

javascript - 根据字符串参数生成相同的随机数

c# - 在 linq 中将实体类型作为参数传递

c# - 按其中的对象列表对对象列表进行排序

ajax - jQuery 将类作为 POST 参数发送

c# - 使用 HttpWebRequest 和 X509 SSL 证书检查 HTTPS Web 服务是否可用

c# - 如何在命令行中确定 C# 编译器版本

javascript - 简单的javascript十进制加法会产生不正确的结果