java - 如何计算二维矢量场的散度和卷曲?
问题描述
我正在编写一个在处理中显示二维矢量场的小程序。
在 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);
解决方案
推荐阅读
- typescript - 如何在 TypeScript 中获取对象中所有键值对的联合类型?
- mysql - Debian 10 看到连接到端口 3306 的 IP
- javascript - javascript中的API正在返回数据,但没有保存到数组中
- spring - 我如何使弹簧数据投影将作为关系的集合作为参数?
- python - 如何从元组列表中计算元组列表?
- jenkins - Thread.sleep() 在 Jenkins Quiet Down 模式下不起作用
- java - Spring Boot - 支持多个 issuer-uri
- python - Python多线程同步
- hazelcast - 确定 Hazelcast 节点是否拥有地图条目
- java - 浏览器刷新不起作用,spring boot + React