首页 > 解决方案 > 如何计算二维矢量场的散度和卷曲?

问题描述

我正在编写一个在处理中显示二维矢量场的小程序。

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

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

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

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

v是向量本身

calcIcalcJ计算向量 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);

标签: javaprocessingdifferentiation

解决方案


推荐阅读