Technology

chứng minh đường trung bình song song với cạnh đáy

chứng minh đường trung bình song song với cạnh đáy | SiamCafe Blog
2025-06-28· อ. บอม — SiamCafe.net· 1,639 คำ

การพิสูจน์เส้นตรงขนานกับฐาน — ทฤษฎีเส้นกึ่งกลางสามเหลี่ยม

ทฤษฎีเส้นกึ่งกลางสามเหลี่ยม (Midsegment Theorem) เป็นทฤษฎีบทสำคัญในเรขาคณิตที่ระบุว่า เส้นที่ลากเชื่อมจุดกึ่งกลางของด้านสองด้านของสามเหลี่ยม จะขนานกับด้านที่สาม (ฐาน) และมีความยาวเท่ากับครึ่งหนึ่งของด้านฐาน บทความนี้อธิบายการพิสูจน์ทั้งแบบ Euclidean geometry และ coordinate geometry พร้อม Python code สำหรับตรวจสอบและ visualize ทฤษฎีบท รวมถึงการประยุกต์ใช้ในงาน computational geometry และ computer graphics

ทฤษฎีเส้นกึ่งกลางสามเหลี่ยม

# midsegment.py — Midsegment Theorem
import json

class MidsegmentTheorem:
    THEOREM = {
        "name": "Midsegment Theorem (ทฤษฎีเส้นกึ่งกลาง)",
        "statement": "ถ้า M เป็นจุดกึ่งกลางของ AB และ N เป็นจุดกึ่งกลางของ AC แล้ว MN // BC และ MN = BC/2",
        "conditions": "M = midpoint(A, B), N = midpoint(A, C)",
        "conclusions": ["MN ขนานกับ BC (MN // BC)", "MN = BC / 2"],
    }

    PROOF_EUCLIDEAN = """
    การพิสูจน์แบบ Euclidean:
    
    กำหนดให้ สามเหลี่ยม ABC
    M = จุดกึ่งกลางของ AB
    N = จุดกึ่งกลางของ AC
    
    พิสูจน์: MN // BC และ MN = BC/2
    
    วิธีที่ 1: ใช้สามเหลี่ยมคล้าย (Similar Triangles)
    
    1. เนื่องจาก AM/AB = AN/AC = 1/2
    2. และมุม A เป็นมุมร่วม (∠MAN = ∠BAC)
    3. ดังนั้น △AMN ~ △ABC (SAS Similarity)
    4. อัตราส่วนคล้าย = 1/2
    5. จาก similarity: ∠AMN = ∠ABC
    6. เนื่องจาก ∠AMN = ∠ABC (corresponding angles)
       และ MN ตัดกับ AB (transversal)
    7. ดังนั้น MN // BC (เส้นตรงสองเส้นทำมุม
       corresponding angles เท่ากัน = ขนาน)
    8. จาก similarity ratio: MN/BC = 1/2
       ดังนั้น MN = BC/2  ∎
    """

    PROOF_COORDINATE = """
    การพิสูจน์แบบ Coordinate Geometry:
    
    กำหนดจุด: A(x1, y1), B(x2, y2), C(x3, y3)
    
    M = midpoint(A, B) = ((x1+x2)/2, (y1+y2)/2)
    N = midpoint(A, C) = ((x1+x3)/2, (y1+y3)/2)
    
    พิสูจน์ MN // BC:
    
    slope(MN) = (yN - yM) / (xN - xM)
             = ((y1+y3)/2 - (y1+y2)/2) / ((x1+x3)/2 - (x1+x2)/2)
             = (y3 - y2) / (x3 - x2)
    
    slope(BC) = (y3 - y2) / (x3 - x2)
    
    slope(MN) = slope(BC)  →  MN // BC  ∎
    
    พิสูจน์ MN = BC/2:
    
    |MN| = sqrt((xN-xM)² + (yN-yM)²)
         = sqrt(((x3-x2)/2)² + ((y3-y2)/2)²)
         = (1/2) × sqrt((x3-x2)² + (y3-y2)²)
         = (1/2) × |BC|  ∎
    """

    def show_theorem(self):
        print("=== Midsegment Theorem ===\n")
        print(f"  {self.THEOREM['statement']}")
        for c in self.THEOREM['conclusions']:
            print(f"  → {c}")

    def show_euclidean(self):
        print(f"\n=== Euclidean Proof ===")
        print(self.PROOF_EUCLIDEAN[:500])

    def show_coordinate(self):
        print(f"\n=== Coordinate Proof ===")
        print(self.PROOF_COORDINATE[:500])

thm = MidsegmentTheorem()
thm.show_theorem()
thm.show_euclidean()
thm.show_coordinate()

Python Verification

