Skip to main content

plotting - Problem regarding 3D plot of a Möbius strip from a set of 2D points


First time posting here, although an experienced user of WM. I have a problem regarding graphics which I cannot seem to fix, so I am asking for your help.



  1. I start with a set of points $(x,y)$ in the range of $[0,1]\times[0,1]$, so a 2D rectangle. With these points I generate a triangle mesh which I later use with Finite Element Method for solving the eigenmodes of this rectangle OR a coat of cylinder, torus, or Möbius, depending on what kind of boundary conditions I use in FEM.

  2. If the membrane is a coat of a 3D object, like in this case for a moebius strip, I want to draw the surface of a Möbius strip as a set of points $(x',y',z')$ in 3D. Normally I do this using parametrisation equations. I have found the equations for a Möbius strip and they work perfectly. Here are the transformations


    • x' = (R + S Cos[0.5 t]) Cos[t]

    • y' = (R + S Cos[0.5 t]) Sin[t]

    • z' = S Sin[0.5 t]




where t$\in$ [0, 2 Pi] = 2 Pi x and S$\in$[-0.5, 0.5] = y - 0.5.




  1. With these new 3D points I can now do a surface plot in 3D, which shoud look something like this for the case of a cylinder: Cylinder But if I draw these points as a Möbius strip, I get weird anomalies. Here are the two cases I tried:




    • ListSurfacePlot3D -> I get weird anomalies. I tried tweaking MaxPlotPoints but it didn't do the trick. First case

    • ListPlot3D -> Works a bit better, but it also fills the hole in between and draws a weird joint. Second case




Here is the data sample of a 2D rectangle: Original


Here is the same data sample, but transformed for the case of Möbius: Transformed


Plot codes for the data


p1 = Graphics3D[Point[data3d], Boxed -> False, AspectRatio -> 1, 

BoxRatios -> Automatic, SphericalRegion -> True, PlotRange -> All,
ImageSize -> 350]
p2=
ListPlot3D[data3d, Boxed -> False, Axes -> False,
SphericalRegion -> True, AspectRatio -> 1, BoxRatios -> Automatic,
MaxPlotPoints -> 30, PlotRange -> All, ImageSize -> 350,
Mesh -> Automatic, PlotStyle -> Magenta]

Show[{p1, p2}]


Where ListPlot3D can also be changed with ListSurfacePlot3D.


I really appreciate your help.



Answer



Let u be the list of 2D points on a rectangle and x their transformed 3D coordinates on the Möbius strip.


{u, x} =
Import["http://pastebin.com/raw.php?i=" <> #, "Package"] & /@
{"x4W9hB59", "3sfTBxhV"};

Because you were doing FEM, you must also have a triangulation of the points. But you haven't provided it, so I'll assume it to be the Delaunay triangulation of u.


t = First@Cases[ListDensityPlot[Join[#, {0}] & /@ u], Polygon[idx_] :> idx, Infinity];


Render x with this triangulation:


Graphics3D[GraphicsComplex[x, {EdgeForm[], Polygon /@ t}]]

enter image description here


Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...