[metapost] Constructing ellipse from 4 points

Laurence Finston lfinsto1 at gwdg.de
Wed Nov 2 22:37:26 CET 2005

On Wed, 2 Nov 2005, Brooks Moses wrote:

> > >    http://steiner.math.nthu.edu.tw/ne01/whw/Ellipse1/part2.htm

This page has a little movie that demonstrates the ruler-and-compass
construction, but there's no explanation.  The library system here
doesn't list the reference, T.H. Eagle, _Constructive Geometry For
Plane Curves_, but I've ordered a couple of other books in the field.

> > >    http://mathworld.wolfram.com/ConicSection.html
> > >    http://mathworld.wolfram.com/Ellipse.html

There's a lot of information on these pages, but no constructions
are given, unless I missed them.

> >I can get more points by finding the intersections of the plane with more
> >of the ellipses on the ellipsoid, and I can get as many of those as I
> >want.
> Ah, indeed.  Now I'm wondering if the best option might not be to do that
> in a general way,

I've attached a PostScript file with an illustration of an ellipsoid
and a square, with red dots where a selection of ellipses intersects
the plane of the square.  I've also attached the 3DLDF code.

> then take the derivative of the distance between the
> points,

Could you explain this?  I'm only familiar with derivatives of functions,
but I haven't taken a derivative since my college days.

> and thus find the maximum distance -- and thereby find the major
> axis of the ellipse, assuming the equations are tractable.

You mean algebraically, don't you?  I'm afraid I don't have a clue
of how to go about doing this.

I thought about looking for the maximum distance from a selection of
points, and then using binary search to find the maximum in the
neighborhood of my first approximation.  The problem is, I would have to
generate an ellipse and transform it at least once for every try.
I do something similar, but which doesn't require quite so much work,
to find the intersection points of two coplanar ellipses.  Someone
explained a better way to do this to me, but it involves mathematical
concepts that I (still) don't understand.  Given a choice, I'd almost
always rather solve problems like this algebraically.

Thanks again for your help.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: ellpln01.ps.gz
Type: application/octet-stream
Size: 194691 bytes
Url : http://tug.org/pipermail/metapost/attachments/20051102/7cb9bfa1/ellpln01.ps-0001.obj
-------------- next part --------------
%%%% ellpln01.ldf
%%%% Created by Laurence D. Finston (LDF) Wed Nov  2 22:11:38 CET 2005

%% * (1) Copyright and License.

%%%% This file is part of GNU 3DLDF, a package for three-dimensional drawing. 
%%%% Copyright (C) 2003, 2004, 2005 The Free Software Foundation 

%%%% GNU 3DLDF is free software; you can redistribute it and/or modify 
%%%% it under the terms of the GNU General Public License as published by 
%%%% the Free Software Foundation; either version 2 of the License, or 
%%%% (at your option) any later version. 

%%%% GNU 3DLDF is distributed in the hope that it will be useful, 
%%%% but WITHOUT ANY WARRANTY; without even the implied warranty of 
%%%% GNU General Public License for more details. 

%%%% You should have received a copy of the GNU General Public License 
%%%% along with GNU 3DLDF; if not, write to the Free Software 
%%%% Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA


%% * (1) The intersection of an `ellipsoid' and a `plane'.
%%          The figure formed is an `ellipse'.
%%          LDF 2005.11.02.

verbatim_metapost "verbatimtex  \magnification=\magstep3 \font\large=cmr17 etex";

picture save_picture;

focus f;

set f with_position (-1, 5, -20) with_direction (-1, 5, 10) 
      with_distance 20;

ellipsoid e;
set e with_center (0, 0, 0) with_axis_x 15 with_axis_y 8 with_axis_z 10
      with_divisions_x 16 with_divisions_y 16 with_divisions_z 2
      with_point_count 64;

rotate e (0, 15, 0);
shift e (-1, -1, 3);

ellipse g;

rectangle r;
r := unit_rectangle scaled 15;

rotate r (0, 15, 45);
shift r by 1;

path_vector pv;

%% ***** (5) Figure 1.


   draw r with_color blue;
   draw e;
   string s;

   pickup pencircle scaled (1.5mm, 1.5mm);

   bool_point_vector bpv;

   point pt;

   e_size := size e;

   for i = 0 upto e_size - 1:
   g := get_ellipse (i) e;
       bpv := g intersection_points r;
       	 for j = 0 upto size bpv - 1:
            pt := bpv[j];
            if pt is_on_ellipse g:
               drawdot bpv[j] with_color red;
         clear bpv;

   save_picture := current_picture;
   output current_picture with_focus f no_sort;   

   clear current_picture;

   label("{\large Perspective}", (2, -15));

endfig with_projection parallel_x_y;

%% ***** (5) 

output save_picture with_projection parallel_x_y;  
label("{\large X-Y}", (0, -10));
endfig with_projection parallel_x_y;

%% ***** (5) 

output save_picture with_projection parallel_x_z;  
label("{\large X-Z}", (0, -10));
endfig with_projection parallel_x_y;

%% ***** (5) 

output save_picture with_projection parallel_z_y;  
label("{\large Z-Y}", (0, -10));
endfig with_projection parallel_x_y;

verbatim_metapost "end";


More information about the metapost mailing list