Gráfico 3D da interseção da esfera com o plano (básico)
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
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]
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]
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 .