How do you draw the tangent to the incircle that is parallel to BC that is located inside the triangle? Also, how do you locate the other intersection of $I_AX$ and the circle (basically the southern-most point)? My progress is shown below, and any help would be appreciated.

    pair A=(2,8), B=(0,0), C=(10,0);
    pair I = incenter(A, B, C);
    pair D = foot(I, B, C);
    draw(excircle(C,B,A), dashed);
    label("$A$", (2,8),N);
    label("$B$", B, dir(180));
    label("$C$", C, NE);
    label("$D$", D, dir(250));
    label("$I$", I, dir(330));
    triangle t=triangle(A,B,C);
    point I_A = excenter(t.BC);
    pair X = foot(I_A, C,B);
    label("$X$", X, dir(45));
    pair K = foot(A,B,C);
    label("$K$", K, dir(250));
    label("$M$", (2,4), 1.2*dir(240));

enter image description here

The desired image is shown below. enter image description here

  • it would be easier to help if you added a handrawn sketch of the desired end result – js bibra Jul 12 at 4:54
  • Alright, I did it. – djdumpling Jul 12 at 14:39
  • what about tikz-euclide solution – js bibra Jul 12 at 16:14
  • Please, give a fully compilable code. – AndréC Jul 12 at 16:15
  • there are two triangles with two excircles -- ABC with excircle I_A and the smaller triangle with common vertex at A with excircle I – js bibra Jul 12 at 16:32

Plain Metapost is also rather good at this sort of construction. There are very few built-in geometrical macros, like Asymptote's incircle, but it is not hard to find simple constructions using the tools such as whatever and intersectionpoint that I show below. I have included what I hope are some useful comments.

enter image description here

This is wrapped up in luamplib so you can compile it with lualatex to produce a PDF directly.

    pair A, B, C, D, E, F, G, I, J, K, M, N, P;

    % define the three triangle points
    A = (40, 160);
    B = origin;
    C = (200, 0);

    % incenter is the intersection of two internal angle bisectors
    I = whatever [A, A + unitvector(B-A) + unitvector(C-A)]
      = whatever [B, B + unitvector(A-B) + unitvector(C-B)];

    % outcenters are the intersection of one internal angle bisector and one external
    J = whatever [A, A + unitvector(B-A) + unitvector(C-A)]
      = whatever [B, B - unitvector(A-B) + unitvector(C-B)];
    % this is the standard idiom to find closest point on 
    % a line to a point not on the line
    D = whatever [B, C]; I - D = whatever * (B-C) rotated 90;
    E = whatever [B, C]; J - E = whatever * (B-C) rotated 90;

    path incircle, excircle;
    incircle = fullcircle scaled 2 abs (I-D) shifted I;
    excircle = fullcircle scaled 2 abs (J-E) shifted J;

    draw incircle;
    draw excircle;

    % these were the first two points the OP wanted
    % "intersectionpoint" gives the pair were two lines intersect
    F = (A--B) intersectionpoint ((B--C) rotatedabout(I, 180));
    G = (A--C) intersectionpoint ((B--C) rotatedabout(I, 180));
    N = D rotatedabout(I, 180);

    % same idiom as above to find the pedal point of A
    K = whatever [B, C]; A - K = whatever * (B-C) rotated 90;

    % another way to find an intersection points 
    % even when you need to extend the lines to get the intersection
    % but will not work if the four points are co-linear
    M = whatever [E, I] = whatever [D, J];

    % this is the second point the OP wanted
    P = E rotatedabout(J, 180);

    % now draw some of the lines
    draw A -- J withcolor 2/3[blue, green];
    draw E -- M -- J withcolor 1/2 red;

    % mark right angle...
    draw unitsquare scaled 4 rotated angle (A-K) shifted K withcolor 1/2 white;
    draw A--K withcolor 1/2 white; 
    draw A--P withcolor 1/2 white; 
    draw D--N withcolor 1/2[blue, white];
    draw E--P withcolor 1/2[blue, white];

    draw A -- 2.4[A,B];
    draw A -- 2.1[A,C];
    draw B--C;
    draw F--G;

    % and label the points
    interim dotlabeldiam := 2;
    dotlabel.top ("$A$", A);
    dotlabel.ulft("$B$", B);
    dotlabel.urt ("$C$", C);
    dotlabel.urt ("$D$", D);
    dotlabel.urt ("$E$", E);
    dotlabel.ulft("$F$", F);
    dotlabel.urt ("$G$", G);
    dotlabel.urt ("$I$", I);
    dotlabel.urt ("$J_A$", J);
    dotlabel.bot ("$K$", K);
    dotlabel.lft ("$M$", M);
    dotlabel.bot ("$P$", P);



  • I have used whatever in several places here -- it's a very useful feature of MP's "declarative" equations. Basically whatever stands for whatever ever value you need there; MP's equation engine will work out the exact value required. Each whatever is different of course. If you need to know the actual value used, just replace whatever with a new undefined numeric variable, and MP will set it to the required value.

  • A--B gives a path from A to B. A-B gives a pair that represents the vector to A starting at B.

  • The "mediation" syntax finds a point part of the way from one point to another. So 1/2[A, B] is the mid point, while 1[A, B] is B, and 2[A, B] is some way beyond B in the same direction...

| improve this answer | |

Your code does not compile. It seems that there is a mix of geometry.asy and some private command (such foot of three pair). Moreover dot("$A$",A,N) is shorter that dot(A) + label("$A$",N)

I rewrite (even the code is not perfect) with geometry.asy which provides a large 2D geometry functions.

import geometry;

point A=(2,8), B=(0,0), C=(10,0);
triangle tABC=triangle(A,B,C);
pair I = incenter(A, B, C);
pair D = intouch(tABC.BC);
draw(excircle(C,B,A), dashed);

point I_A = excenter(tABC.BC);

point X = projection(line(B,C))*I_A;


pair K = foot(tABC.VA);
point M=intersectionpoint(line(I_A,D),line(X,I));

// first way intersection of the lines XI_A and excircle
//pair[] T=intersectionpoints(line(X,I_A),excircle(C,B,A));
//point pN= T[0]; // could be T[1] it is possible to make a test with B to choose the right point

//second way : symmetry of center I_A applied to M
//point pN=I_A+(I_A-X);
//second way with geometry
point pN=scale(-1,I_A)*X;

// for F and G many possibilities (see N)
line d=parallel(I+(I-D),line(B,C));
point F=intersectionpoint(d,line(A,C));
point G=intersectionpoint(d,line(A,B));

dot("$B$", B, dir(180));
dot("$A$", (2,8),N);
dot("$C$", C, NE);
dot("$D$", D, dir(250));
dot("$I$", I, dir(330));
dot("$X$", X, dir(45));
dot("$K$", K, dir(250));
dot("$M$", (2,4), 1.2*dir(240));

Here I use triangle structure (from geometry documentation)

  • if t is a triangle, t.AB is a side (t.BC, etc), t.VA is a vertex
  • incenter(triangle) : return the center of the incircle of the triangle
  • intouch(side): return the contact point of the sidesidewith the incircle to whichsiderefers.

As in Metapost solution, it is not difficult to compute the coordinates of the desired point (N in my picture). You have many solutions : intersectionpoint of the circle and the line, rotation, vector addition, scaling with coefficient equal to -1.

enter image description here

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.