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
© Copyright 2024 ExpyDoc