ABCPABCMABCM

C
■チェバの三角形—cevian triangle 三角形 ABC とその
内側の点 P があたえられている。ここで三角形の頂点と点
P をとおる直線と三角形の辺との交点が cevian point で
cevian point をむすんでできる三角形を cevian triangle
M
という。
関数 point cevian (side side, point P )
cevian point をかえす。
B
A
関数 line cevian (vertex V, point P )
import geometry;
unitsize(1.2cm);
三角形の頂点 V と点 P をとおる直線をかえす。
関数 triangle cevian (triangle t, point P )
/* 三角形と点 M */
triangle t = triangle(3, 60, 4);
show(La="", Lb="", Lc="", t);
point M = (1.5, 1);
dot("$M$", M);
cevian triangle をかえす。
C
segment la = segment(pedal(t.BC, M));
segment lb = segment(pedal(t.CA, M));
segment lc = segment(pedal(t.AB, M));
draw(la^^lb^^lc, red+0.3+dashdotted);
P
triangle tp = pedal(t, M);
draw(tp, red+0.3+dashed);
B
A
/* 記号 */
perpendicularmark(t.BC, la, p=orange+0.3);
perpendicularmark(t.CA, lb, p=orange+0.3);
perpendicularmark(t.AB, lc, p=orange+0.3);
import geometry;
unitsize(1.2cm);
/* 三角形と点 P */
triangle t = triangle(3, 60, 4);
show(La="", Lb="", Lc="", t);
point P = (2, 1);
dot("P", P);
関数 triangle antipedal (triangle t, point M )
三角形 t を垂足三角形とする三角形をかえす。
C
/* cevian point */
point cAB = cevian(t.AB, P);
point cBC = cevian(t.BC, P);
point cCA = cevian(t.CA, P);
dot(cAB^^cBC^^cCA, fuchsia);
M
A
B
/* 頂点と点 P をとおる直線 */
segment cA = segment(cevian(t.VA, P));
segment cB = segment(cevian(t.VB, P));
segment cC = segment(cevian(t.VC, P));
draw(cA^^cB^^cC, fuchsia+dashdotted+0.3);
import geometry;
size(6cm);
/* cevian triangle */
triangle ct = cevian(t, P);
draw(ct, fuchsia+dashed+0.3);
/* 三角形と点 M */
triangle t = triangle(3,60,4);
show(La="", Lb="", Lc="", t);
point M = (1.5, 1);
dot("$M$", M);
addMargins(5mm, 5mm);
/* antipedal triangle */
triangle ta = antipedal(t, M);
draw(ta, red+0.3+dashed);
■垂足三角形—pedal triangle
/* 補助線 */
pen p1 = red+0.3+longdashdotted;
draw(M--t.A, p1);
draw(M--t.B, p1);
draw(M--t.C, p1);
markrightangle(M, t.A, ta.C, orange);
markrightangle(M, t.B, ta.A, orange);
markrightangle(M, t.C, ta.B, orange);
三角形の辺と点 M から辺
へのばした垂線との交点がある。この交点をむすんだ三角
形を垂足三角形(pedal triangle)という。
関数 line pedal (side side, point M )
点 M から side へのばした垂線をかえす。
関数 triangle pedal (triangle t, point M )
pedal triangle をかえす。
1
■類似重心—symmedian point
三角形の角の二等分線
■等角共役点—isogonal conjugate point 三角形 ABC の
(青色)を対象軸とする、中線(頂点とむかいあう辺の中点
内側に点 M があります。頂点 A と点 M をとおる直線と
をむすぶ直線、緑色)と対称な直線を類似中線(オレンジ
角 A の二等分線のなす角と直線 APa と角 A の二等分線
色)といい類似中線の交点が類似重心(symmedian point)
のなす角がひとしくなるように辺 BC 上に点 P a の位置を
なる。
きめます。このときの直線 APa が isogonal line です(三
関数 point symmedian (triangle t)
角形のほかの頂点についても同様に isogonal line をもと
symmedian point をかえす。
めることができます)。
関数 point symmedian (side side)
関数 point isogonal (side side, point M )
辺 side と類似中線の交点をかえす。
isogonal line と三角形の辺 side との交点をかえします。
関数 line symmedian (vertex V)
関数 line isogonal (vertex V, point M )
類似中線をかえす。
isogonal line をかえします。
関数 triangle symmedial (triangle t)
関数 triangle isogonal (trigonal t, point M )
それぞれの類似中線と辺との交点をむすんでできる三角
isogonal line と三角形の辺の交点はみっつあり、この三
形をかえす。
点をむすんだ三角形をかえす。
関数 point isogonalconjugate (trigonal t, point M )
C
三本の isogonal line は一点でまじわり、その交点(等角
共役点)をかえす。
C
Ma
B
A
M
Pa
import geometry;
unitsize(1.2cm);
A
/* 三角形 */
triangle t = triangle(3, 60, 4);
show(La="", Lb="", Lc="", t);
import geometry;
unitsize(1.2cm);
/* 三角形と点 M */
triangle t = triangle(3, 60, 4);
show(La="", Lb="", Lc="", t);
point M = (1, 0.8);
dot("$M$", M, N);
/* isogonal line と三角形の辺の交点 */
point Pc = isogonal(t.AB, M);
point Pa = isogonal(t.BC, M);
point Pb = isogonal(t.CA, M);
dot(Pa^^Pb^^Pc, blue);
/* isogonal line */
segment la = segment(isogonal(t.VA, M));
segment lb = segment(isogonal(t.VB, M));
segment lc = segment(isogonal(t.VC, M));
draw(la^^lb^^lc, blue+dashdotted+0.3);
/* isogonal triangle */
draw(isogonal(t, M), blue+dashed+0.3);
/* isogonal line の交点 */
dot(isogonalconjugate(t, M), blue);
/* 補助線など */
point Ma = cevian(t.BC, M);
segment cev = segment(cevian(t.VA, M));
line bis=bisector(t.VA);
dot("$M_a$", Ma, 2N, fuchsia);
label("$P_a$", Pa, 2E, blue);
draw(cev, fuchsia+0.3+dashdotted);
draw(segment(bis), orange+0.3);
markangle(Pa, t.A, Ma, radius=20mm, p=orange+0.3,
StickIntervalMarker(2,1,2mm,orange+0.3));
/* 中線(各辺の中点とむかいあう頂点をむすぶ直線) */
var ma = segment(median(t.VA));
var mb = segment(median(t.VB));
var mc = segment(median(t.VC));
draw(ma^^mb^^mc, green+0.3+longdashdotted);
/* 各頂角の二等分線 */
var ba = segment(bisector(t.VA));
var bb = segment(bisector(t.VB));
var bc = segment(bisector(t.VC));
draw(ba^^bb^^bc, blue+0.3+longdashdotted);
/* 類似中線(中線の二等分線に対して対象な直線) */
var sa = symmedian(t.VA);
var sb = symmedian(t.VB);
var sc = symmedian(t.VC);
draw(sa^^sb^^sc, orange);
/* 類似中線の交点が類似重心 */
dot(symmedian(t), orange);
dot(symmedian(t.AB), magenta);
draw(symmedial(t), magenta+0.3+dashed);
/* 参考 */
dot(centroid(t), green+2);
dot(incenter(t), blue+2);
B
// 重心
// 内心
addMargins(5mm, 5mm);
2
■等距離共役点—isotomic conjugate point 三角形 ABC
distance("$\ell$", t.B, cBC, offset=8mm,
p=0.8green, joinpen=0.8green+0.3);
とその内部の点 M があたえられている。頂点 A と点 M
をとおる直線と辺 BC との交点を Ma とする。このとき
addMargins(5mm, 5mm);
BPa のながさが CMa のながさとひとしくなるように辺
■ジュルゴンヌ点—gergonne point
BC 上に点 Pa の位置をきめる。そうしてできた直線 APa
三角形 ABC と内接
′
円の接点をむすんでできる三角形 A B ′ C ′ があります。こ
が isotomic line になる(三角形のほかの頂点についても
同様にして isotomic line がもとめられる)。
のとき直線 AA′ 、BB ′ 、CC ′ は一点でまじわり、この交点
関数 point isotomic (side side, point M )
を gergonne point という。
関数 point gergonne (triangle t )
isotomic line と辺 side との交点をかえす。
gergonne point をもとめます。
関数 line isotomic (vertex V, point M )
C
isotomic line をかえす。
関数 triangle isotomic (triangle t, point M )
isotomic line と三角形の辺との交点がみっつある。この
A′
B′
交点をむすんでできる三角形をかえす。
Ge
関数 point isotomicconjugate (triangle t, point M )
三本の isotomic line は一点でまじわる。この交点(等
距離共役点)をかえす。
A
C
B
ℓ
import geometry;
unitsize(1.2cm);
/* 三角形と点 M */
triangle t = triangle(3, 60, 4);
show(La="", Lb="", Lc="", t);
Ma
Pa
ℓ
M
C′
A
/* 内接円と内接三角形 */
circle ci = incircle(t);
triangle ti = intouch(t);
draw(ci, orange+0.3);
show(La="", Lb="", Lc="", LA="$A’$", LB="$B’$",
LC="$C’$", ti, p=orange+0.3);
B
import geometry;
unitsize(1.2cm);
/* gergonne point */
segment la = segment(t.A, ti.A);
segment lb = segment(t.B, ti.B);
segment lc = segment(t.C, ti.C);
draw(la^^lb^^lc, orange+0.3);
point Ge = gergonne(t);
dot("$Ge$", Ge, orange);
/* 三角形と点 M */
triangle t = triangle(3, 60, 4);
show(La="", Lb="", Lc="", t);
point M = (1, 0.7);
dot("$M$", M);
/* isotomic line と三角形の辺の交点 */
point cAB = isotomic(t.AB, M);
point cBC = isotomic(t.BC, M);
point cCA = isotomic(t.CA, M);
dot(cAB^^cBC^^cCA, blue);
/* isotomic line */
segment cA = segment(isotomic(t.VA, M));
segment cB = segment(isotomic(t.VB, M));
segment cC = segment(isotomic(t.VC, M));
draw(cA^^cB^^cC, blue+dashdotted+0.3);
/* isotomic triangle */
draw(isotomic(t, M), blue+dashed+0.3);
/* isotomic line の交点 */
dot(isotomicconjugate(t, M), blue);
/* 補助線など */
point Ma = cevian(t.BC, M);
dot("$M_a$", Ma, fuchsia);
label("$P_a$", cBC, blue, align=2N);
segment s = segment(cevian(t.VA, M));
draw(s, fuchsia+0.3+dashdotted);
distance("$\ell$", Ma, t.C, offset=8mm,
p=0.8green, joinpen=0.8green+0.3);
3
■inversion
inversion によって点 P を点 P ′ にうつしま
す。P Q は円の接線で点 Q から直線 CP におろした垂線
の足の位置が P ′ になります。
Q
k
C
P′
P
構造体 inversion は下のように定義されています。
import geometry;
size(6cm);
struct inversion {
point C;
// 円の中心
real k;
// 円の半径
void inversion_point (inversion inv, point P)
{
point iP = inv*P;
circle cir = (circle)inv;
line[] l = tangents(cir, P);
point[] T = intersectionpoints(cir, l[1]);
draw(P--T[0]--inv.C--cycle, orange+0.3);
draw(T[0]--iP, orange+dashed+0.3);
dot(P);
dot(iP, orange);
}
}
関数 inversion inversion (real k, point C )
関数 inversion inversion (point C, real k )
inversion のための円を定義します。
関 数 inversion inversion (circle c1, circle c2, real
/* inversion の設定 */
inversion inv = inversion(3, (-3,0));
draw((circle)inv, blue+0.3);
sgn=1 )
inversion を定義します。???
関数 inversion inversion (circle c1,circle c2,circle c3 )
/* もともとの図形 */
point[] P = {(0,-2),(0,0),(0,2),(0,3)};
circle C = circle((point)(0,-1), 1);
draw(C, linewidth(0.3));
line l = line(P[0], P[P.length-1]);
draw(l, linewidth(0.3));
inversion を定義します。???
関数 circle circle (inversion i )
関数 inversion inversion (circle c )
circle と inversion を変換します。
/* inversion 後の図形*/
draw(inv*C, magenta+1);
draw(inv*l, purple+1);
for (point a : P) {
inversion_point(inv, a);
}
addMargins(5mm, 5mm);
これらのほかに inversion から circle、circle から inver-
sion のキャストも定義されています。
演算子 point * (inversion i, point P )
inversion で点 P をうつします。
演算子 circle * (inversion i, line l )
inversion で直線 l をうつします。円になります。
演算子 circle * (inversion i, circle c )
inversion で円 c をうつします。別の円になります。
演算子 arc * (inversion i, segment s )
線分 s を inversion によって弧にします。
演算子 path * (inversion i, triagnle t )
三角形を inversion でうつします。
使用例
青い円が inversion で定義した円で、黒い直線が
紫の円にうつり、黒い円がマゼンタの円にうつります。ま
た直線上のいくつかの点も茶色の点にうつしています。こ
のときついでに inversion の円の接線などの補助線もかい
ています。
4
■三線座標—trilinear 三角形 ABC と点 P があり、この
b=t.beta()、c=t.gamma() のときは関数 f の引数は頂点
点 P から三角形の各辺に垂線をおろす。この垂線のなが
の角度になります。
さの比によって平面上の点の位置がきまる。この座標のあ
Xn
X1
X2
X3
X4
X5
らわしかたを三線座標といい a : b : c のようにかく(点 P
が三角形の内心側にあるときが正になる)。
C
center
内心 I
重心 G
外心 O
垂心 H
九点円の中
心N
A
b a
c P1
X6
X7
B
P2
類似重心 K
gergonne
point Ge
centerfunction
1
1/a, bc, csc A
cos A, a(b2 + c2 − a2 )
sec A
cos(B − C),
cos A + 2 cos B cos C,
[
]
bc a2 b2 + a2 c2 − (b2 − c2 )2
a, sin A
bc/(b + c − a), sec2 ( 12 A)
X7 以降もあります。triangle center function で検索して
みてください。
import geometry;
size(5cm);
pen pena = 0.3+longdashdotted;
こんなかんじでつかいます。
/* 内心 */
real x1 (real a, real b, real c) {
return 1;
}
/* 重心 */
real x2a (real a, real b, real c) {
return 1/a;
}
real x2b (real a, real b, real c) {
return b*c;
}
real x2c (real a, real b, real c) {
return csc(radians(a));
}
/* trilinear の定義 */
triangle t = triangle(3, 60, 4);
trilinear tr1=trilinear(t, x1);
trilinear tr2a=trilinear(t, x2a);
trilinear tr2b=trilinear(t, x2b);
trilinear tr2c=trilinear(t, x2c, a=t.alpha(),
b=t.beta(), c=t.gamma());
/* たしかめ */
write(point(tr1)==incenter(t)); //true と出力
write(point(tr2a)==centroid(t)); //true と出力
write(point(tr2b)==centroid(t)); //true と出力
write(point(tr2c)==centroid(t)); //true と出力
var t = triangle(3, 60, 4);
show(La="", Lb="", Lc="", t, linewidth(1));
draw(complementary(segment(t.BC)), pena);
draw(complementary(segment(t.CA)), pena);
draw(complementary(segment(t.AB)), pena);
trilinear tri1 = trilinear (t, 2, 1, 1);
trilinear tri2 = trilinear (t, 2, 1, -1);
point P1 = point(tri1);
point P2 = point(tri2);
dot("$P1$", P1);
dot("$P2$", P2);
segment s1a=segment(pedal(t.BC, P1)),
s1b=segment(pedal(t.CA, P1)),
s1c=segment(pedal(t.AB, P1));
draw(Label("$a$",Relative(0.5)), s1a,orange+pena);
draw(Label("$b$",Relative(0.5)), s1b,orange+pena);
draw(Label("$c$",Relative(0.5)), s1c,orange+pena);
segment s2a=segment(pedal(t.BC, P2)),
s2b=segment(pedal(t.CA, P2)),
s2c=segment(pedal(t.AB, P2));
draw(s2a^^s2b^^s2c, springgreen+pena);
addMargins(10mm, 5mm);
関数 point point (trilinear tri )
trilinear は下のような構造体で定義されています。
trilinear を point にする。
struct trilinear {
関数 void write (trilinear tri )
real a, b, c;
trilinear を標準出力に出力する。
triangle t;
三線座標であらわした重心など
}
辺のながさが a、b、c の
三角形 ABC の重心などは三線座標でこのようにあらわ
関数 trilinear trilinear (triangle t,real a,real b,real c)
せる。
三角形 t における三線座標 a : b : c を指定する。
関数 trilinear trilinear (triangle t, point M )
重心
三角形 t と point M で三線座標を指定する。
垂心
1 1 1
: :
a b c
sec A : sec B : sec C
関数 trilinear trilinear (triangle t, centerfunction f, real
外心
cos A : cos B : cos C
a=t.a(), real c=t.b(), real c=t.c() )
内心
1:1:1
傍心
−1 : 1 : 1,
類似重心
a: b: c
centerfunction f という関数によって内心や重心の三
線座標を指定します。引数 a=t.a()、b=t.b()、c=t.c() の
ときは関数 f の引数は辺のながさになり、a=t.alpha()、
5
1 : −1 : 1,
1 : 1 : −1
九点円 三角形 ABC があります。ここで L、N 、M は各
辺の中点、D 、E 、F は垂線の足、垂心を H としたときに
P は AH の中点、Q は BH の中点、R は CH の中点とす
ると、これら九つの点はある円の周上にあります。この円
を九点円といいます。九点円の中心は垂心 H と外心 O を
むすんだ線分の中点になり、九点円の直径は外接円の直径
の半分になります。
C
R
D
E
M
H
L
nine
P
A
O
F
N
Q
B
6