cf[x_, y_, z_] := Plus @@ (({x, y, z} - {1, -4, 3})^2);
opts = {ViewPoint -> {5, 5, 5}, Axes -> True, AxesLabel -> {x, y, z},
Ticks -> {Range[-4, 6, 1], Range[-9, 1, 1], Range[-2, 8, 1]}, ImageSize -> 300};
BoundaryStyle
Use BoundaryStyle->{{1,2}->Directive[Red, Tube@@#&]}
(or BoundaryStyle -> {{1, 2} -> Directive[Red, # /. Line -> Tube &]}
) to make the boundary between the sphere and the plane rendered as a red tube.
cp = ContourPlot3D[{cf[x, y, z]== 25, y == 0}, {x, -4, 6}, {y, -9, 1}, {z, -2, 8},
ContourStyle -> {Directive[Blue, Opacity[0.5]], Directive[Pink, Opacity[0.5]]},
BoundaryStyle -> {1 -> None, 2 -> None, {1, 2} -> Directive[Red, Tube @@ # &]},
Mesh -> None, Evaluate@opts]

cp2 = ContourPlot3D[{y == 0}, {x, -4, 6}, {y, -9, 1}, {z, -2, 8},
ContourStyle ->None, Mesh -> {Range[-4, 6], Range[-9, 1], Range[-2, 8]}];
Show[cp, cp2]

MeshFunctions
cp3 = ContourPlot3D[cf[x, y, z] == 25, {x, -4, 6}, {y, -9, 1}, {z, -2, 8},
ContourStyle -> Opacity[.5, Blue],
MeshFunctions -> {Function[{x, y, z}, y]}, Mesh -> {{0}},
MeshStyle -> Directive[Red, Tube @@ # &], Evaluate@opts]
or MeshStyle -> Directive[Red, # /. Line -> Tube &]
, gives

cp4 = ContourPlot3D[{y == 0}, {x, -4, 6}, {y, -9, 1}, {z, -2, 8},
ContourStyle -> Opacity[.5, Red],
Mesh -> {Range[-4, 6], Range[-9, 1], Range[-2, 8]}];
Show[cp3, cp4]

Notes: Two undocumented tricks are used in the above methods.
The BoundaryStyle
trick first appeared on this site in this answer by Daniel Lichtblau linked by @Guesswhoitis in the comments. It also features a second undocumented trick: using functions as style directives. On this second trick see this page for relevant links.
Post-processing
Alternatively, you can post-process the ContourPlot3D
output to change Line
to Tube
.
ContourPlot3D[{cf[x, y, z] == 25, y == 0}, {x, -4, 6}, {y, -9, 1}, {z, -2, 8},
ContourStyle -> {Directive[Blue, Opacity[0.5]], Directive[Pink, Opacity[0.5]]},
Mesh -> None, BoundaryStyle -> {1 -> None, 2 -> None, {1, 2} -> Red},
Evaluate@opts] /. Line -> Tube
ContourPlot3D[cf[x, y, z] == 25, {x, -4, 6}, {y, -9, 1}, {z, -2, 8},
ContourStyle -> Opacity[.5, Blue], MeshFunctions -> {Function[{x, y, z}, y]},
Mesh -> {{0}}, MeshStyle -> Red, Evaluate@opts] /. Line -> Tube
to get the same pictures as above.
Update:
How would you use this code to make the tube larger?
This is easiest with the post-processing approach: simply change /. Line->Tube
to /. Line -> (Tube[#, .3]&)
.
With the first and second approaches, I expected that Directive[Red, Tube[#, .3]& @@ # &]
would work, but it doesn't. However, Directive[Red, Module[{tt = Tube[#, .3] &}, tt @@ # &]]
works. It seems that, somehow, with another layer of function evaluation it gets too deep for Directive
to process the primitive properly.
Alternatively, you can define a tube primitive function tubeF
outside, and use it inside Directive
:
ClearAll[tubeF]
tubeF[col_: Red, rad_: .1] := Module[{tf = Tube[#, rad] &}, Directive[col, tf @@ # &]];
Row[ContourPlot3D[{cf[x, y, z] == 25, y == 0}, {x, -4, 6}, {y, -9, 1}, {z, -2, 8},
ContourStyle -> {Directive[Blue, Opacity[0.5]], Directive[Pink, Opacity[0.5]]},
BoundaryStyle -> {1->None, 2->None, {1, 2}->#}, Mesh -> None, Evaluate@opts] & /@
{tubeF[], tubeF[Orange, .3], tubeF[Purple, .5]}]

Row[ContourPlot3D[cf[x, y, z] == 25, {x, -4, 6}, {y, -9, 1}, {z, -2, 8},
ContourStyle -> Opacity[.5, Blue], MeshFunctions -> {Function[{x, y, z}, y]},
Mesh -> {{0}}, MeshStyle -> #, Evaluate@opts] & /@
{tubeF[], tubeF[Orange, .3], tubeF[Purple, .5]}]
