Draw two perpendiculars (Metapost)

I call the rectangle vertices A, B, C, D (a, b, c and d in the MetaPost code). I also define points M' and N' so that the segments you are interested in are [MM'] and [NN'] (see the figure below). I propose two other techniques to draw these segments:

  1. Tell MetaPost that mprime lies on the (c,d) line and that (m,mprime) is parallel to (a,d):
    mprime = whatever[c,d];
    mprime - m = whatever*(d-a);
    
  2. Tell MetaPost that nprime lies on the (b,c) line and that (n,nprime) is perpendicular to (b,c):
    nprime = whatever[b,c];
    (nprime - n) dotprod (c-b) = 0;
    

I leave out the two double arrows from your figure, as they are irrelevant to the question. Here is a complete example showing the two ideas given above in action, and using a quartercircle of radius AM:

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}

\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
defaultfont := "texgyrepagella-regular*default" ;
defaultscale := 0.8 ;
pair a, b, c, d, m, n, mprime, nprime;
path rect, qcircle;
rect = unitsquare xscaled 4cm yscaled 2cm;

a = point 0 of rect;
b = point 1 of rect;
c = point 2 of rect;
d = point 3 of rect;

m = point 0.3 of rect;
qcircle = quartercircle scaled (2*abs(m-a));
n = rect intersectionpoint reverse(qcircle);

mprime = whatever[c,d];
nprime = whatever[b,c];
mprime - m = whatever*(d-a);    % declare parallelism
(nprime - n) dotprod (c-b) = 0; % declare perpendicularity

draw rect;
draw qcircle;
draw m -- mprime;
draw n -- nprime;

label.bot("$A$", a);
label.bot("$B$", b);
label.top("$C$", c);
label.top("$D$", d);
label.bot("$M$", m);
label.lft("$N$", n);
label.top("$M'$", mprime);
label.rt ("$N'$", nprime);

endfig;
\end{mplibcode}
\end{document}

screenshot


For interests sake, I tried to come up with a couple of additional options. Neither is particularly convenient, but if you're just learning metapost (like I am), then maybe something useful is in here.

Option 1:

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}

\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
    beginfig(0);
    defaultfont := "texgyrepagella-regular*default" ;
    defaultscale := 0.8 ;

    path p,q,r,s;
    picture pic;

    p = unitsquare xscaled 4cm yscaled 2cm;
    q = quartercircle scaled 2.4cm;
    z0 = p intersectionpoint q;
    % draw a big cross and chop off the portions outside of the rectangle.
    r:=(x0,0)--(x0,infinity) cutafter reverse p;
    s:=(0,x0)--(infinity,x0) cutafter p;

    draw p;
    draw q;
    draw s;
    draw r;

    label.bot("M",z0);
    label.lft("N",(0,x0));
    label.llft("O",origin);
    label.bot("x",.5[origin,z0]);
    label.bot("B", point 1 of p);
    endfig;
\end{mplibcode}
\end{document}

Option 2:

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}

\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
    beginfig(0);
    defaultfont := "texgyrepagella-regular*default" ;
    defaultscale := 0.8 ;

    path p,q,r;
    picture pic;
    p = unitsquare xscaled 4cm yscaled 2cm;
    q = quartercircle scaled 2.4cm;

    z0 = p intersectionpoint q;
    r = (x0,-infinity)--(x0,infinity);
    % store big cross
    pic := image(
        draw r;
        draw r rotated 90;
    );
    % and chop off portion outside of the rectangles bounding box.
    % this was unexpected, the bounding box provides extra space, so didn't clip exactly.
    begingroup;
    interim bboxmargin := 0;
    clip pic to bbox p;
    endgroup;

    draw pic;
    draw p;
    draw q;

    label.bot("M",z0);
    label.lft("N",(0,x0));
    label.llft("O",origin);
    label.bot("x",.5[origin,z0]);
    label.bot("B", point 1 of p);
endfig;
\end{mplibcode}
\end{document}

enter image description here

Tags:

Metapost