# verify.py — Python verification of Midsegment Theorem
import json
import math
import random

class MidsegmentVerification:
    def midpoint(self, p1, p2):
        return ((p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2)
    
    def distance(self, p1, p2):
        return math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)
    
    def slope(self, p1, p2):
        dx = p2[0] - p1[0]
        if abs(dx) < 1e-10:
            return float('inf')
        return (p2[1] - p1[1]) / dx
    
    def is_parallel(self, p1, p2, p3, p4, tol=1e-9):
        s1 = self.slope(p1, p2)
        s2 = self.slope(p3, p4)
        if s1 == float('inf') and s2 == float('inf'):
            return True
        return abs(s1 - s2) < tol
    
    def verify_theorem(self, A, B, C):
        M = self.midpoint(A, B)
        N = self.midpoint(A, C)
        
        parallel = self.is_parallel(M, N, B, C)
        mn_length = self.distance(M, N)
        bc_length = self.distance(B, C)
        half_check = abs(mn_length - bc_length / 2) < 1e-9
        
        return {
            "A": A, "B": B, "C": C,
            "M (midpoint AB)": M,
            "N (midpoint AC)": N,
            "MN // BC": parallel,
            "MN = BC/2": half_check,
            "|MN|": round(mn_length, 4),
            "|BC|": round(bc_length, 4),
            "|BC|/2": round(bc_length / 2, 4),
        }
    
    def random_test(self, n=5):
        print("=== Random Triangle Verification ===\n")
        for i in range(n):
            A = (random.uniform(-10, 10), random.uniform(-10, 10))
            B = (random.uniform(-10, 10), random.uniform(-10, 10))
            C = (random.uniform(-10, 10), random.uniform(-10, 10))
            
            result = self.verify_theorem(A, B, C)
            status = "PASS" if result["MN // BC"] and result["MN = BC/2"] else "FAIL"
            print(f"  Test {i+1}: [{status}] |MN|={result['|MN|']} = |BC|/2={result['|BC|/2|']}" if '|BC|/2|' in result else f"  Test {i+1}: [{status}] |MN|={result['|MN|']} = |BC|/2={result['|BC|/2']}")
        print(f"\n  All tests should PASS — theorem holds for any triangle")

verify = MidsegmentVerification()
result = verify.verify_theorem((0, 0), (6, 0), (3, 8))
print("=== Specific Example ===")
print(f"  Triangle: A(0,0) B(6,0) C(3,8)")
print(f"  M(midpoint AB) = {result['M (midpoint AB)']}")
print(f"  N(midpoint AC) = {result['N (midpoint AC)']}")
print(f"  MN // BC: {result['MN // BC']}")
print(f"  MN = BC/2: {result['MN = BC/2']}")
print(f"  |MN| = {result['|MN|']}, |BC|/2 = {result['|BC|/2']}")

Visualization

# visualize.py — Matplotlib visualization
import json

class MidsegmentVisualization:
    CODE = """
# plot_midsegment.py — Visualize Midsegment Theorem
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import numpy as np

def plot_midsegment(A, B, C):
    M = ((A[0]+B[0])/2, (A[1]+B[1])/2)
    N = ((A[0]+C[0])/2, (A[1]+C[1])/2)
    
    fig, ax = plt.subplots(1, 1, figsize=(8, 6))
    
    # Draw triangle
    triangle = plt.Polygon([A, B, C], fill=False, edgecolor='blue', linewidth=2)
    ax.add_patch(triangle)
    
    # Draw midsegment MN
    ax.plot([M[0], N[0]], [M[1], N[1]], 'r-', linewidth=2, label='MN (midsegment)')
    
    # Draw base BC
    ax.plot([B[0], C[0]], [B[1], C[1]], 'b-', linewidth=2, label='BC (base)')
    
    # Mark points
    for point, label in [(A, 'A'), (B, 'B'), (C, 'C'), (M, 'M'), (N, 'N')]:
        ax.plot(*point, 'ko', markersize=8)
        ax.annotate(label, point, textcoords="offset points", 
                   xytext=(10, 10), fontsize=14, fontweight='bold')
    
    # Add parallel markers
    ax.annotate('MN // BC', xy=(0.5, 0.95), xycoords='axes fraction',
               fontsize=12, ha='center', color='red')
    
    mn_len = np.sqrt((N[0]-M[0])**2 + (N[1]-M[1])**2)
    bc_len = np.sqrt((C[0]-B[0])**2 + (C[1]-B[1])**2)
    ax.annotate(f'|MN| = {mn_len:.2f} = |BC|/2 = {bc_len/2:.2f}',
               xy=(0.5, 0.9), xycoords='axes fraction', fontsize=11, ha='center')
    
    ax.set_aspect('equal')
    ax.legend()
    ax.set_title('Midsegment Theorem: MN // BC, MN = BC/2')
    ax.grid(True, alpha=0.3)
    plt.tight_layout()
    plt.savefig('midsegment.png', dpi=150)
    plt.show()

plot_midsegment((0, 0), (8, 0), (3, 6))
"""

    def show_code(self):
        print("=== Matplotlib Visualization ===")
        print(self.CODE[:600])

    def ascii_visualization(self):
        print(f"\n=== ASCII Visualization ===")
        print("""
              A
             /\\
            /  \\
           /    \\
       M  /------\\  N     ← MN (midsegment)
         /   //   \\
        /   //     \\
       /   //       \\
      B--------------C     ← BC (base)
      
      MN // BC  (ขนาน)
      |MN| = |BC| / 2
        """)

