X179¶
1st AJIMA-MALFATTI POINT
The famous Malfatti Problem is to construct three circles O(A), O(B), O(C) inside ABC such that each is externally tangent to the other two, O(A) is tangent to lines AB and AC, O(B) is tangent to BC and BA, and O(C) is tangent to CA and CB. Let A' = O(B)∩O(C), B' = O(C)∩O(A), C' = O(A)∩O(B). The lines AA',BB',CC' concur in X179. Trilinears are found in Yff’s unpublished notes. See also the Yff-Malfatti Point, X400, having trilinears \(\csc^{4}(A/4)\) : \(\csc^{4}(B/4)\) : \(\csc^{4}(C/4)\), and the references for historical notes.
X179 (1st AJIMA-MALFATTI POINT) constructed on acute reference triangle \((a, b, c) = (5, 6, 7)\) with unit baseline AB = \(1\).¶
"""GEOMETOR construction model for X_179 = 1st AJIMA-MALFATTI POINT."""
from __future__ import annotations
from pathlib import Path
import sympy.geometry as spg
from geometor.model import Model
from geometor.etc.ops import (
central_line,
construct_baseline_triangle,
create_model,
eval_trilinear_point,
incenter_of,
promote_point_to_top,
)
from geometor.etc.render import write_center_svg
def construct_x_00179(
model: Model, A: spg.Point, B: spg.Point, C: spg.Point
) -> spg.Point:
"""Construct X_179 = 1st AJIMA-MALFATTI POINT on reference triangle ABC."""
X_179 = eval_trilinear_point(model, A, B, C, '(sec(A/4))**(4)', ID="X_179", classes=["selected", "target"])
X_1 = incenter_of(model, A, B, C, ID="X_1", classes=["center", "incident"])
X_1142 = eval_trilinear_point(model, A, B, C, '(1 - 2*(1 + cos(B/2))*(1 + cos(C/2))/(1 + cos(A/2)))', ID="X_1142", classes=["center", "incident"])
central_line(model, X_1, X_1142, 1, 1142, incident=True)
return promote_point_to_top(model, X_179)
def build_model(
sides: tuple[float, float, float] = (5.0, 6.0, 7.0),
show_guides: bool = False,
) -> Model:
"""Build a `geometor.model.Model` for X_179 on the given reference triangle."""
model = create_model('X_179 = 1st AJIMA-MALFATTI POINT')
A, B, C = construct_baseline_triangle(model, *sides, show_guides=show_guides)
construct_x_00179(model, A, B, C)
return model
if __name__ == "__main__":
here = Path(__file__).resolve().parent
model_acute = build_model((5.0, 6.0, 7.0))
model_acute.save(str(here / "x-00179.json"))
write_center_svg(
model_acute,
here / "x-00179.svg",
subtitle="(a, b, c) = (5, 6, 7) | AB = 1",
)