Graphics 圆弧细分算法

Graphics 圆弧细分算法,graphics,shader,geometry,Graphics,Shader,Geometry,我希望在片段着色器中沿圆弧从纹理采样。这样就排除了递归方法,例如 我想出了几种不同的方法来实现这一点:两种似乎最合理的方法是(给定起始位置p、中心c、半径r=长度(c-p)、角度(弧长)θ(弧度)和N位置): 1) 将向量p-c围绕c旋转theta/N,N次:这需要构造一个旋转矩阵,该矩阵将被重复使用:成本是两个触发函数,N2x2矩阵相乘,N左右向量相减 2) 求穿过扇区的一段的弦长:其长度为2*r*sin(θ/2)。一旦我有了第一个向量,我就可以旋转它并将其添加到上一个位置,以“沿着”我的弧。

我希望在片段着色器中沿圆弧从纹理采样。这样就排除了递归方法,例如

我想出了几种不同的方法来实现这一点:两种似乎最合理的方法是(给定起始位置
p
、中心
c
、半径
r=长度(c-p)
、角度(弧长)
θ(弧度)和
N
位置):

1) 将向量p-c围绕c旋转
theta/N
N
次:这需要构造一个旋转矩阵,该矩阵将被重复使用:成本是两个触发函数,
N
2x2矩阵相乘,
N
左右向量相减

2) 求穿过扇区的一段的弦长:其长度为
2*r*sin(θ/2)
。一旦我有了第一个向量,我就可以旋转它并将其添加到上一个位置,以“沿着”我的弧。这个方法的问题是,我仍然不知道获得长度方向的表达式
2*r*sin(θ/2)
vector。即使我这样做了,我也可能需要trig函数来构造它。我仍然需要旋转它,因此可能需要我仍然构建一个旋转矩阵。啊


还有其他的方法我可以考虑吗? 我认为,一旦你开始使用圆和角,你肯定会有几个trig调用。 鉴于此,第一种方法似乎还可以。我只想指出,如果对点进行迭代,我不认为需要2D矩阵乘法

void f(float cx, float cy, float px, float py, float theta, int N)
{
    float dx = px - cx;
    float dy = py - cy;
    float r2 = dx * dx + dy * dy;
    float r = sqrt(r2);
    float ctheta = cos(theta/(N-1));
    float stheta = sin(theta/(N-1));
    std::cout << cx + dx << "," << cy + dy << std::endl;
    for(int i = 1; i != N; ++i)
    {
        float dxtemp = ctheta * dx - stheta * dy;
        dy = stheta * dx + ctheta * dy;
        dx = dxtemp;
        std::cout << cx + dx << "," << cy + dy << std::endl;
    }
}
void f(浮点cx、浮点cy、浮点px、浮点py、浮点θ、整数N)
{
浮点数dx=px-cx;
浮动dy=py-cy;
浮点数r2=dx*dx+dy*dy;
浮点数r=sqrt(r2);
浮点数ctheta=cos(θ/(N-1));
浮点数sθ=sin(θ/(N-1));

std::您能详细说明“沿圆弧采样”的含义吗?您会在每个像素周围的一个圆(或圆的一部分)中采样吗?每个像素的圆弧是否相同(相同的角度和/或半径)?或者别的什么?还有,你为什么要这么做?你有没有可能尝试产生一个径向模糊?我不会透露我到底在做什么。希望有一天你能在游戏中看到它。至于径向模糊,通常通过沿直线采样获得可接受的结果。它更像是一个曲线模糊。一个跟随运动的模糊精确地说,它是一个刚性物体,是围绕固定中心的圆周运动(旋转)的线性组合在我看来,线性运动执行的操作与旋转矩阵乘法相同。我认为在硬件上执行矩阵乘法应该更快。我想,如果我知道
N
theta
的值,我就可以在顶点着色器中生成矩阵。不过,谢谢。很好!很快,可以在绘制数十或数千条圆弧的情况下,例如多边形中的圆角,可以加快速度。我实现了一个版本,其中c/S在该函数外计算全圆(角度0-2PI)并实现了自定义停止标准:绘图通常从px、py开始,但也有端点坐标
ex
ey
,并且当当前x大于或小于ex时退出(上半部分和下半部分的行为不同)。我还添加了CCW/CW功能(多边形绘图中的基本功能,可能有漏洞:).谢谢你的这个片段!