Sim*_*mon 8 plot wolfram-mathematica
我想在Manipulate结构中包含一些区域图,但渲染几乎非常慢.代码是
ClearAll[regions, rplot]
r:regions[n_Integer, o_Integer] := r = Apply[And,
Subsets[Table[(#1 - Cos[t])^2 + (#2 - Sin[t])^2 <= 1, {t, 2 Pi/n,
2 Pi, 2 Pi/n}], {o}], {1}] &
r:rplot[n_Integer, o_Integer] := r = Show[{RegionPlot[
Evaluate[regions[n, o][x, y]], {x, -2, 2}, {y, -2, 2},
PlotRange -> {{-2, 2}, {-2, 2}}, PlotRangePadding -> .1,
Frame -> False, PlotPoints -> 100],
Graphics[Table[Circle[{Cos[t], Sin[t]}, 1], {t, 2 Pi/n, 2 Pi, 2 Pi/n}]]}]
Run Code Online (Sandbox Code Playgroud)
这产生的图形就像
GraphicsGrid[{{rplot[3, 2], rplot[5, 3]}, {rplot[7, 2], rplot[4, 1]}}]
Run Code Online (Sandbox Code Playgroud)

以上大约需要40秒才能在我的计算机上进行计算和渲染.任何人都可以建议一种方法来更快地获得类似的质量图形?
注1:我已经记住了图形对象,因此每次在我的演示中都不需要重新计算它 - 但即使是第一次它也太慢了.
注2:我对栅格化图像感到满意,所以也许洪水填充类型解决方案可能是一个选项...
注3:我需要一些类似的东西Manipulate[
rplot[n, o], {n, 2, 10, 1, Appearance -> "Labeled"}, {{o, 1},
Range[1, (n + 1)/2], ControlType -> RadioButtonBar}].
我之前将此作为我其他答案的补充发布。它的灵感来自西蒙的分析方法,并进行了一些修改以加快速度
intersect[n_, o_] :=
With[{a = Pi/2 - (o-1) Pi/n},
If[o-1 >= n/2, Return[{}]]; (* intersection is {} *)
Polygon[
Join[Table[{Sin[a] + Sin[phi], (-Cos[a] + Cos[phi])}, {phi, -a, a-2 a/10, 2 a/10}],
Table[{Sin[a] + Sin[phi], (Cos[a] - Cos[phi])}, {phi, a, -a+2 a/10, -2 a/10}]]]]
rplot2[n_, o_] := With[{pl = intersect[n, o], opac = .3, col = ColorData[1]},
Graphics[{{Opacity[opac],
Table[{col[k], Rotate[pl, Mod[o - 1, 2] Pi/n + 2 Pi k/n, {0, 0}]}, {k, n}]},
{Black, Circle[Through[{Re, Im}[Exp[I #]]]] & /@ (Range[n] 2 Pi/n)}}]
]
Run Code Online (Sandbox Code Playgroud)
首先,我使用给定值 和n,第-th 和-th 个圆o之间的交叉区域与第一个和 -th 个圆之间的交叉区域相同,除了旋转角度 之外,所以它足以计算一次区域并用于旋转区域。ii+o-1o2 Pi (i-1)/nRotate
另外,我没有使用 ParametricPlot 来绘制相交区域,而是使用了,Polygon 因此我只需要计算边界上的一些点,这可以节省时间。
结果GraphicsGrid[{{rplot2[3, 2], rplot2[5, 2]}, {rplot2[7, 3], rplot2[4, 1]}}]看起来像

我得到的时间是
rplot2[10, 3]; // Timing
(* ==> {0.0016, Null} *)
Run Code Online (Sandbox Code Playgroud)
与 Simon 的解决方案相比
rplot[10, 3]; // Timing
(* ==> {0.16519, Null} *)
Run Code Online (Sandbox Code Playgroud)