Edit: More accurate Arc
instead of arc
:
Compass-straight-edge (no atan
-s) imitated with Asymptote
:
// tri.asy :
// To get standalone tri.pdf, run:
// asy -f pdf tri.asy
size(200);
import graph;
import fontsize;
defaultpen(fontsize(9pt));
pen linepen=deepblue+1.2bp;
pen xlinepen=red+1.2bp;
pen arcpen=gray+0.4bp;
real a=6, b=7, c=8; real x;
pair B=(0,0);
pair C=(a,0);
guide barc=Arc(C,b,90,120);
guide carc=Arc(B,c,50,70);
pair A=intersectionpoint(carc,barc);
draw(A--B--C--cycle,linepen);
draw(barc,arcpen);
draw(carc,arcpen);
draw(Arc(A,arcpoint(A--B,1),arcpoint(A--C,1)));
pair Cp=(A+b*W);
draw(A--Cp,arcpen);
guide bparc=Arc(Cp,a,50,90);
guide cparc=Arc(A,c,120,160);
pair Bp=intersectionpoint(cparc,bparc);
draw(bparc,arcpen);
draw(cparc,arcpen);
draw(A--Bp--Cp);
pair D=extension(Bp,A,B,C);
draw(Arc(A,arcpoint(A--Bp,1),arcpoint(A--Cp,1)));
draw(Arc(D,arcpoint(D--A,1),arcpoint(D--B,1)));
draw(C--D--A,xlinepen);
label("$A$",A,N);
label("$B$",B,NW);
label("$C$",C,NE);
label("$D$",D,NE);
label("$B^\prime$",Bp,N);
label("$C^\prime$",Cp,NW);
label(string(a),B--C,S);
label(string(b),C--A,W);
label(string(c),A--B,NW);
x=round(arclength(C--D)*1e4)/1e4;
label("$x\approx"+string(x)+"$",C--D,S);
dot(new pair[]{A,B,C,D,Bp,Cp},UnFill);
Edit2:
A more detailed version, now just the two ancient instruments and a sheet of paper.
// tri.asy :
// To get standalone tri.pdf, run:
// asy -f pdf tri.asy
size(200);
import graph;
import math;
import fontsize;
defaultpen(fontsize(9pt));
real w=1.2bp;
pen BCpen=red+w;
pen ACpen=deepgreen+w;
pen ABpen=blue+w;
pen ADpen=pink+w;
pen linepen=deepblue+w;
pen xlinepen=orange+w;
pen arcpen=gray+0.4bp;
pen anglepen=black+0.4bp;
real a=6, b=7, c=8; real x;
real r;
pair p,q,t;
guide gp,gq;
pair A,B,C,D,Ap,Bp,Cp;
pair H4,H2,H1;
srand(12345);
// Step 1. Select two arbitrary points A and B on the sheet
A=rotate(unitrand()*60+30)*E;
B=(0,0);
// and connect them with a line AB using straight-edge:
guide AB=A--B;
draw(AB,ABpen);
real ticksize=arclength(AB)/32;
// Step 2. Split the line AB in two by drawing the two arcs from the endpoints
// and the line throught the two intersections
r=arclength(AB);
gp=Arc(A,r,-60,-40);
gq=Arc(B,r,0,20);
draw(gp,arcpen); draw(gq,arcpen);
p=intersectionpoint(gp,gq);
gp=Arc(A,r,180,220);
gq=Arc(B,r,120,150);
draw(gp,arcpen); draw(gq,arcpen);
q=intersectionpoint(gp,gq);
H4=intersectionpoint(p--q,AB);
draw(arcpoint(H4--p,ticksize)--arcpoint(H4--q,ticksize),arcpen);
// Step 3. Similarly, split BH4 in two:
r=arclength(B--H4);
gp=Arc(H4,r,-60,-40);
gq=Arc(B,r,0,20);
draw(gp,arcpen); draw(gq,arcpen);
p=intersectionpoint(gp,gq);
gp=Arc(H4,r,180,220);
gq=Arc(B,r,120,150);
draw(gp,arcpen); draw(gq,arcpen);
q=intersectionpoint(gp,gq);
H2=intersectionpoint(p--q,AB);
draw(arcpoint(H2--p,ticksize)--arcpoint(H2--q,ticksize),arcpen);
// Step 4. Similarly, split BH2 in two:
r=arclength(B--H2);
gp=Arc(H2,r,-60,-40);
gq=Arc(B,r,0,20);
draw(gp,arcpen); draw(gq,arcpen);
p=intersectionpoint(gp,gq);
gp=Arc(H2,r,180,220);
gq=Arc(B,r,120,150);
draw(gp,arcpen); draw(gq,arcpen);
q=intersectionpoint(gp,gq);
H1=intersectionpoint(p--q,AB);
draw(arcpoint(H1--p,ticksize)--arcpoint(H1--q,ticksize),arcpen);
// At this point we have all measures ready: AB=8, AH1=7, AH2=6
// Step 5. Construct point C
r=arclength(A--H1);
gp=Arc(A,r,-65,-55);
r=arclength(A--H2);
gq=Arc(B,r,10,20);
draw(gp,arcpen); draw(gq,arcpen);
C=intersectionpoint(gp,gq);
draw(B--C,BCpen);
draw(A--C,ACpen);
draw(Arc(A,H1,C),arcpen);
// Step 6. Construct a line AA' || BC
r=arclength(A--C);
gp=Arc(B,r,110,130);
r=arclength(B--C);
gq=Arc(A,r,180,200);
draw(gp,arcpen); draw(gq,arcpen);
Ap=intersectionpoint(gp,gq);
draw(B--Ap,arcpen);
drawline(A,Ap,arcpen);
// Step 7. Consrtuct point C' on AB'
r=arclength(A--C);
gp=Arc(A,r,180,240);
Cp=intersectionpoint(A--(2Ap-A),gp);
// Step 8. Consrtuct point B'
r=arclength(A--B);
gp=Arc(A,r,140,160);
r=arclength(B--C);
gq=Arc(Cp,r,70,100);
draw(gp,arcpen); draw(gq,arcpen);
Bp=intersectionpoint(gp,gq);
draw(A--Bp,ABpen);
draw(A--Cp,ACpen);
draw(Bp--Cp,BCpen);
// Step 9. Finally, construct point D
D=extension(Bp,A,B,C);
draw(C--D,xlinepen);
draw(A--D,ADpen);
// ==========================
// mark angles
draw(arc(A,arcpoint(AB,arclength(B--H1)),C),anglepen);
draw(arc(A,arcpoint(A--Bp,arclength(B--H1)),Cp),anglepen);
draw(arc(D,arcpoint(D--A,arclength(B--H1)),C),anglepen);
label("$A$",A,N);
label("$B$",B,NW);
label("$C$",C,SE);
label("$D$",D,E);
label("$H_4$",H4,NW);
label("$H_2$",H2,NW);
label("$H_1$",H1,NW);
label("$A^\prime$",Ap,N);
label("$B^\prime$",Bp,N);
label("$C^\prime$",Cp,SW+S);
dot(new pair[]{A,B,C,D,H4,H2,H1,Ap,Bp,Cp},UnFill);
Edit-3
Great thanks to @Andrew Stacey for pointing out in a comment
that it is not allowed to transfer lengths from one place to another.
This update fixes this by constructing additional points.
// compass.asy :
// To get standalone compass.pdf, run:
// asy -f pdf compass.asy
import math;
import graph;
struct construct{
pair[] loc;
string[] name;
pair[] namePos;
guide[] straight;
pen[] straightPen;
guide[] circ;
pen[] circPen;
pen thinpen;
bool pqr(pair p, pair q, pair r){
return (p.x*(q.y-r.y)+(r.y-p.y)*q.x+r.x*(p.y-q.y))>0;
};
pair lastpoint(){
assert(loc.length>0);
return loc[loc.length-1];
}
pair prevpoint(){
assert(loc.length>1);
return loc[loc.length-2];
}
pair newpoint(pair ploc, string pname="", pair npos=(0,0)){
loc.push(ploc);
name.push(pname);
namePos.push(npos);
return loc[loc.length-1];
}
guide newstraight(pair A, pair B, pen p=nullpen){
straight.push(A--B);
straightPen.push(p);
return straight[straight.length-1];
}
guide newcirc(pair A,pair B, pen p=nullpen){
circ.push(Circle(A,arclength(A--B)));
circPen.push(p);
return circ[circ.length-1];
}
pair halve(pair A, pair B, string pname="", pair npos=(0,0)){
guide p,q;
pair[] xpt;
p=newcirc(A,B,thinpen);
q=newcirc(B,A,thinpen);
xpt=intersectionpoints(p,q);
newpoint(xpt[0]);
newpoint(xpt[1]);
newstraight(lastpoint(),prevpoint(),thinpen);
newpoint(extension(A,B,xpt[0],xpt[1]),pname,npos);
return lastpoint();
}
pair leftPoint(pair A1, pair B1, pair A2, pair B2, string pname="", pair npos=(0,0)){
guide p,q;
pair[] xpts;
p=newcirc(A1,B1,thinpen);
q=newcirc(A2,B2,thinpen);
xpts=intersectionpoints(p,q);
newpoint((pqr(A1,A2,xpts[0]))?xpts[0]:xpts[1],pname,npos);
return lastpoint();
}
pair rightPoint(pair A1, pair B1, pair A2, pair B2, string pname="", pair npos=(0,0)){
guide p,q;
pair[] xpts;
p=newcirc(A1,B1,thinpen);
q=newcirc(A2,B2,thinpen);
xpts=intersectionpoints(p,q);
newpoint((pqr(A1,A2,xpts[0]))?xpts[1]:xpts[0],pname,npos);
return lastpoint();
}
pair at_dist(pair A, pair B, pair C, string pname="", pair npos=(0,0)){
newcirc(A,C,thinpen);
newpoint(A+dir(B-A)*arclength(A--C),pname,npos);
return lastpoint();
}
void showStraights(){
for(int i=0;i<straight.length;++i){
draw(straight[i],straightPen[i]);
}
}
void showCircs(){
for(int i=0;i<circ.length;++i){
draw(circ[i],circPen[i]);
}
}
void showDots(){
for(int i=0;i<loc.length;++i){
dot(loc[i],UnFill);
}
}
void showLabels(){
for(int i=0;i<loc.length;++i){
label("$"+name[i]+"$",loc[i],namePos[i]);
}
}
void operator init(pen thinpen=gray+0.3bp){
this.loc=new pair[];
this.name=new string[];
this.namePos=new pair[];
this.thinpen=thinpen;
}
}
//=================================
size(250);
import graph;
import math;
import fontsize;
defaultpen(fontsize(9pt));
real w=1.2bp;
pen ABpen=blue+w;
pen BCpen=red+w;
pen ACpen=deepgreen+w;
pen ADpen=gray(0.4)+w;
pen CDpen=orange+w;
pen thinpen=gray+0.4bp;
pen arcpen=black+w;
construct ABCD=construct();
// Construct two arbitrary points A and B
pair A=ABCD.newpoint((1,5),"A",NE);
pair B=ABCD.newpoint((0,0),"B",S);
// Construct measuring marks on AB, assuming |AB|=8
pair H4=ABCD.halve(A, B,"_4",SE);
pair H2=ABCD.halve(B,H4,"_2",SE);
pair H1=ABCD.halve(B,H2,"_1",SE);
pair H6=ABCD.halve(A,H4,"_6",SE);
pair H7=ABCD.halve(H6,A,"_7",SE);
// Construct point C: |AH1|=7, |BH6|=6
pair C=ABCD.leftPoint(A,H1,B,H6,"C",SE);
// Construct A' as a point of untersection of Circle(B,|BH7|) and Circle(A,|AH2|)
pair Ap=ABCD.leftPoint(B,H7,A,H2,"A^\prime",N);
// Construct C' as a point of untersection of the line through AA' and a Circle(A,|AC|)
pair Cp=ABCD.at_dist(A,Ap,C,"C^\prime",S);
// Construct Q6 as a point of untersection of the line through AC' and a Circle(A,|AH7|)
pair Q6=ABCD.at_dist(A,Cp,H7,"_6",NW);
// Construct B' as a point of untersection of Circle(C',|C'Q6|) and Circle(A,|AB|)
pair Bp=ABCD.leftPoint(Cp,Q6,A,B,"B^\prime",NE);
// Construct D as a point of untersection of the line through B',A and the line through B,C
pair D=ABCD.newpoint(extension(Bp,A,B,C),"D",S);
ABCD.showStraights();
ABCD.showCircs();
// draw helper lines
draw(Ap--B,thinpen);
drawline(A,Ap,thinpen);
drawline(B,C,thinpen);
// mark angles
draw(arc(A,arcpoint(A--B,arclength(B--H1)),C),arcpen);
draw(arc(A,arcpoint(A--Bp,arclength(B--H1)),Cp),arcpen);
draw(arc(D,arcpoint(D--A,arclength(B--H1)),C),arcpen);
// draw sides
draw(A--B,ABpen);
draw(A--Bp,ABpen);
draw(A--C,ACpen);
draw(A--Cp,ACpen);
draw(B--C,BCpen);
draw(Bp--Cp,BCpen);
draw(A--D,ADpen);
draw(C--D,CDpen);
ABCD.showDots();
ABCD.showLabels();
Best Answer
Since you have already created these images, you just need to include them in your document. Make sure that the bounding box around the images are tight, otherwise you'll end up with too much white space around them.
To include the image, use
in your document preamble, together with commands like
where your buttons are exported from Adobe Illustrator as
LMB.pdf
andRMB.pdf
(if you're using PDFLaTeX.The above commands allow you to use
\LMB
and\RMB
in your text, and prints the images at 80% of the baseline height. Depending on your usage, you may want to also include thexspace
package and insert\xspace
after each command. That would ease your use of\LMB
/\RMB
without having to always add a control space\
after it.