Re: Equation for Circle in 3-D surrounding Equilateral Triangle
- To: mathgroup at smc.vnet.net
- Subject: [mg2356] Re: [mg2321] Equation for Circle in 3-D surrounding Equilateral Triangle
- From: Preston Nichols <nichols at godel.math.cmu.edu>
- Date: Fri, 27 Oct 1995 01:49:42 -0400
John Duggan, duggan at ecs.umass.edu,Tue, 24 Oct 1995, wrote: "The question is: "Given three point at the intersection of the sides of an Equilateral triangle in 3D what is and how does one code Mathematica for the equation of the circle in 3D that contains all 3 points. I felt that the intersection of a sphere and a plane would solve the problem. But my mathematica coding appears to fall short for this." ----------------------------------------------------------- I'm not sure exactly what you are trying to get as a result, but the following might help. The steps below work for any triangle in 3-space, not only equilateral ones. (However, very thin triangles might lead to numerical trouble.) ----------------------------------------------------------- (* First, we gather some tools and set the initial data *) Needs["LinearAlgebra`Orthogonalization`"]; Needs["LinearAlgebra`CrossProduct`"]; norm[v_] := Sqrt[v.v]; p1 = { -0.256, -0.256, 3.423 }; p2 = {-3.206, 0.474, -2.690 }; p3 = {-6.532, 2.766, 2.769 }; (* Now get some vectors parallel to the sides, *) s1 := p2 - p1; s2 := p3 - p2; s3 := p1 - p3; (* and find the midpoints of the sides. *) m1 := p1 + s1/2; m2 := p2 + s2/2; m3 := p3 + s3/2; (* Acutally, s3 and m3 will not be needed. Note the use of := , which means that the si and mi will be automatically recomputed (when called) if the values of the pi are changed (i = 1,2,3). *) (* A useful fact from Euclid: in any triangle, the perpendicular bisectors (in the plane of the triangle) of the three sides all meet at a single point, and this point is equidistant from the three vertices. This point is called the circumcenter of the triangle, and it is the center of the circle we are seeking. If the triangle is `floating' in three dimensions, the perpendicular bisecting lines in the plane of the triangle are not as easy to get hold of as the orthogonal planes which bisect the sides. These three planes will intersect each other in a single line, orthogonal to the plane of the triangle, through the circumcenter. The equations of these planes are ({x,y,z} -m1).s1 == 0; ({x,y,z} -m2).s2 == 0; ({x,y,z} -m3).s3 == 0; because we can use s1, s2, and s3 as the normal vectors to the planes. To find the circumcenter we need to find the intersection of any two of these planes with the plane of the triangle, whose normal vector is: *) trianglenormal := Cross[s1,s2]; (* If we let triangleplane := ({x,y,z} - p1). trianglenormal == 0; midplane1 := ({x,y,z} -m1).s1 == 0; midplane2 := ({x,y,z} -m2).s2 == 0; we could use Solve[{triangleplane, midplane1, midplane2}, {x,y,z}] but it is more graceful and more efficient to use the following, which combines the equations for the three planes into a single system of linear equations: *) circumcenter := LinearSolve[{s1,s2, trianglenormal}, {m1.s1,m2.s2,p1. trianglenormal}]; (* So now we have the center of the desired circumscribed circle, and here's the radius: *) radius := norm[circumcenter-p1]; (* One of the best ways to represent curves such as a circle in 3-space is by a parametric equation. This will be easy if we can get a pair of orthonormal vectors parallel to the plane of the triangle. Fortunately, there's a neat trick in the LinearAlgebra`Orthogonalization` package: *) {v1,v2} = GramSchmidt[{s1,s2}]; (* The GramSchmidt process returns an orthonormal set of vectors with the same span as the vectors you give it. Thus {v1,v2} are a basis for the plane through the origin which is parallel to the plane of the triangle. Now we can parametrically plot the circle. *) Off[ParametricPlot3D::ppcom]; thecircle = ParametricPlot3D[ radius Cos[t] v1 + radius Sin[t] v2 + circumcenter, {t,0,2 Pi}]; (* To see why this works, think about what happens when v1 = {1,0,0}, v2 = {0,1,0}, circumcenter = {0,0,0}, and radius = anything. *) (* Finally, to check the result: *) thetriangle = Graphics3D[Polygon[{p1,p2,p3}]]; Show[{thetriangle, thecircle}]; ----------------------------------------------------------- Preston Nichols Department of Mathematics Carnegie Mellon University