Saltar al contenido

¿Cómo construir un dado 3D de 10 lados (trapezoedro pentagonal) y girar a una cara?

Investigamos en distintos espacios para así brindarte la solución a tu dilema, si continúas con alguna difcultad puedes dejar tu comentario y respondemos porque estamos para servirte.

Solución:

Editar: olvidé agregar un enlace necesario

Casualmente, hace un tiempo tuve un pequeño proyecto personal tratando de hacer un buen tirador de dados en Mathematica. Aquí hay algo de mi código (nota: esto fue antes de que aprendiera muchas técnicas de eficiencia, por lo que no es rápido, pero hace una animación bastante decente). Sin embargo, no me disculpo por la horrible combinación de colores …

Construyendo el objeto dado

Hace una textura para los lados.

plt[num_] := 
  ReliefPlot[
   Table[i + Sin[i^2 + j^2], i, -4, 4, .03, j, -4, 4, .03], 
   ColorFunction -> "SunsetColors", 
   Epilog -> 
    Inset[Text[Style[ToString[num], Bold, 40, Underlined]], Center, 
      Center, Center, Center]];

Crea una sola cara de dado

makeFace[num_] := Texture[[email protected][num]], 
  Append[#1, VertexTextureCoordinates -> 
       With[n = Length[First[#1]], 
        Table[1/2 Cos[2 [Pi] i/n], Sin[2 [Pi] i/n] + 1/2, 
           1/2, i, 0, n - 1]]] &@
   Polygon[dat[[1, dat[[2, 1, num]]]]]

Hace un faces dados de caras construyendo cada individuo GraphicsComplex

dice[faces_] := Quiet[Module[shape,
   shape = 
    Switch[faces, 4, "Tetrahedron", 6, "Cube", 8, "Octahedron", 
     10, "Dipyramid", 5, 12, "Dodecahedron", 20, "Icosahedron", _, 
     Missing["InvalidDice"]];
   dat = PolyhedronData[shape, "Faces"];
   If[Head[dat] === GraphicsComplex, 
    Graphics3D[makeFace /@ Range[faces], Lighting -> "Neutral", 
     Boxed -> False], shape]]]

Probar un dado de 8 caras:

dice[8]

Objeto de dados de 8 caras

Rodando el gráfico

Límites de los dados (esto podría mejorarse con BoundingRegion)

minz = Min[dat[[1, All, 3]]];
minx = Min[dat[[1, All, 1]]];
miny = Min[dat[[1, All, 2]]];
maxx = Max[dat[[1, All, 1]]];
maxy = Max[dat[[1, All, 2]]];

Redefinir los dados para poder cambiar el punto de vista

dice[faces_, opts___] := Quiet[Module[shape,
   shape = 
    Switch[faces, 4, "Tetrahedron", 6, "Cube", 8, "Octahedron", 
     10, "Dipyramid", 5, 12, "Dodecahedron", 20, "Icosahedron", _, 
     Missing["InvalidDice"]];
   dat = PolyhedronData[shape, "Faces"];
   If[Head[dat] === GraphicsComplex, 
    Graphics3D[makeFace /@ Range[faces], Boxed -> False, 
     SphericalRegion -> True, opts], shape]]]

En este punto, simplemente copié un montón de buenos puntos de vista para cada gráfico, pero probablemente podrías automatizar esto. Adjuntaré la definición de las ubicaciones de las vistas, pero tiene el formato view = <| numberoffaces -> <|sidenumber -> viewpoint, sidenumber2 -> viewpoint2|>...|> por cada lado de los dados.

Aquí están los datos (enlace pastebin)

Ahora elige un rollo al azar:

random[faces_] := 
 dice[faces, ViewPoint -> view[faces, RandomInteger[1, faces]]]

Agregue un rebote (oh wow, olvidé lo lejos que fui con esto …)

bn[n_] := Abs[Sin[n/(2 Pi)]]*n/30;
roll[faces_, opts___] := Module[graphic,
  graphic = random[faces];
  Animate[
   Graphics3D[Rotate[graphic[[1]], n Degree, 1, 1, 1], 
     Polygon[minx - 2, miny - 2, minz + bn[n], maxx + 2, 
         miny - 2, minz + bn[n], maxx + 2, maxy + 2, 
         minz + bn[n], minx - 2, maxy + 2, minz + bn[n]], 
    Sequence @@ graphic[[2 ;;]], opts], n, -120, 0, 
   AnimationRepetitions -> 1, AnimationRate -> 60, 
   AppearanceElements -> None]]

El rebote es así:

Forma de rebote de dados

Poniendo todo junto

Un solo rollo:

roll[faces_] := Module[graphic, i,

  makeFace[
    num_] := Texture[
     [email protected][
       Text[Style[ToString[num], Bold, 30, Underlined]]]], 
    Append[#1, VertexTextureCoordinates -> 
         With[n = Length[First[#1]], 
          Table[1/2 Cos[2 [Pi] i/n], Sin[2 [Pi] i/n] + 1/2, 
             1/2, i, 0, n - 1]]] &@
     Polygon[dat[[1, dat[[2, 1, num]]]]];

  dice[n_, opts___] := Quiet[Module[shape,
     shape = 
      Switch[n, 4, "Tetrahedron", 6, "Cube", 8, "Octahedron", 
       10, "Dipyramid", 5, 12, "Dodecahedron", 20, "Icosahedron", _,
        Missing["InvalidDice"]];
     dat = PolyhedronData[shape, "Faces"];
     If[Head[dat] === GraphicsComplex, 
      Graphics3D[makeFace /@ Range[n], Lighting -> "Neutral", 
       Boxed -> False, SphericalRegion -> True, opts], shape]]];

  random[n_] := 
   dice[n, ViewPoint -> view[n, i = RandomInteger[1, n]]];

  graphic = random[faces];

  Animate[
    Graphics3D[Rotate[graphic[[1]], n Degree, 1, 1, 1], 
     Sequence @@ graphic[[2 ;;]]], n, -120, 0, 
    AnimationRepetitions -> 1, AnimationRate -> 60, 
    AppearanceElements -> None], i]

Probar eso:

roll[8]

Rodando un d8

La aplicación completa (debe evaluar el view definición en el enlace):

CreateDialog[Pane[DynamicModule[, Row[Grid[
   "Select dice: ", 
    Row["d", PopupMenu[Dynamic[num], 4, 6, 8, 10, 12, 20]],
   Button["Roll!", out = roll[num]; 
     AppendTo[history, Text["d" <> ToString[num]], out[[2]]]], 
    SpanFromLeft,
   Dynamic[out[[1]]], SpanFromLeft], 
 Column[Button["Reset history?", 
    history = Style["History", "Text", Bold, 14], 
        SpanFromLeft;], 
   Pane[Dynamic[Grid[history]], 200, 400, Scrollbars -> True], 
   Dynamic[If[Length[history] > 1, 
     Text["Mean: " <> ToString[[email protected][history[[2 ;;, 2]]]]], 
     ""]]]],

Alignment -> Left,
BaseStyle -> "Text", 14,
Initialization :> (history = Style["History", "Text", Bold, 14], 
    SpanFromLeft;
 roll[faces_] := Module[graphic, i,

   makeFace[
     num_] := Texture[
      [email protected][
        Text[Style[ToString[num], Bold, 30, Underlined]]]], 
     Append[#1, VertexTextureCoordinates -> 
          With[n = Length[First[#1]], 

           Table[1/2 Cos[2 [Pi] i/n], Sin[2 [Pi] i/n] + 1/2, 
              1/2, i, 0, n - 1]]] &@
      Polygon[dat[[1, dat[[2, 1, num]]]]];

   dice[n_, opts___] := Quiet[Module[shape,

      shape = Switch[n, 4, "Tetrahedron", 6, "Cube", 8, 
        "Octahedron", 10, "Dipyramid", 5, 12, "Dodecahedron", 
        20, "Icosahedron", _, Missing["InvalidDice"]];
      dat = PolyhedronData[shape, "Faces"];

      If[Head[dat] === GraphicsComplex, 
       Graphics3D[makeFace /@ Range[n], Lighting -> "Neutral", 
        Boxed -> False, SphericalRegion -> True, opts], shape]]];

   random[n_] := 
    dice[n, ViewPoint -> view[n, i = RandomInteger[1, n]]];

   graphic = random[faces];

   Animate[
     Graphics3D[Rotate[graphic[[1]], n Degree, 1, 1, 1], 
      Sequence @@ graphic[[2 ;;]]], n, -120, 0, 
     AnimationRepetitions -> 1, AnimationRate -> 60, 
     AppearanceElements -> None], i
  ];

   out = roll[8]
)]]]

Rodillo de dados

¡Uf! No pensé que estaría publicando eso, pero ahí lo tienes, tal vez hay algunas partes que podrías usar.

El trapezoedro pentagonal es el dual del antiprisma pentagonal:

PolyhedronData["Antiprism", 5]

Gráficos de Mathematica

Desafortunadamente, el dual no está en PolyhedronData:

PolyhedronData["Antiprism", 5, "Dual"]
(*  Missing["NotApplicable"]  *)

Entonces, aquí hay una función para calcular el dual de un poliedro. (Es una adaptación de dual para que las mallas en mi respuesta creen una malla (casi) hexagonal en un elipsoide a poliedros que tienen duales).

ClearAll[dual, sortvertices, reciprocate];

sortvertices[coords_, normal_, face_] := 
  With[proj = DeleteCases[
       Orthogonalize[Join[normal, [email protected][3]]], 0., 0., 0.][[2 ;; 3]],
    SortBy[face, ArcTan @@ (proj.coords[[#]]) &]];

reciprocate[face_?MatrixQ, r_: 1] /; Length[face] >= 3 := 
  r^2 1, -1, 1 Most[#]/Last[#] &@ [email protected][email protected][email protected] Join[
       0, 0, 0, 0,(* dummy row *)
       PadRight[face[[;; 3]], Automatic, 4, 1]
       ];

dual[polyhedron : [email protected][coords_, Polygon[faces_]]] := 
  With[nvertices = [email protected], nfaces = Len[email protected], 
   With[mat = [email protected][email protected] Table[v, f -> 1, f, nfaces, v, faces[[f]]], 
         dualcoords = reciprocate[coords[[#]]] & /@ faces, 
    With[dualfaces = mat["AdjacencyLists"], 
     [email protected] GraphicsComplex[
       dualcoords, 
       Polygon[Table[sortvertices[dualcoords, coords[[v]], dualfaces[[v]]],
         v, [email protected]]]]]]];

El trapezoedro pentagonal:

[email protected] PolyhedronData["Antiprism", 5]

Gráficos de Mathematica

Aquí tienes un comienzo para definir tus polígonos. Esta página tiene coordenadas para muchas formas diferentes. No estoy familiarizado con el formato, es posible que pueda importar este archivo de coordenadas directamente. Pero un poco de copiar / pegar, cambiar los índices para comenzar en 1, y tiene esto

verts [C0_,C1_,C2_]:= 
    0,C0,C1,0,C0,-C1,
    0,-C0,C1,0,-C0,-C1,
    1/2,1/2,1/2,1/2,1/2,-(1/2),
    -(1/2),-(1/2),1/2,-(1/2),-(1/2),-(1/2),
    C2,-C1,0,-C2,C1,0,
    C0,C1,0,-C0,-C1,0;
faces=9,3,7,12,9,12,8,4,
    9,4,2,6,9,6,11,5,
    9,5,1,3,10,1,5,11,
    10,11,6,2,10,2,4,8,
    10,8,12,7,10,7,3,1;
[email protected][
    verts[(Sqrt[5]-1)/4,(Sqrt[5]+1)/4,(Sqrt[5]+3)/4],
    Polygon/@faces]

Gráficos de Mathematica

Ahora todo lo que necesitas hacer es aplicar texturas.

Comentarios y calificaciones del tutorial

Tienes la posibilidad compartir esta noticia si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *