TEORİDEN UYGULAMAYA · PYTHON EŞLİKÇİSİ

Kesişim, Açı, Uzaklık ve Doğru Aileleri

Prof. Dr. Zühal Küçükarslan Yüzbaşı · Prof. Dr. Bahadır Yüzbaşı

Bölüm 06 · v1.0 · Türkçe

Bu bölümün laboratuvarı, kitaptaki örnekleri yeniden üretmek ve sayısal sonuçları incelemek için hazırlanmıştır. Matematiksel tanımlar, ispatlar ve sorular kitapta yer alır.

Laboratuvarı indir (.py) Tam Python paketi (.zip)

Laboratuvar kodu

"""Bölüm 6 laboratuvarı: iki ölçme ekseninin ilişkisi ve dikme ayağı.

Model düzlemsel ve sentetiktir. Bütün koordinatlar metre, açı çıktısı
derecedir. Yeryüzü eğriliği, projeksiyon ve ölçüm belirsizliği içermez.
"""

from __future__ import annotations

import numpy as np

from agbook import (
    canonical_array_sha256,
    line_angle,
    line_from_points,
    line_intersection_diagnostics,
    line_pencil_member,
    line_residuals,
    parallel_line_through_point,
    perpendicular_line_through_point,
    project_point_to_line,
)


def main() -> None:
    first_a = np.array([100.0, 200.0])  # metre
    first_b = np.array([500.0, 400.0])  # metre
    second_a = np.array([100.0, 500.0])  # metre
    second_b = np.array([500.0, 100.0])  # metre
    control = np.array([420.0, 320.0])  # metre

    first_line = line_from_points(first_a, first_b)
    second_line = line_from_points(second_a, second_b)
    relation = line_intersection_diagnostics(
        first_line,
        second_line,
        angular_tolerance=1.0e-12,
        absolute_tolerance=0.001,
        relative_tolerance=0.0,
        reference_scale=1000.0,
    )
    if relation.point is None:
        raise RuntimeError("Sentetik eksenlerin tek kesişim vermesi bekleniyordu.")

    projection = project_point_to_line(first_line, control)
    parallel = parallel_line_through_point(first_line, control)
    perpendicular = perpendicular_line_through_point(first_line, control)
    pencil = line_pencil_member(
        first_line,
        second_line,
        2.0,
        -1.0,
        angular_tolerance=1.0e-12,
    )
    intersection_residuals = line_residuals(
        np.array([1.0, 0.0, -relation.point[0]]),
        relation.point[None, :],
    )
    pencil_residual = line_residuals(pencil, relation.point[None, :])

    near_loose = line_intersection_diagnostics(
        [0.0, 1.0, 0.0],
        [1.0e-8, 1.0, -1.0],
        angular_tolerance=1.0e-7,
        absolute_tolerance=0.001,
        relative_tolerance=0.0,
        reference_scale=1.0,
    )
    near_strict = line_intersection_diagnostics(
        [0.0, 1.0, 0.0],
        [1.0e-8, 1.0, -1.0],
        angular_tolerance=1.0e-10,
        absolute_tolerance=0.001,
        relative_tolerance=0.0,
        reference_scale=1.0,
    )

    signature_values = np.concatenate(
        [first_line, second_line, relation.point, projection.foot, parallel, perpendicular]
    )
    print("birim: m")
    print("birinci_eksen:", np.round(first_line, 12))
    print("ikinci_eksen:", np.round(second_line, 12))
    print("iliski:", relation.relation)
    print("kesisim:", np.round(relation.point, 12))
    print("kesisim_artiklari:", np.format_float_scientific(np.max(np.abs(relation.residuals)), precision=3))
    print("kontrol_artigi:", np.format_float_scientific(np.max(np.abs(intersection_residuals)), precision=3))
    print("kucuk_aci_derece:", f"{np.degrees(line_angle(first_line, second_line)):.6f}")
    print("normal_matrisi_kosul_sayisi:", f"{relation.condition_number:.6f}")
    print("dikme_ayagi:", np.round(projection.foot, 12))
    print("isaretli_uzaklik_m:", f"{projection.signed_distance:.6f}")
    print("uzaklik_m:", f"{projection.distance:.6f}")
    print("ayak_denklem_artigi:", np.format_float_scientific(abs(projection.foot_residual), precision=3))
    print("ayak_diklik_artigi:", np.format_float_scientific(abs(projection.orthogonality_residual), precision=3))
    print("paralel_dogru:", np.round(parallel, 12))
    print("dik_dogru:", np.round(perpendicular, 12))
    print("demet_ortak_nokta_artigi:", np.format_float_scientific(abs(pencil_residual[0]), precision=3))
    print("yakin_paralel_gevsek_karar:", near_loose.relation)
    print("yakin_paralel_siki_karar:", near_strict.relation)
    print("yakin_paralel_kosul_sayisi:", f"{near_strict.condition_number:.6e}")
    print("bilimsel_imza:", canonical_array_sha256(signature_values))