vis = MidsegmentVisualization()
vis.show_code()
vis.ascii_visualization()

ทฤษฎีบทที่เกี่ยวข้อง

# related.py — Related theorems
import json

class RelatedTheorems:
    THEOREMS = {
        "basic_proportionality": {
            "name": "Basic Proportionality Theorem (Thales)",
            "statement": "ถ้าเส้นตรงขนานกับด้านหนึ่งของสามเหลี่ยม ตัดด้านอีกสองด้าน จะแบ่งด้านทั้งสองในอัตราส่วนเท่ากัน",
            "formula": "DE // BC → AD/DB = AE/EC",
        },
        "converse_bpt": {
            "name": "Converse of BPT",
            "statement": "ถ้าเส้นตรงแบ่งด้านสองด้านของสามเหลี่ยมในอัตราส่วนเท่ากัน แล้วเส้นนั้นขนานกับด้านที่สาม",
            "formula": "AD/DB = AE/EC → DE // BC",
        },
        "similar_triangles": {
            "name": "Similar Triangles (สามเหลี่ยมคล้าย)",
            "statement": "สามเหลี่ยมสองรูปที่มีมุมเท่ากัน 2 คู่ จะคล้ายกัน",
            "criteria": ["AA (Angle-Angle)", "SAS (Side-Angle-Side ratio)", "SSS (Side-Side-Side ratio)"],
        },
        "triangle_inequality": {
            "name": "Triangle Inequality",
            "statement": "ผลบวกของด้านสองด้านใดๆ ของสามเหลี่ยม ต้องมากกว่าด้านที่เหลือ",
            "formula": "a + b > c, b + c > a, a + c > b",
        },
    }

    APPLICATIONS = {
        "cg": {
            "name": "Computational Geometry",
            "use": "Mesh subdivision, Level of Detail (LOD), triangle mesh simplification",
        },
        "cad": {
            "name": "CAD/Engineering",
            "use": "Structural analysis, parallel beam verification, truss design",
        },
        "graphics": {
            "name": "Computer Graphics",
            "use": "Texture mapping, polygon clipping, barycentric coordinates",
        },
        "robotics": {
            "name": "Robotics/Navigation",
            "use": "Path planning, parallel trajectory verification, obstacle avoidance",
        },
    }

    def show_theorems(self):
        print("=== Related Theorems ===\n")
        for key, thm in self.THEOREMS.items():
            print(f"[{thm['name']}]")
            print(f"  {thm['statement']}")
            print()

    def show_applications(self):
        print("=== Applications ===")
        for key, app in self.APPLICATIONS.items():
            print(f"  [{app['name']}] {app['use']}")

related = RelatedTheorems()
related.show_theorems()
related.show_applications()

Computational Geometry Library

# geometry_lib.py — Computational geometry library
import json
import math

