Saltar al contenido

¿Cómo dibujar un arco de elipse en 3D?

Esta duda se puede abordar de diversas formas, sin embargo te enseñamos la que para nosotros es la solución más completa.

Solución:

Una forma de dibujar un arco circular definido por tres puntos (ajustar por elipses):

a, b, m = 1, 0, 0, -1, 1, 2, 1, 1, 1;

a, b, m = 1, 0, 0, -1, 1, 2, 1, 1, 1;

    Arc3D[a_, b_, m_, n_: 60, prim_: Line] := 
      Module[[Alpha], lab, axis, aarc, tm, alpha,
        lab = m + Norm[a - m]*Normalize[b - m];
        axis = (a - m)[Cross](b - m);
        aarc = (VectorAngle[a - m, b - m]);
        tm = RotationMatrix[alpha, axis];
        [email protected][m + tm.(a - m), alpha, 0, aarc, aarc/n]
        ]

    Graphics3D[PointSize[Large], Line[m, a], Line[m, b], 
        Point[a, b, m], Arc3D[a, b, m, 20]]

Gráficos de Mathematica

Esto solo dibuja arcos hasta $ pi $. Trataré de desarrollarlo una vez que sus especificaciones se vuelvan un poco más claras (especialmente cómo se vería su entrada preferida).

Aquí hay algo que he usado antes para hacer gráficos de estados de polarización en campos vectoriales. Realiza transformaciones geométricas en una forma básica similar a lo que Cylinder produce:

pacman[θ1_, θ2_, scale_, thickness_, capStyle_, 
  wedgeStyle_] := capStyle, 
   RevolutionPlot3D[
     thickness, t, 0, scale, θ, θ1, θ2, 
     Mesh -> False][[1]],
   RevolutionPlot3D[-thickness, t, 0, 
      scale, θ, θ1, θ2, Mesh -> False][[1]],
  RevolutionPlot3D[scale, t, t, -thickness, 
     thickness, θ, θ1, θ2, Mesh -> False][[1]],
  wedgeStyle, 
   Polygon[0, 0, -thickness, scale Cos[θ1], 
      scale Sin[θ1], -thickness, scale Cos[θ1], 
      scale Sin[θ1], thickness, 0, 0, 
      thickness, scale Cos[θ2], scale Sin[θ2], 
      thickness, scale Cos[θ2], 
      scale Sin[θ2], -thickness]

ellipse3D[abrList_, wedgeList_: 0, 2 π, scale_: .1, 
  thickness_: .01, capStyle_: , wedgeStyle_: ] :=
 EdgeForm[],
  MapThread[GeometricTransformation[
      pacman[#2, scale, thickness, capStyle, wedgeStyle]
      ,
     AffineTransform[
       Transpose[
        Append[Most[#], Normalize[Cross @@ Most[#]]]], Last[#]
      ]] &,
   abrList, PadRight[wedgeList, Length[abrList], Last[wedgeList]]]

Editar

En el código anterior, agregué la capacidad de dibujar un “arco” relleno de una elipse, más comúnmente conocido como Pacman aplastado. Los ejemplos siguientes siguen siendo los mismos si no especifica un par de ángulos para la cuña en la elipse. Agregaré un ejemplo con una abertura en forma de cuña a continuación.

Graphics3D[
  Red,
  ellipse3D[
    
     (* Axes a, b, position r: *)
     1, 0, 0, 0, .5, 0, 0, 0, 0
     
    
   ]
  ]

elipse3d

La función ellipse3D toma una lista de puntos como argumento, de modo que pueda trazar más de una elipse a la vez. Cada elemento de la lista consta de una Tres entradas:

a, b, r

dónde a y b son vectores tridimensionales que apuntan en la dirección de los ejes semi-mayor y semi-menor. Su longitud determina la excentricidad de la elipse. Si a y b no son perpendiculares entre sí, también puede producir una elipse sesgada. El tercer vector r es la posición en la que se centra la elipse.

Los argumentos opcionales scale y thickness determinar el tamaño total del objeto. Las longitudes dadas por a y b se multiplican por scale antes de trazar, y el z La altura del cilindro que representa la elipse en 3D viene dada por thickness.

Aquí hay otro ejemplo que muestra cómo aplicarlo con una lista de elipses:

Graphics3D[
  Magenta,
  ellipse3D[
    
     (* First ellipse; axes a, b, 
     position r: *)
     1/Sqrt[2], 1/Sqrt[2], 0, 0, .5, 0, 0, 0,
       0
     ,
    
     (* Second ellipse; axes a, b, 
     position r: *)
     .5, 1, .5, .25, .25, .5, 1, 1, 1
     ,
    
     (* Third ellipse; axes a, b, 
     position r: *)
     -.5, .1, 1/Sqrt[2], 0, .5, 0, 0, 1, 
      0.5
     ,
    
     (* Circle: *)
     1, 0, 1, 0, 1, 0, .5, 1, 0
     
    ]
  , ViewPoint -> Top]

más elipses

Aquí hay una elipse con una cuña:

Graphics3D[
  Red,
  ellipse3D[
    
     (* Axes a, b, position r: *)
     1, 0, 0, 0, .5, 0, 0, 0, 0
     
    
   , 0, 5
   ]
  ]

cuña

El segundo argumento (wedgeList) de ellipse3D ahora se especificó como una lista de pares de ángulos, uno para cada elipse que se dibujará. Si solo hay un elemento, todas las elipses subsiguientes especificadas por el primer argumento (abrList) se dibujan con los mismos tramos de ángulos.

Editar 2

Para poder dibujar también arcos de elipse abiertos Agregué dos argumentos más a la función, especificando el estilo en el que se renderizan las diferentes caras de la elipse. Para las caras superior e inferior, el estilo está en la variable capStyle (con el valor predeterminado capStyle = El estilo de la tapa se toma de los gráficos adjuntos). Los lados de la cuña se pueden diseñar con el último argumento, wedgeStyle. Para reprimir cualquiera de estos, use FaceForm[].

Por ejemplo, aquí hay un pacman hueco:

Graphics3D[
  Red,
  ellipse3D[
    
     (* Axes a, b, position r: *)
     1, 0, 0, 0, .5, 0, 0, 0, 0
     
    
   , 0, 5, .1, .01, FaceForm[], Directive[Opacity[.5], Blue]
   ]
  ]

hollowpacman

Como ejemplo de aplicación, solo mostraré una trama más complicada hecha con este tipo de función. Requiere demasiadas definiciones adicionales para incluir en esta respuesta, pero puede obtener una mejor impresión de cómo las elipses 3D pueden ser realmente útiles:

esférico armónico

¿Qué pasa con el uso de la primitiva gráfica que se puede extraer de ParametricPlot?

arc = ParametricPlot[2 Cos[t], Sin[t], t, 0, Pi, 
    Axes -> None][[1, 1, 3, 2, 1]];

Luego agregamos un valor constante para la tercera dimensión:

zeros = Table[0, Length[arc]];
arc3D = Partition[Flatten[Transpose[arc, zeros]], 3];

Luego podemos usar esto como una primitiva de gráficos 3D:

Graphics3D[
 GeometricTransformation[
  Line[arc3D], RotationMatrix[45 Degree, 1, 0, 0], 0, 0, 1], 
 AspectRatio -> 1, SphericalRegion -> True, 
 PlotRange -> -3, 3, -3, 3, -3, 3]

arco

Sección de Reseñas y Valoraciones

Recuerda que tienes permiso de agregar una reseña si te ayudó.

¡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 *