This question stems from an attempt to solve the following question: How to calculate specific area on surface of sphere?

First, I parametrize a circular loop:

kxx[kx0_, r_, t_] = kx0 + r Cos[t];
kyy[kx0_, r_, t_] = ky0 + r Sin[t];

Then I plug each expression into three functions hx, hy and hz to map them to some space (code at the end of this question). This essentially takes my 2D curve into 3D space. I now want to calculate the area inside this curve, and my best bet was to define it as a ParametricRegion[] and use Area[].

For some values of kx0, ky0 and r, the ParametricRegion output looks like this:

ParametricRegion[{{cos(1/2 (Sqrt[3] (0.1 cos(t)+4.6)-3 (0.1 sin(t)+1.9)))+cos(1/2 (3 (0.1 sin(t)+1.9)+Sqrt[3] (0.1 cos(t)+4.6)))+1,
2 sin(3/2 (0.1 sin(t)+1.9)) cos(1/2 Sqrt[3] (0.1 cos(t)+4.6)),
-4 (cos(1/2 Sqrt[3] (0.1 cos(t)+4.6))-cos(3/2 (0.1 sin(t)+1.9))) sin(1/2 Sqrt[3] (0.1 cos(t)+4.6))},
0<=t<=2 \[Pi]},{t}] 

However, when I try to calculate its area, I always get 0.

Area[ParametricRegion[{hx[t],hy[t],hz[t]}, {{t, 0, 2 Pi}}]]

When I tried to plot this region, I get an error:

RegionPlot3D[ParametricRegion[{hx[t],hy[t],hz[t]}, {{t, 0, 2 Pi}}]]

Errors: "ParametricRegion... cannot be automatically discretized", "ParametricRegion... is not a valid region to plot." and "RegionPlot3D: Range specification Lighting->Automatic is not of the form {x, xmin, xmax}."

I read about potential reasons my region isn't valid in RegionPlot - not a valid region to plot and Trouble plotting an ImplicitRegion, but I haven't solved my issue yet.

Any advice on how I could solve this issue? I've attempted using Region[] before but failed.

Full code:

kxx[kx0_, r_, t_] = kx0 + r Cos[t];
kyy[kx0_, r_, t_] = ky0 + r Sin[t];

M = 0; phi = Pi/2;

b1 = {{-Sqrt[3]/2}, {3/2}};
b2 = {{-Sqrt[3]/2}, {-3/2}};
b3 = {{Sqrt[3]}, {0}};

hx[kx_, ky_] := 1 + Cos[{kx, ky}.b1] + Cos[{kx, ky}.b2]
hy[kx_, ky_] := Sin[{kx, ky}.b1] - Sin[{kx, ky}.b2]
hz[kx_, ky_] := 
 M - 2 Sin[
    phi] (Sin[{kx, ky}.b1] + Sin[{kx, ky}.b2] + Sin[{kx, ky}.b3])

H[kx_, ky_] = 
  Flatten[{hx[kx, ky], hy[kx, ky], hz[kx, ky]}, 1] // Simplify;

HLoop[kx0_, ky0_, r_, t_] = H[kxx[kx0, r, t], kyy[kx0, r, t]];

R = ParametricRegion[HLoop[kx0, ky0, r, t], {{t, 0, 2 Pi}}]
RegionPlot3D[R, {t, 0, 2 Pi}]
  • 1
    $\begingroup$ The parametric region you define is onedimensional (one parameter t), that's why RegionPlot3D and Area[] don't work! $\endgroup$ – Ulrich Neumann Feb 28 '19 at 7:23
  • $\begingroup$ @UlrichNeumann That makes sense! Any alternatives? $\endgroup$ – TribalChief Feb 28 '19 at 7:25
  • $\begingroup$ @ TribalChief : You prepared the alternatives in your answer I think. Please provide the values of the parameters kx0,ky0 $\endgroup$ – Ulrich Neumann Feb 28 '19 at 8:10
  • $\begingroup$ @UlrichNeumann Sorry, the parameters kx0, ky0 can take any value between 0 and 2 Pi as long as the loop with center (kx0, ky0) stays in the square (0, 2 Pi) x (0, 2 Pi) for some given r. For example, kx0 = 3.5, ky = 3, r = 0.5. BUT this doesn’t matter too much as the functions are periodic. $\endgroup$ – TribalChief Feb 28 '19 at 8:27

If I understand the question right you try to calculate the area of the surface (examplary kx0=3.5, ky0=3)

pic = ParametricPlot3D[HLoop[3.5, 3, r, t], {r, 0, .5}, {t, 0, 2 Pi}]

enter image description here


  • $\begingroup$ Thank you for your answer, but this is essentially what I posted a few hours before you did. The issue with this answer is that the surface inside the region isn't normalized. That is, if you plot this against a sphere, it will NOT lie on its surface. I appreciate your time, though! $\endgroup$ – TribalChief Mar 6 '19 at 19:39

I am not sure whether this is correct, but here's my attempt:

HLoopOnSphere[kx0_, ky0_, r_, t_] = HLoop[kx0, ky0, r, 
   t]/(Sqrt[H[kxx[kx0, r, t], kyy[kx0, r, t]].H[kxx[kx0, r, t], 
   kyy[kx0, r, t]]]);
g = ParametricPlot3D[HLoopOnSphere[kx0, ky0, rr, t], {t, 0, 2 Pi}, {rr, 0, r}]

I just varied r of my loop from 0 to the value needed to construct a surface that can be considered a region, and then used Area[] on it. I normalized the function HLoop[] using HLoopOnSphere[] so that the generated object will lie on the surface of the sphere. I'd appreciate feedback!

  • $\begingroup$ However, the Area from using DiscretizeGraphics seems too off to my liking (I compared against the area it gives for a sphere). Any suggestions on how I could improve this? $\endgroup$ – TribalChief Feb 28 '19 at 3:06
  • 1
    $\begingroup$ You may obtain finer discretization by using the option MaxCellMeasure. In general, the finer the discretization, the better the approximation of area will be. $\endgroup$ – Henrik Schumacher Feb 28 '19 at 6:34

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.