class GeometryLib:
    CODE = """
# triangle_lib.py — Triangle geometry library
import math

class Triangle:
    def __init__(self, A, B, C):
        self.A = A
        self.B = B
        self.C = C
    
    def midpoint(self, p1, p2):
        return ((p1[0]+p2[0])/2, (p1[1]+p2[1])/2)
    
    def distance(self, p1, p2):
        return math.sqrt((p2[0]-p1[0])**2 + (p2[1]-p1[1])**2)
    
    def area(self):
        # Shoelace formula
        x1, y1 = self.A
        x2, y2 = self.B
        x3, y3 = self.C
        return abs((x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2)) / 2)
    
    def perimeter(self):
        return (self.distance(self.A, self.B) + 
                self.distance(self.B, self.C) + 
                self.distance(self.A, self.C))
    
    def centroid(self):
        return ((self.A[0]+self.B[0]+self.C[0])/3,
                (self.A[1]+self.B[1]+self.C[1])/3)
    
    def midsegments(self):
        M_AB = self.midpoint(self.A, self.B)
        M_BC = self.midpoint(self.B, self.C)
        M_AC = self.midpoint(self.A, self.C)
        return {
            "MN (AB-AC midpoints)": (M_AB, M_AC),  # parallel to BC
            "MP (AB-BC midpoints)": (M_AB, M_BC),  # parallel to AC
            "NP (AC-BC midpoints)": (M_AC, M_BC),  # parallel to AB
        }
    
    def medial_triangle(self):
        M_AB = self.midpoint(self.A, self.B)
        M_BC = self.midpoint(self.B, self.C)
        M_AC = self.midpoint(self.A, self.C)
        return Triangle(M_AB, M_BC, M_AC)

# Usage
t = Triangle((0, 0), (8, 0), (4, 6))
print(f"Area: {t.area()}")
print(f"Perimeter: {t.perimeter():.2f}")
print(f"Centroid: {t.centroid()}")
medial = t.medial_triangle()
print(f"Medial triangle area: {medial.area()} = original/4: {t.area()/4}")
"""

    def show_code(self):
        print("=== Triangle Geometry Library ===")
        print(self.CODE[:600])

    def demo(self):
        print(f"\n=== Demo ===")
        A, B, C = (0, 0), (8, 0), (4, 6)
        area = abs((A[0]*(B[1]-C[1]) + B[0]*(C[1]-A[1]) + C[0]*(A[1]-B[1])) / 2)
        M_AB = ((A[0]+B[0])/2, (A[1]+B[1])/2)
        M_AC = ((A[0]+C[0])/2, (A[1]+C[1])/2)
        mn = math.sqrt((M_AC[0]-M_AB[0])**2 + (M_AC[1]-M_AB[1])**2)
        bc = math.sqrt((C[0]-B[0])**2 + (C[1]-B[1])**2)
        print(f"  Triangle A(0,0) B(8,0) C(4,6)")
        print(f"  Area = {area}")
        print(f"  M(midpoint AB) = {M_AB}")
        print(f"  N(midpoint AC) = {M_AC}")
        print(f"  |MN| = {mn:.4f}")
        print(f"  |BC|/2 = {bc/2:.4f}")
        print(f"  MN = BC/2: {abs(mn - bc/2) < 1e-9}")

lib = GeometryLib()
lib.show_code()
lib.demo()

FAQ - คำถามที่พบบ่อย

Q: ทฤษฎีเส้นกึ่งกลาง (Midsegment Theorem) คืออะไร?

A: เส้นที่ลากเชื่อมจุดกึ่งกลางของด้านสองด้านของสามเหลี่ยม จะขนานกับด้านที่สาม (ฐาน) และมีความยาวเท่ากับครึ่งหนึ่งของฐาน ใช้ได้กับสามเหลี่ยมทุกรูป ไม่ว่าจะเป็นสามเหลี่ยมด้านเท่า ด้านไม่เท่า หรือมุมฉาก

Q: พิสูจน์ได้กี่วิธี?

A: หลายวิธี: 1) สามเหลี่ยมคล้าย (Similar Triangles) — ง่ายที่สุด ใช้ SAS similarity 2) Coordinate Geometry — ใช้สูตร midpoint + slope 3) Vector Proof — ใช้ vector addition 4) Transformation — ใช้ dilation จาก A ด้วย scale 1/2 แต่ละวิธีให้ข้อมูลเชิงลึกต่างกัน

Q: Midsegment ใช้ทำอะไรในโปรแกรม?

A: Computational Geometry: mesh subdivision, triangle mesh simplification Computer Graphics: LOD (Level of Detail) — ลด polygon count โดยใช้ midsegments CAD: structural analysis, parallel beam verification Game Development: collision detection optimization, terrain generation Robotics: path planning, trajectory analysis

Q: Medial Triangle คืออะไร?

A: Medial Triangle เกิดจากการเชื่อมจุดกึ่งกลางทั้ง 3 ด้านของสามเหลี่ยม คุณสมบัติ: 1) มี 4 สามเหลี่ยมย่อยที่ congruent กัน 2) พื้นที่ medial triangle = 1/4 ของสามเหลี่ยมเดิม 3) ด้านทุกด้านของ medial triangle ขนานกับด้านของสามเหลี่ยมเดิม

📖 บทความที่เกี่ยวข้อง

cách chứng minh đường trung bình trong tam giácอ่านบทความ → chứng minh đường trung bìnhอ่านบทความ → đường trung bình bằng 1/2 cạnh đáyอ่านบทความ → cách chứng minh đường trung bìnhอ่านบทความ → cách chứng minh đường trung bình của tam giácอ่านบทความ →

📚 ดูบทความทั้งหมด →