Gráfico 3D da interseção da esfera com o plano (básico)

Sep 24 2020

Devo ser capaz de obter isso com a resposta aqui - mas, com desculpas, não consigo descobrir.

Eu tenho uma esfera e um plano da seguinte forma:

x = InfiniteLine[{{0, 0, 0}, {1, 0, 0}}]; 
y = InfiniteLine[{{0, 0, 0}, {0, 1, 0}}]; 
z = InfiniteLine[{{0, 0, 0}, {0, 0, 1}}]; 
plane = InfinitePlane[{{1/2, 0, 0}, {1/2, 1, 0}, {1/2, 0, 1}}]; 
sphere = Sphere[{5, 0, 0}, 10]; 
sphereOrigin = Point[{5, 0, 0}];

Graphics3D[{{Thick, x}, {Thick, y}, {Thick, z}, {Opacity[0.15], 
   plane}, {Opacity[0.15], sphere}, 
     {PointSize[Large], Red, sphereOrigin}}, Boxed -> False]

O que eu quero é um círculo marcando o contorno onde a esfera cruza o plano. Não quero adicioná-lo manualmente, porque posso desejar usar esferas e planos diferentes.

Meu problema é que, quando tento usar ContourPlot3D, minha matemática fica confusa; ao passo que, se tento usar, Graphics3Dnão consigo descobrir como gerar a linha de contorno.

Sei que este é um exemplo mais básico de uma pergunta que já foi respondida - mas isso significa apenas que a resposta mais sofisticada é muito complexa para mim ...

Respostas

4 cvgmt Sep 24 2020 at 13:03

Usamos a expressão implícita de plano. O normal do avião éCross[b-a,c-a]

({x, y, z} - a).Cross[b - a, c - a]==0

E também usamos a expressão implícita de esfera, aqui {5,0,0}está o centro da esfera e 10é o raio.

Norm[{x, y, z} - {5, 0, 0}] - 10==0

Norm[{x, y, z} - {5, 0, 0}] - 10 Como MeshFunction

x = InfiniteLine[{{0, 0, 0}, {1, 0, 0}}];
y = InfiniteLine[{{0, 0, 0}, {0, 1, 0}}];
z = InfiniteLine[{{0, 0, 0}, {0, 0, 1}}];
plane = InfinitePlane[{{1/2, 0, 0}, {1/2, 1, 0}, {1/2, 0, 1}}];


sphere = Sphere[{5, 0, 0}, 10];
sphereOrigin = Point[{5, 0, 0}];

fig = Graphics3D[{{Thick, x}, {Thick, y}, {Thick, z}, {Opacity[0.15], 
     plane}, {Opacity[0.15], sphere}, {PointSize[Large], Red, 
     sphereOrigin}}, Boxed -> False];

{a, b, c} = {{1/2, 0, 0}, {1/2, 1, 0}, {1/2, 0, 1}};
circle3 = 
  ContourPlot3D[({x, y, z} - a).Cross[b - a, c - a] == 0, {x, -15, 
    15}, {y, -15, 15}, {z, -15, 15}, 
   MeshFunctions -> 
    Function[{x, y, z}, Norm[{x, y, z} - {5, 0, 0}] - 10], 
   Mesh -> {{0}}, MeshStyle -> {Thick,Red}, ContourStyle -> None, 
   BoundaryStyle -> None];
Show[fig, circle3]

2 DanielHuber Sep 24 2020 at 14:09

Usando a opção Malha, conforme indicado no link, funciona apenas cortes de pele paralelos a um plano de coordenadas. Para interseções de arbitray:

Você pode obter o corte de suas duas regiões por: "RegionIntersection [plane, sphere]". No entanto, o que você obtém não é um primitivo gráfico. Portanto, você não pode simplesmente usá-lo em Graphics3D. Para transformá-lo em algo que Graphics3D possa digerir, você precisa usar "DiscretizeRegion", o que não é muito óbvio. Aqui está o seu código com o corte:

x = InfiniteLine[{{0, 0, 0}, {1, 0, 0}}];
y = InfiniteLine[{{0, 0, 0}, {0, 1, 0}}];
z = InfiniteLine[{{0, 0, 0}, {0, 0, 1}}];
plane = InfinitePlane[{{1/2, 0, 0}, {1/2, 1, 0}, {1/2, 0, 1}}];
sphere = Sphere[{5, 0, 0}, 10];
sphereOrigin = Point[{5, 0, 0}];
cut = DiscretizeRegion[RegionIntersection[plane, sphere]];

Graphics3D[{{Thick, x}, {Thick, y}, {Thick, z}, {Opacity[0.15], 
   plane}, {Opacity[0.15], sphere}, {PointSize[Large], Red, cut, 
   sphereOrigin}}, Boxed -> False]

J.M.'sennui Sep 26 2020 at 12:27

Uma vez que a pergunta já foi respondida, deixe-me apresentar uma variação da resposta do cvgmt que pode ser mais legível:

With[{plane = InfinitePlane[{{1/2, 0, 0}, {1/2, 1, 0}, {1/2, 0, 1}}],
      sphere = Sphere[{5, 0, 0}, 10],
      xAxis = InfiniteLine[{{0, 0, 0}, {1, 0, 0}}],
      yAxis = InfiniteLine[{{0, 0, 0}, {0, 1, 0}}],
      zAxis = InfiniteLine[{{0, 0, 0}, {0, 0, 1}}],
      sphereOrigin = Point[{5, 0, 0}]},
     Show[Graphics3D[{{Thick, xAxis, yAxis, zAxis},
                      {Opacity[0.15], plane, sphere},
                      {Directive[PointSize[Large], Red], sphereOrigin}}], 
          ContourPlot3D[Simplify[{RegionMember[sphere, {x, y, z}], 
                                  RegionMember[plane, {x, y, z}]},
                                 {x, y, z} ∈ Reals] // Evaluate,
                        {x, -5, 15}, {y, -10, 10}, {z, -10, 10}, 
                        BoundaryStyle -> {1 -> None, 2 -> None,
                                          {1, 2} -> {{Red, Tube[0.05]}}}, 
                        Contours -> {0}, ContourStyle -> None, Mesh -> None]]]

Isso é baseado na técnica originalmente apresentada aqui .