Re: hexagon tiled torus
- To: mathgroup at smc.vnet.net
- Subject: [mg20667] Re: hexagon tiled torus
- From: Martin Kraus <Martin.Kraus at informatik.uni-stuttgart.de>
- Date: Sun, 7 Nov 1999 02:10:04 -0500
- Organization: Institut fuer Informatik, Universitaet Stuttgart
- References: <7vrc11$2n2@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Guilherme Roschke wrote:
>
> I am trying to draw a torus tiled with regular hexagons. I've been able
> to modify the torus in <<Graphics`Shapes` to give one tiled by triangles,
> but no luck with regular hexagons.
>
> to make triangles
>
> <<Graphics`Shapes`
> torus=Show[Graphics3D[Torus[]]];
> triangles=Show[torus/.Polygon[{a_,b_,c_,d_}]:>{Polygon[{a,b,c}],Polygon[{a,c,d}]}];
>
> anybody have any references to digital/computational geometry books that
> might cover this problem?
>
> -guilherme
>
I don't, sorry.
Here is some code:
Generate a Graphics object (called flatGraphics)
with the "texture" (hexagons here):
edge = 1; nx = 20; ny = 12;
hexagons =
Table[N[Polygon[
Table[{If[OddQ[i], edge Sin[Pi/3], 0] + 2 edge Sin[Pi/3] j,
3/2 i} + {edge Sin[Pi/3], edge} +
edge {Sin[phi], -Cos[phi]}, {phi, 0, 2 Pi, 2 Pi/6}]]], {i,
0,
ny - 1}, {j, 0, nx - 1}];
flatGraphics =
Graphics[hexagons,
PlotRange -> {{0, nx edge 2 Sin[Pi/3]}, {0, ny edge 3/2}}];
Define a function to map the "texture" onto a three-dimensional
surface (given as a function of two coordinates):
EmbedIn3D[
g_Graphics, {fx_, fy_, fz_}, {u_, umin_, umax_}, {v_, vmin_, vmax_}]
:=
Module[{x, y, xmin, ymin, xmax, ymax, g1, g2,
g3}, {{xmin, xmax}, {ymin, ymax}} = FullOptions[g, PlotRange];
g2 = Evaluate[
g][[1]] /. {{x_?NumberQ,
y_?NumberQ} :> {(x - xmin)/(xmax - xmin)*(umax - umin) +
umin, (y - ymin)/(ymax - ymin)*(vmax - vmin) + vmin}};
(*
map coordinates to ranges of u and v *)
g3 = g2 /. {{x_?NumberQ,
y_?NumberQ} :> ({fx, fy, fz} /. {u :> x, v :> y})};
Graphics3D[g3]]
Use it for a torus with the hexagons as texture:
rTorus = 10; rTube = 5;
Show[EmbedIn3D[flatGraphics,
rTorus {Cos[phi], Sin[phi], 0} +
rTube{Cos[phi] Cos[theta], Sin[phi] Cos[theta], Sin[theta]},
{phi, 0,
2 Pi}, {theta, 0, 2 Pi}]];
There are several problems of this solution, but it might be good
enough in your case.
Greetings
Martin Kraus