if __name__ == "__main__":
    main()
Doğrulama çalıştırmasının çıktısı
birim: m
birinci_eksen: [  0.4472136   -0.89442719 134.16407865]
ikinci_eksen: [   0.70710678    0.70710678 -424.26406871]
iliski: intersecting
kesisim: [300. 300.]
kesisim_artiklari: 2.842e-14
kontrol_artigi: 0.e+00
kucuk_aci_derece: 71.565051
normal_matrisi_kosul_sayisi: 1.387426
dikme_ayagi: [404. 352.]
isaretli_uzaklik_m: 35.777088
uzaklik_m: 35.777088
ayak_denklem_artigi: 2.842e-14
ayak_diklik_artigi: 0.e+00
paralel_dogru: [ 0.4472136  -0.89442719 98.38699101]
dik_dogru: [ 8.94427191e-01  4.47213596e-01 -5.18767771e+02]
demet_ortak_nokta_artigi: 5.684e-14
yakin_paralel_gevsek_karar: parallel
yakin_paralel_siki_karar: intersecting
yakin_paralel_kosul_sayisi: 2.000000e+08
bilimsel_imza: c6a85c6f7707139d6a4d78f27cd652a5d755467d73a822ebab5149ffc892e8b8
Metindeki Python kodları

Kod dosyasını indir

# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Bölüm 6 laboratuvarı: ilişki, açı ve dikme ayağı ---
import numpy as np
from agbook import (
    line_angle,
    line_from_points,
    line_intersection_diagnostics,
    line_pencil_member,
    parallel_line_through_point,
    perpendicular_line_through_point,
    project_point_to_line,
)

A = np.array([100.0, 200.0])  # metre
B = np.array([500.0, 400.0])
C = np.array([100.0, 500.0])
D = np.array([500.0, 100.0])
P = np.array([420.0, 320.0])

first = line_from_points(A, B)
second = line_from_points(C, D)
relation = line_intersection_diagnostics(
    first,
    second,
    angular_tolerance=1.0e-12,
    absolute_tolerance=0.001,
    relative_tolerance=0.0,
    reference_scale=1000.0,
)
projection = project_point_to_line(first, P)
parallel = parallel_line_through_point(first, P)
perpendicular = perpendicular_line_through_point(first, P)
pencil = line_pencil_member(
    first, second, 2.0, -1.0,
    angular_tolerance=1.0e-12,
)

print("iliski:", relation.relation)
print("kesisim:", np.round(relation.point, 12))
print("kucuk_aci_derece:", f"{np.degrees(line_angle(first, second)):.6f}")
print("kosul_sayisi:", f"{relation.condition_number:.6f}")
print("dikme_ayagi:", np.round(projection.foot, 12))
print("uzaklik_m:", f"{projection.distance:.6f}")
print("ayak_artiklari:", projection.foot_residual,
      projection.orthogonality_residual)
print("paralel_dogru:", np.round(parallel, 12))
print("dik_dogru:", np.round(perpendicular, 12))

Kaydedilen çıktı

1. Bölüm 6 laboratuvarı: ilişki, açı ve dikme ayağı
iliski: intersecting
kesisim: [300. 300.]
kucuk_aci_derece: 71.565051
kosul_sayisi: 1.387426
dikme_ayagi: [404. 352.]
uzaklik_m: 35.777088
ayak_artiklari: 2.842170943040401e-14 0.0
paralel_dogru: [ 0.4472136  -0.89442719 98.38699101]
dik_dogru: [ 8.94427191e-01  4.47213596e-01 -5.18767771e+02]
Çözümlerdeki Python kodları

Kod dosyasını indir

# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Üç doğru ilişkisini sınıflandırma ---
import numpy as np
from agbook import line_intersection_diagnostics

