Pour générer une très belle image, sans utiliser des zillions de points, vous pouvez utiliser une distribution non uniforme des points qui inclut la limite de la région que vous voulez. Voici un exemple un peu comme ce que vous décrivez. Nous commençons avec trois cercles mutuellement tangents.
circPic = Graphics[{Circle[{0, Sqrt[3]}, 1],
Circle[{-1, 0}, 1], Circle[{1, 0}, 1]}]
![Mathematica graphics](https://i.stack.imgur.com/z3BzT.png)
nous écrivons une fonction booléenne qui détermine si un point dans le rectangle {-1/2,1/2} par {0, Sqrt [3]/2} se situe en dehors de toute les cercles et l'utiliser pour générer des points dans la région d'intérêt.
inRegionQ[p:{x_, y_}] := Norm[p - {1, 0}] > 1 &&
Norm[p + {1, 0}] > 1 && Norm[p - {0, Sqrt[3]}] > 1;
rectPoints = N[Flatten[Table[{x, y},
{x, -1/2, 1/2, 0.02}, {y, 0.05, Sqrt[3]/2, 0.02}], 1]];
regionPoints = Select[rectPoints, inRegionQ];
Maintenant, nous générons la frontière. Le paramètre n détermine combien de points nous plaçons sur la frontière.
n = 120;
boundary = N[Join[
Table[{1 - Cos[t], Sin[t]}, {t, Pi/n, Pi/3, Pi/n}],
Table[{Cos[t], Sqrt[3] - Sin[t]}, {t, Pi/3 + Pi/n, 2 Pi/3, Pi/n}],
Table[{Cos[t] - 1, Sin[t]}, {t, Pi/3 - Pi/n, 0, -Pi/n}]]];
points = Join[boundary, regionPoints];
Jetons un coup d'œil.
Show[circPic, Graphics[Point[points]],
PlotRange -> {{-3/4, 3/4}, {-0.3, 1.3}}]
![Mathematica graphics](https://i.stack.imgur.com/SnkqU.png)
Maintenant, nous définissons une fonction et d'utiliser ListPlot3D
pour tenter de le tracer.
f[x_, y_] := -(1 - Norm[{x - 1, y}]) (1 - Norm[{x + 1, y}])*
(1 - Norm[{x, y - Sqrt[3]}]);
points3D = {#[[1]], #[[2]], f[#[[1]], #[[2]]]} & /@ points;
pic = ListPlot3D[points3D, Mesh -> All]
![Mathematica graphics](https://i.stack.imgur.com/K1mE5.png)
D'une certaine façon, nous devons supprimer ce genre de choses qui se trouve en dehors de la région. Dans cet exemple particulier, nous pouvons utiliser le fait que la fonction est nulle sur la frontière.
DeleteCases[Normal[pic], Polygon[{
{x1_, y1_, z1_?(Abs[#] < 1/10.0^6 &)},
{x2_, y2_, z2_?(Abs[#] < 1/10.0^6 &)},
{x3_, y3_, z3_?(Abs[#] < 1/10.0^6 &)}}, ___],
Infinity]
![Mathematica graphics](https://i.stack.imgur.com/aKqJ5.png)
Très bon, mais il y a quelques problèmes à proximité des points de rebroussement et il est certainement pas très général car il a utilisé une propriété spécifique de la fonction. Si vous examinez la structure de pic, vous trouverez qu'il contient un GraphicsComplex
et les premiers n points dans le premier argument de ce GraphicsComplex
est exactement la limite. En voici la preuve:
Most /@ pic[[1, 1, 1 ;; n]] == boundary
Maintenant, la frontière se décline en trois composantes et nous voulons supprimer un triangle formé par les points choisis d'un seul de ces composants. Le code suivant le fait. Notez que boundaryComponents contient les indices des points qui forment la frontière et someSubsetQ [A, Bs] renvoie vrai si A est un sous-ensemble de l'un des Bs. Nous voulons supprimer les indices triangulaires dans le multi-polygone qui sont des sous-ensembles de l'un des boundaryComponents. Cela est accompli dans le code suivant par la commande DeleteCases
.
Oh, et ajoutons de la décoration aussi.
subsetQ[A_, B_] := Complement[A, B] == {};
someSubsetQ[A_, Bs_] := Or @@ Map[subsetQ[A, #] &, Bs];
boundaryComponents = Partition[Prepend[Range[n], n], 1 + n/3, n/3];
Show[pic /. Polygon[triangles_] :> {EdgeForm[Opacity[0.3]],
Polygon[DeleteCases[triangles, _?(someSubsetQ[#, boundaryComponents] &)]]},
Graphics3D[{Thick, Line[Table[Append[pt, 0],
{pt, Prepend[boundary, Last[boundary]]}]]}]]
Pourriez-vous simplement définir des valeurs en dehors de U à 0? IE, quelque chose comme g [x_, y _] = Si [Hacher [Im [f [x, y]]] == 0, f [x, y], 0] et tracer g [x, y] au lieu de f –
C'est possible à faire, mais ça n'aide pas vraiment car alors Mathematica rejoint le plan z = 0 avec le reste du graphe (avec la partie que je veux dessiner). Peut-être existe-t-il un moyen de dire à Mathematica de ne pas connecter ces deux parties? – cefstat
Que diriez-vous de "RegionFunction -> Fonction [{x, y, z}, Chop [Im [f [x, y]]] == 0]"? BTW, j'ai une meilleure expérience d'obtenir des réponses utiles lorsque je poste le code Mathematica que les gens peuvent se courir eux-mêmes –