Image:Triple torus illustration.png

From Wikipedia, the free encyclopedia

Wikimedia Commons logo This is a file from the Wikimedia Commons. The description on its description page there is shown below.
Commons is a freely licensed media file repository. You can help.
Description

Illustration of a triple torus

Source

self-made with MATLAB, source code below

Date

18:01, 7 September 2007 (UTC)

Author

Oleg Alexandrov

Permission
( Reusing this image)

see below


Public domain
I, the copyright holder of this work, hereby release it into the public domain. This applies worldwide.

In case this is not legally possible:
I grant anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.


Afrikaans | Alemannisch | Aragonés | العربية | Asturianu | Български | Català | Cebuano | Česky | Cymraeg | Dansk | Deutsch | Eʋegbe | Ελληνικά | English | Español | Esperanto | Euskara | Estremeñu | فارسی | Français | Galego | 한국어 | हिन्दी | Hrvatski | Ido | Bahasa Indonesia | Íslenska | Italiano | עברית | Kurdî / كوردی | Latina | Lietuvių | Latviešu | Magyar | Македонски | Bahasa Melayu | Nederlands | ‪Norsk (bokmål)‬ | ‪Norsk (nynorsk)‬ | 日本語 | Polski | Português | Ripoarisch | Română | Русский | Shqip | Slovenčina | Slovenščina | Српски / Srpski | Suomi | Svenska | ไทย | Tagalog | Türkçe | Українська | Tiếng Việt | Walon | ‪中文(简体)‬ | ‪中文(繁體)‬ | zh-yue-hant | +/-

MATLAB source code

function main()
 
  % illustration of a triple torus
 
   % torus radii 
   r = 1;
   R = 3;
 
   Kb = R+r;
   Ks = R-r;
 
   % Km controls the smoothness of the transition from one ring to the others
   Km = 0.5125*Kb;
 
   L = 2.5*(r+R);
 
   h = 0.2; % grid size
 
   X = (-L):h:L; m = length(X);
   Y = (-L):h:L; n = length(Y);
   Z = (-1.1*r):h:(1.1*r); k = length(Z);
 
   W = zeros(m, n, k);
 
   for i=1:length(X)
      for j=1:length(Y)
         x = X(i);
         y = Y(j);
 
         [x, y] = triple_torus_function (x, y, r, R, Kb, Km);
         val = (sqrt(x^2+y^2)-R)^2-r^2;
         W(i, j, :) = val + Z.^2;
 
      end
   end
 
   figure(1); clf; hold on;
   axis equal; axis off;
 
   light_green=[184, 224, 98]/256; % light green
 
   H = patch(isosurface(X, Y, Z, W, 0));
   isonormals(X, Y, Z, W, H);
   mycolor = light_green;
 
   set(H, 'FaceColor', mycolor, 'EdgeColor','none', 'FaceAlpha', 1);
   set(H, 'SpecularColorReflectance', 0.1, 'DiffuseStrength', 0.8);
   set(H, 'FaceLighting', 'phong', 'AmbientStrength', 0.3);
   set(H, 'SpecularExponent', 108);
 
   daspect([1 1 1]);
   axis tight;
   colormap(prism(28))
   view(-12, 40);
 
   % add in a source of light
   camlight (-50, 54); lighting phong;
 
   print('-dpng', '-r400',  ...
         sprintf('Triple_torus_illustration.png'));
 
 
function [x, y] = triple_torus_function (x, y, r, R, Kb, Km)
 
% a deformation in the plane, which, when comosed with a torus will give
% a triple torus   
 
% centre of one of the torii
   O = [-Kb, -Kb/sqrt(3)]; 
 
   angle = 2*pi/3;
   Mat = [ cos(angle)  -sin(angle); sin(angle)   cos(angle)  ];
 
   p =[x, y]';
   phi = atan2(y, x);
 
   if phi >= pi/6 & phi <= 5*pi/6
      p = Mat*p; % rotate 120 degree counterclockwise
   elseif phi >= -pi/2 & phi < pi/6
      p = Mat*p; p = Mat*p; % rotate 240 degrees counterclockwise
   end
 
   x=p(1); y = p(2);
 
% reflect against a line, to merge two cases in one
   if y > x/sqrt(3)
 
      p = [x, y];
      v = [cos(2*pi/3), sin(2*pi/3)];
 
      p = p - 2*v*dot(p, v)/dot(v, v);
      x = p(1); y = p(2);
 
   end
 
   if x > O(1)
 
% project to the y axis, to a point B
      if y < O(2)
 
         A = [O(1), y];
         B = [0, y];
      else
 
         A = O;
 
         p = [x, y];
         rho = norm(p-O);
 
         B = O+(Kb/rho)*(p-O);
 
%         t = -O(1)/(x-O(1));
%         B = [0, O(2)+t*(y-O(2))];
 
      end
 
      p = [x, y];
 
      d=norm(p-A);
      q = norm(B-A);
 
      d = my_map(d, q, Km);
      p = (d/q)*B+(1-d/q)*A;
      x=p(1); y=p(2);
 
   end
 
% shift towards the origin
   x = x-O(1);
   y = y-O(2);
 
function y = my_map(x, Kb, Km)
 
   if x > Kb
      y = Km + 1;
   elseif x < Km
      y = x;
   else
      y = Km+sin((pi/2)*(x-Km)/(Kb-Km));
   end

File history

Click on a date/time to view the file as it appeared at that time.

Date/Time Dimensions User Comment
current 03:01, 1 July 2008 2,204×1,550 (670 KB) Oleg Alexandrov (change viewing angle)
02:48, 1 July 2008 1,958×1,335 (530 KB) Oleg Alexandrov (Implementation using isosurface. Much better quality and much simpler than using patches. Will upload source code too. Same license, public domain.)
04:42, 23 June 2008 1,320×1,000 (366 KB) Oleg Alexandrov (Fix a small imperfection in Gimp)
02:54, 10 September 2007 1,320×1,000 (366 KB) Oleg Alexandrov (Tweak)
18:01, 7 September 2007 372×263 (49 KB) Oleg Alexandrov ({{Information |Description= Illustration of en:Triple torus |Source=self-made with MATLAB, source code below |Date=~~~~~ |Author= Oleg Alexandrov }} {{PD-self}} ==MATLAB source code== <pre> <nowiki> % illustration of a tripl)
The following pages on Schools Wikipedia link to this image (list may be incomplete):
The Schools Wikipedia is sponsored by SOS Children , and consists of a hand selection from the English Wikipedia articles with only minor deletions (see www.wikipedia.org for details of authors and sources). See also our Disclaimer.