pairs = {
    "kesisen": ([1.0, 1.0, -3.0], [1.0, -1.0, -1.0]),
    "ayri_paralel": ([1.0, 2.0, -3.0], [-2.0, -4.0, 10.0]),
    "cakisan": ([1.0, 2.0, -3.0], [-5.0, -10.0, 15.0]),
}
for name, (first, second) in pairs.items():
    result = line_intersection_diagnostics(
        first, second,
        angular_tolerance=1e-12,
        absolute_tolerance=1e-10,
        relative_tolerance=0.0,
        reference_scale=1.0,
    )
    print(name, result.relation)
    if result.point is not None:
        print(np.round(result.point, 12), result.residuals)

# --- 2. Yakın paralellik tablosu ---
import numpy as np
from agbook import line_angle, line_intersection_diagnostics

for k in (2, 4, 6, 8, 10):
    eps = 10.0 ** (-k)
    second = [eps, 1.0, -1.0]
    result = line_intersection_diagnostics(
        [0.0, 1.0, 0.0], second,
        angular_tolerance=0.0,
        absolute_tolerance=0.0,
        relative_tolerance=0.0,
        reference_scale=1.0,
    )
    print(k, np.degrees(line_angle([0, 1, 0], second)),
          result.condition_number, result.point[0])

# --- 3. Üç doğru için dikme ayağı denetimi ---
import numpy as np
from agbook import project_point_to_line

cases = (
    ([0.0, 1.0, -2.0], [3.0, 5.0]),
    ([1.0, 0.0, 4.0], [2.0, -1.0]),
    ([3.0, 4.0, -5.0], [4.0, 1.0]),
)
for line, point in cases:
    result = project_point_to_line(line, point)
    assert abs(result.foot_residual) < 1e-12
    assert abs(result.orthogonality_residual) < 1e-12
    print(np.round(result.foot, 12), result.distance)

# --- 4. Doğru demetinde ölçek değişmezliği ---
import numpy as np
from agbook import line_pencil_member

first = line_pencil_member(
    [1.0, 0.0, -1.0], [0.0, 1.0, -2.0],
    2.0, -3.0, angular_tolerance=1e-12,
)
second = line_pencil_member(
    [-7.0, 0.0, 7.0], [0.0, 5.0, -10.0],
    -20.0, 30.0, angular_tolerance=1e-12,
)
print(first)
print(second)
print(np.max(np.abs(first - second)))

Kaydedilen çıktı

1. Üç doğru ilişkisini sınıflandırma
kesisen intersecting
[2. 1.] [0. 0.]
ayri_paralel parallel
cakisan coincident

2. Yakın paralellik tablosu
2 0.5729386976834859 200.0049998750063 100.0
4 0.005729577932209639 20000.000050000002 9999.999999999998
6 5.729577951306322e-05 2000000.0000005 1000000.0
8 5.729577951308232e-07 199999999.99999997 100000000.0
10 5.729577951308233e-09 19999999999.999996 10000000000.0

3. Üç doğru için dikme ayağı denetimi
[3. 2.] 3.0
[-4. -1.] 6.0
[ 2.68 -0.76] 2.2

4. Doğru demetinde ölçek değişmezliği
[ 0.5547002  -0.83205029  1.10940039]
[ 0.5547002  -0.83205029  1.10940039]
0.0

Çalıştırma rehberi

Önce tam Python paketini indirin ve arşivi açın. Aşağıdaki komutları arşivin üst klasöründen başlatın. İlk kurulum internet bağlantısı ve Python 3.12 veya 3.13 gerektirir. Bağımlılıklar sabittir; sistem Python'unu değiştirmemek için ayrı sanal ortam kullanılır.

macOS / Linux
cd analitik-geometri-python-v1.0
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"
python labs/bolum_06_kesisim_aci_uzaklik.py
python -m pytest
Windows PowerShell
cd analitik-geometri-python-v1.0
py -3.13 -m venv .venv
.venv\Scripts\python.exe -m pip install -e ".[dev]"
.venv\Scripts\python.exe labs/bolum_06_kesisim_aci_uzaklik.py
.venv\Scripts\python.exe -m pytest

Laboratuvar dosyaları agbook yardımcı paketini kullanır; tek bir dosyayı indirmek paketi kurmanın yerini tutmaz. Metin/çözüm kodları kendi dosyaları içinde sırayla çalıştırılır; gizli bir notebook oturumu gerekmez. Son ondalık basamaklar platforma göre değişebilir.