%%%% braik_02.ldf %%%% Created by Laurence D. Finston (LDF) Sun Jul 1 15:09:15 CEST 2007 %%%% This file is part of GNU 3DLDF, a package for three-dimensional drawing. %%%% Copyright (C) 2007, 2008 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 3 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 %%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %%%% 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 %%%% GNU 3DLDF is a GNU package. %%%% It is part of the GNU Project of the %%%% Free Software Foundation %%%% and is published under the GNU General Public License. %%%% See the website http://www.gnu.org %%%% for more information. %%%% GNU 3DLDF is available for downloading from %%%% http://www.gnu.org/software/3dldf/LDF.html. %%%% It is also available from %%%% http://www.dante.de/software/ctan/, the Dante www-server %%%% and from http://wwwuser.gwdg.de/~lfinsto1, %%%% the author's website. %%%% Please send bug reports to lfinsto1@gwdg.de %%%% The mailing list help-3dldf@gnu.org is available for people to %%%% ask other users for help. %%%% The mailing list info-3dldf@gnu.org is for the maintainer of %%%% GNU 3DLDF to send announcements to users. %%%% To subscribe to these mailing lists, send an %%%% email with ``subscribe '' as the subject. %%%% The author can be contacted at: %%%% Laurence D. Finston %%%% c/o The Free Software Foundation, Inc. %%%% 51 Franklin St, Fifth Floor %%%% Boston, MA 02110-1301 %%%% USA %%%% lfinsto1@gwdg.de %%%% s246794@stud.uni-goettingen.de %% *** (3) Braikenridge-Maclaurin Construction. %% Constructing a conic section from 5 points. %% Example with parabola. %% LDF 2007.06.29. %% Run like this: %% 3dldf braik_02 %% mpost braik_02 %% tex braik_02.txt %% dvips -o braik_02.ps braik_02.dvi %% Create PostScript file %% ps2pdf braik_02.ps %% Create PDF file %% 3dldf braik_02; mpost braik_02; tex braik_02.txt; dvips -o braik_02.ps braik_02.dvi verbatim_metapost "verbatimtex \magnification=\magstep2 \font\small=cmr8 etex "; %% **** (4) Frame pen_width := .5mm; pickup pencircle scaled (pen_width, pen_width, pen_width); w := 16cm; h := 16cm; frame_w := w - .5pen_width; frame_h := h - .5pen_width; path frame; frame := origin -- (frame_w, 0) -- (frame_w, 0, frame_h) -- (0, 0, frame_h) -- cycle; shift frame (-.5frame_w, 0, -.5frame_h); %% **** (4) Declarations numeric i; numeric j; point A, B, C, D, E; %% The given points. point F; %% determined below. point p[]; point_vector pv; point X; point Y; point Z; path q[]; p0 := (5, 0); bool_point bp; pen dot_pen; dot_pen := pencircle scaled (1mm, 1mm); pen path_pen; path_pen := pencircle scaled (.7mm, .7mm); macro_vector mv; parabola prb; %% **** (4) Set parabola and initial points. set prb with_parameter 1 with_extent 12; shift prb (-5, 0); message "size prb"; show size prb; %% **** (4) def mv {numeric sstart, numeric ccount, boolean bbool, point aa, point bb, point cc, point dd, point ee} += j := 0; for i = (sstart + ccount - 1) downto sstart: beginfig(i); draw prb; dotlabel.bot("$A$", A); dotlabel.bot("$B$", B); dotlabel.lft("$C$", C); dotlabel.top("$D$", D); dotlabel.top("$E$", E); draw A -- C dashed evenly; draw B -- D dashed evenly; q0 := A -- C; q1 := B -- D; bp := (A -- C) intersection_point (B -- D); X := bp; dotlabel.top("$X$", X); draw A -- E dashed evenly; draw B -- E dashed evenly; Z := mediate(A, E, (j / 10.0)); j += 1; dotlabel.bot("$Z$", Z); bp := (X -- Z) intersection_point (B -- E); Y := bp; dotlabel.bot("$Y$", Y); %% **** (4) p0 := mediate (Z, X, 1.5); p1 := mediate (X, Z, 1.5); draw p0 -- p1 with_color green; bp := (C -- Y) intersection_point (D -- Z); F := bp; dotlabel.top("$F$", F); draw C -- F -- D with_color blue; %% **** (4) draw frame; label("{\small Copyright {\copyright} 2007, 2008 The Free Software Foundation}", (0, 0, -.5frame_h) shifted (0, 0, -.5cm)); endfig with_projection parallel_x_z; endfor; enddef; %% **** (4) Figure 0. A := get_point (20) prb; B := get_point (15) prb; C := get_point (8) prb; D := get_point (2) prb; E := get_point (24) prb; beginfig(0); draw prb; dotlabel.bot("$A$", A); dotlabel.bot("$B$", B); dotlabel.lft("$C$", C); dotlabel.top("$D$", D); dotlabel.top("$E$", E); draw A -- C dashed evenly; draw B -- D dashed evenly; q0 := A -- C; q1 := B -- D; bp := (A -- C) intersection_point (B -- D); X := bp; dotlabel.top("$X$", X); draw A -- E dashed evenly; draw B -- E dashed evenly; Z := mediate(A, E, (j / 10.0)); j += 1; dotlabel.bot("$Z$", Z); %% ***** (5) p0 := mediate (Z, X, 1.5); p1 := mediate (X, Z, 1.5); %draw p0 -- p1 with_color green; draw C -- E -- D with_color blue; %% **** (4) draw frame; label("{\small Copyright {\copyright} 2007, 2008 The Free Software Foundation}", (0, 0, -.5frame_h) shifted (0, 0, -.5cm)); endfig with_projection parallel_x_z; %% **** (4) Call macro. %% Points set above. Don't currently need to be set here. % A := get_point (20) prb; % B := get_point (15) prb; % C := get_point (8) prb; % D := get_point (2) prb; % E := get_point (24) prb; mv0 {1, 10, true, A, B, C, D, E}; E := get_point (20) prb; A := get_point (15) prb; B := get_point (8) prb; C := get_point (2) prb; D := get_point (24) prb; mv0 {11, 10, true, A, B, C, D, E}; D := get_point (20) prb; E := get_point (15) prb; A := get_point (8) prb; B := get_point (2) prb; C := get_point (24) prb; mv0 {21, 10, true, A, B, C, D, E}; C := get_point (20) prb; D := get_point (15) prb; E := get_point (8) prb; A := get_point (2) prb; B := get_point (24) prb; mv0 {31, 10, true, A, B, C, D, E}; %% **** (4) j := 0; for i = 40 upto 45: beginfig(i); draw prb; dotlabel.bot("$A$", A); dotlabel.bot("$B$", B); dotlabel.lft("$C$", C); dotlabel.top("$D$", D); dotlabel.top("$E$", E); draw A -- C dashed evenly; draw B -- D dashed evenly; q0 := A -- C; q1 := B -- D; bp := (A -- C) intersection_point (B -- D); X := bp; dotlabel.top("$X$", X); draw A -- E dashed evenly; draw B -- E dashed evenly; Z := mediate(A, E, (j / 10.0)); j += -1; dotlabel.bot("$Z$", Z); bp := (X -- Z) intersection_point (B -- E); Y := bp; dotlabel.bot("$Y$", Y); %% **** (4) p0 := mediate (Z, X, 1.1); p1 := mediate (X, Z, 1.1); draw p0 -- p1 with_color green; bp := (C -- Y) intersection_point (D -- Z); F := bp; dotlabel.top("$F$", F); draw C -- F -- D with_color blue; %% **** (4) draw frame; label("{\small Copyright {\copyright} 2007, 2008 The Free Software Foundation}", (0, 0, -.5frame_h) shifted (0, 0, -.5cm)); endfig with_projection parallel_x_z; endfor; verbatim_metapost "end"; end;