\documentclass[border=10pt]{standalone}
\usepackage{asymptote}
\begin{document}
\begin{asy}[inline=true]
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();
\end{asy}
\end{document}Source: TeX.SE
See also: Original Source
Note: The copyright belongs to the blog author and the blog. For the license, please see the linked original source blog.
Leave a Reply
You must be logged in to post a comment.