我正在尝试编写一个Mathematica脚本,可以将离散矢量场插值到连续矢量场。然后,我想从连续矢量场中提取积分曲线(场线)。
我知道Mathematica的ListStreamPlot
函数可以在视觉上呈现积分曲线;但是,我需要构成它们的实际点。
我考虑过将蛮力方法写成以下效果:似乎可以递归地确定积分曲线。如果在列表中选择了一个点,则积分曲线中的“下一个”点将是具有最接近斜率的点。 (每个“点”实际上是一个向量,因此每个都有自己的斜率。)当前点的“下一个”点 - 向上,向下,向左或向右只有4个候选者。然后,“下一个”点将成为新的起点,并且该过程将递归,直到达到网格的边缘。
但是,我想知道使用Mathematica的更高级函数是否有更简单的方法。 (我也不知道我的方法在概念上是否正确。)
我真的很感激有关此任务的任何想法或建议。
谢谢!
答案 0 :(得分:3)
仅供参考:http://mathematica.stackexchange.com
制作一些数据:
data = Table[{-1 - x^2 + y, 1 + x - y^2}, {x, -3, 3, 0.2}, {y, -3, 3, 0.2}];
构建ListStreamPlot
plot = ListStreamPlot[data,
StreamStyle -> "Line", Frame -> False, PlotRangePadding -> 0]
在Mathematica中,一切都是表达式 - 所以即使这个图也基本上是图形基元的可视化代码。您可以通过各种方式提取这些原语 - 包括您需要的行。例如 - 只需选择表达式的一部分,您就可以找到包含该图的所有点:
points = plot[[1, 2, 1]];
如果您需要查看整个表达式评估plot//InputForm
。现在您还可以进行模式匹配以查看内部表达式。让我们找到包含所有行的所有索引:
indexes = Cases[plot, Line[index_] -> index, Infinity];
现在,您可以分析,绘制和设计线条。例如 - 设计一个突出显示原始图中特定线的应用程序:
Animate[Show[
plot,
Graphics[{Red, Opacity[.5], , Thickness[.02],
Line[points[[indexes[[k]]]]]}]]
, {{k, 1, "lines"}, 1, Length[indexes], 1}, FrameMargins -> 0]