如何计算2D向量场的散度和卷曲?

时间:2018-08-11 21:03:39

标签: java processing differentiation

我正在编写一个Applet,用于在Processing中显示2D矢量字段。

在1000x1000的画布上,我绘制了一个20像素长的箭头,该箭头从画布上的网格所标识的每个点开始,并具有相对于在该点计算的矢量分量的方向。现在,我需要显示散度的色图和字段卷曲的色图,其中不同的颜色相对于不同的散度(或卷曲)值。鉴于编译器本身无法执行微分运算(偏导数,或在这种情况下,无法建立2D标量散度域),我需要找到另一种方法。

我的求差方法:对于平面上的每个矢量,我在附近的4个矢量(上,下,右,左一个)上减去(减去矢量)本身。然后,我将向量本身与这4个减法的每个结果进行点积。然后,我找到这些点积结果的平均值,并将其映射到颜色值。

生成的颜色图不正确。我的方法看起来也很凌乱,而且最重要的是,在每个帧上对每个矢量进行的所有计算确实会降低帧速率。

正如Curl所关心的,方法是相同的,但是点积现在是叉积。您是否建议其他方法?

v 是向量本身

calcI calcJ 计算向量I和J分量

            PVector diff1 = PVector.sub(new PVector(calcI(x-1,y-1), calcJ(x-1,y-1)), v);
            PVector diff2 = PVector.sub(new PVector(calcI(x,y-1), calcJ(x,y-1)), v);
            PVector diff3 = PVector.sub(new PVector(calcI(x+1,y-1), calcJ(x+1,y-1)), v);
            PVector diff4 = PVector.sub(new PVector(calcI(x-1,y), calcJ(x-1,y)), v);
            PVector diff5 = PVector.sub(new PVector(calcI(x+1,y), calcJ(x+1, y)), v);
            PVector diff6 = PVector.sub(new PVector(calcI(x-1,y+1), calcJ(x-1,y+1)), v);
            PVector diff7 = PVector.sub(new PVector(calcI(x,y+1), calcJ(x,y+1)), v);
            PVector diff8 = PVector.sub(new PVector(calcI(x+1,y+1), calcJ(x+1,y+1)), v);
            diff1.normalize();
            diff2.normalize();
            diff3.normalize();
            diff4.normalize();
            diff5.normalize();
            diff6.normalize();
            diff7.normalize();
            diff8.normalize();
            v.normalize();
            float divergence = (PVector.dot(v, diff1)+PVector.dot(v, diff2)+PVector.dot(v, diff3)+PVector.dot(v, diff4)+  
                                PVector.dot(v, diff5)+PVector.dot(v, diff6)+PVector.dot(v, diff7)+PVector.dot(v, diff8))/8;

            c = color( map(divergence, 0,1, 0,255) , 0, map(divergence, -1,0, 255,0) );
        fill(c, 10);

0 个答案:

没有答案