구글 클래스룸
GeoGebra지오지브라 클래스룸

Sphere & Elliptical intersection by opening angles and radius

An ellipse can be warped to lay on the surface of a sphere by intersecting a sphere of radius r with an elliptical cone with an opening angle of along one axis and along a perpendicular axis. Using a single  value as the opening angle specification, the elliptic cone equation is .

phi as a Function of theta

is changing as changes so find .  Starting with the elliptic cone equation try to derive the function. multiplying by gives . expand to giving dividing both sides by gives using the spherical coordinate relations for find that and so then solving for cleanup to get to get and finally

General Parametric Equations in Terms of a, b, tan(Phi) and r

In the general case for given  where  is the cone angle at the major axis, we have Note that with the above function for will give terms of the form which is just similarly is making the parameterized functions and the y function is then and the z function is .

The Relative Value of a and b

The major and minor (semi- technically) axis values and which could be defined to be canonical values at altitude , are not independently significant to the character of an elliptic cone. The major opening angle and minor opening angle are constants of the elliptic cone and their ratio specifies the ratio of to . The equations are more cleanly written in terms of which is also . (Note that the opening angle we have been writing is also the major opening angle in the two opening angle discussion . At some point it seems like a good idea to characterize the elliptic cone by the two constants that characterize it in the original discussion.) The ratio improved equations are Note they all have a common denominator 

Sanity Check, a=b should revert to circular cone

Expect to get back the circular cone sphere intersection curve functions when . Recall that those functions are parametric flat circle at altitude Z.          for parameter . A flat circle with radius at altitude . The elliptic functions are   and          Setting (and )       similarly    and   Sanity check passed.

Eccentricity, Second and First

Use the second eccentricity and the trigonometric identity to simplify the elliptic cone and intersection curve expressions. By the way, the first eccentricity is defined by and shows up in the analogous derivation for the elliptic cone when done along the minor axis instead of the major axis shown above. The resulting parametric functions, which are equivalent, involve parameters and instead of and . The major and minor opening angles, and respectively, fundamentally characterize an elliptic cone. The eccentricities can easily be obtained using and .

Applet

The functions above are deployed in the applet below and full page in https://www.geogebra.org/3d/p2dfmdg4 . - The black curve line is the ellipse warped to the surface of a sphere - Slider j represents the major axis opening angle - Slider n represents the minor axis opening angle - Slider r represents the radius of the sphere

Implemented as Unity3D specific C# code

This could be implemented in any 3D rendering engine. If this was implemented in code for Unity 3D it could look as follows: using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// Projects an outline of an angle from the center of a sphere to its surface. /// The angle is a cone (or elliptic cone) intersecting with the spheres surface. /// [RequireComponent(typeof(LineRenderer))] public class AngleSphereIntersection : MonoBehaviour { // Number of sides of the polygon representing the warped ellipse. Bigger numbers for less jagged. private const int positionCount = 0x100; [Tooltip("The ellipse will be drawn on the surface of a sphere, this defines the size of that sphere")] [Range(0, 2f)] public float radius = 1f; [Tooltip("Angle from the center of the ellipse to its radius's as seen by the center of the sphere")] [Range(1f, 89f)] public float angleXAxis = 45, angleYAxis = 45; [Tooltip("Component that will house the vertices and handle rendering")] public LineRenderer lineRenderer; private void Start() { OnValidate(); } private void OnValidate() { DrawEllipse(); } /// /// Set the points of a LineRenderer to follow the path of a sphere and elliptical cone intersection /// private void DrawEllipse() { float xAxisRadians = angleXAxis * Mathf.Deg2Rad; float yAxisRadians = angleYAxis * Mathf.Deg2Rad; float currentStep = 0; // what step we are on going around the ellipse of intersection Vector3 v; // Shared denominator function of the sphere and elliptical cone intersection. float tanX = Mathf.Tan(xAxisRadians); float tanX2 = Mathf.Pow(tanX, 2) + 1; float abRatio = Mathf.Pow(tanX / Mathf.Tan(yAxisRadians), 2) - 1; System.Func denominator = step => Mathf.Sqrt(tanX2 + abRatio * Mathf.Pow(Mathf.Sin(step), 2)); // coefficients for the axes the ellipses opens along float sideAxis = radius * Mathf.Tan(xAxisRadians); // find the intersection as per https://www.geogebra.org/m/p2dfmdg4 float centerStep; for(int i = 0; i < positionCount; ++i) { currentStep = Mathf.Lerp(0, 2 * Mathf.PI, (float)i / positionCount); // determine position of next point v.x = sideAxis * Mathf.Cos(currentStep) / denominator(currentStep); v.y = sideAxis * Mathf.Sin(currentStep) / denominator(currentStep); centerStep = Mathf.Sqrt(1 + abRatio * Mathf.Pow(Mathf.Sin(currentStep), 2)); v.z = radius * centerStep / denominator(currentStep); // apply position to the lineRenderer lineRenderer.SetPosition(i, v); } } }