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

Determinant, Alan ve Yönelim

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

Bölüm 03 · 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 3 laboratuvarı: sıralı güvenlik bölgesinin alanı ve yönelimi."""

from __future__ import annotations

import numpy as np
from sympy import Matrix

from agbook import (
    determinant_2d,
    orientation_diagnostics,
    polygon_area,
    polygon_signed_area,
    triangle_area,
)


boundary = np.array(
    [
        [0.0, 0.0],
        [6.0, 0.0],
        [7.0, 3.0],
        [4.5, 5.0],
        [1.0, 4.0],
    ]
)
tolerance = 1.0e-10

signed_area = polygon_signed_area(boundary)
area = polygon_area(boundary)
fan_area = sum(triangle_area(boundary[0], boundary[i], boundary[i + 1]) for i in range(1, len(boundary) - 1))
first_turn = orientation_diagnostics(*boundary[:3], relative_tolerance=tolerance)
reversed_area = polygon_signed_area(boundary[::-1])
translated_area = polygon_signed_area(boundary + np.array([1.0e9, -2.0e9]))

linear_map = np.array([[1.2, 0.3], [-0.2, 0.8]])
mapped = boundary @ linear_map.T
area_scale = determinant_2d(linear_map[:, 0], linear_map[:, 1])
mapped_ratio = polygon_area(mapped) / area

near = np.array([[0.0, 0.0], [1.0e8, 1.0e8], [2.0e8, 2.0e8 + 1.0]])
near_result = orientation_diagnostics(*near, relative_tolerance=1.0e-8)
exact_double_area = Matrix(
    [
        [100000000, 100000000],
        [200000000, 200000001],
    ]
).det()

print(f"yonlu_alan_m2: {signed_area:.6f}")
print(f"alan_m2: {area:.6f}")
print(f"ilk_donus: {first_turn.classification}")
print(f"ucgen_yelpazesi_m2: {fan_area:.6f}")
print(f"ters_sira_yonlu_alan_m2: {reversed_area:.6f}")
print(f"oteleme_farki_m2: {translated_area - signed_area:.3e}")
print(f"donusum_determinanti: {area_scale:.6f}")
print(f"donusmus_alan_orani: {mapped_ratio:.6f}")
print(f"yakin_normalize_determinant: {near_result.normalized_determinant:.6e}")
print(f"yakin_sinif: {near_result.classification}")
print(f"kesin_iki_kat_alan: {exact_double_area}")
Doğrulama çalıştırmasının çıktısı
yonlu_alan_m2: 26.250000
alan_m2: 26.250000
ilk_donus: counterclockwise
ucgen_yelpazesi_m2: 26.250000
ters_sira_yonlu_alan_m2: -26.250000
oteleme_farki_m2: 0.000e+00
donusum_determinanti: 1.020000
donusmus_alan_orani: 1.020000
yakin_normalize_determinant: 2.500000e-09
yakin_sinif: uncertain
kesin_iki_kat_alan: 100000000
Metindeki Python kodları

Kod dosyasını indir

# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Robot bölgesi, dönüşüm ve kesin karşılaştırma ---
import numpy as np
from sympy import Matrix
from agbook import (
    determinant_2d, orientation_diagnostics, polygon_area,
    polygon_signed_area, triangle_area,
)

boundary = np.array([
    [0., 0.], [6., 0.], [7., 3.], [4.5, 5.], [1., 4.]
])
tolerance = 1.0e-10

signed_area = polygon_signed_area(boundary)
area = polygon_area(boundary)
fan_area = sum(
    triangle_area(boundary[0], boundary[i], boundary[i + 1])
    for i in range(1, len(boundary) - 1)
)
first_turn = orientation_diagnostics(
    *boundary[:3], relative_tolerance=tolerance
)
reversed_area = polygon_signed_area(boundary[::-1])
translated_area = polygon_signed_area(
    boundary + np.array([1.0e9, -2.0e9])
)

linear_map = np.array([[1.2, 0.3], [-0.2, 0.8]])
mapped = boundary @ linear_map.T
scale = determinant_2d(linear_map[:, 0], linear_map[:, 1])
mapped_ratio = polygon_area(mapped) / area

near = np.array([
    [0., 0.], [1.0e8, 1.0e8], [2.0e8, 2.0e8 + 1.]
])
near_result = orientation_diagnostics(
    *near, relative_tolerance=1.0e-8
)
exact = Matrix([
    [100000000, 100000000],
    [200000000, 200000001],
]).det()

print(f"yonlu_alan_m2: {signed_area:.6f}")
print(f"alan_m2: {area:.6f}")
print(f"ilk_donus: {first_turn.classification}")
print(f"ucgen_yelpazesi_m2: {fan_area:.6f}")
print(f"ters_sira_yonlu_alan_m2: {reversed_area:.6f}")
print(f"oteleme_farki_m2: {translated_area-signed_area:.3e}")
print(f"donusum_determinanti: {scale:.6f}")
print(f"donusmus_alan_orani: {mapped_ratio:.6f}")
print(f"yakin_normalize_determinant: "
      f"{near_result.normalized_determinant:.6e}")
print(f"yakin_sinif: {near_result.classification}")
print(f"kesin_iki_kat_alan: {exact}")

Kaydedilen çıktı

1. Robot bölgesi, dönüşüm ve kesin karşılaştırma
yonlu_alan_m2: 26.250000
alan_m2: 26.250000
ilk_donus: counterclockwise
ucgen_yelpazesi_m2: 26.250000
ters_sira_yonlu_alan_m2: -26.250000
oteleme_farki_m2: 0.000e+00
donusum_determinanti: 1.020000
donusmus_alan_orani: 1.020000
yakin_normalize_determinant: 2.500000e-09
yakin_sinif: uncertain
kesin_iki_kat_alan: 100000000
Çözümlerdeki Python kodları

Kod dosyasını indir

# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Alternatiflik ve kesme artıkları ---
import numpy as np
from agbook import determinant_2d

pairs = [
    (np.array([3., -1.]), np.array([2., 4.])),
    (np.array([2.5, 0.8]), np.array([0.6, 2.2])),
    (np.array([-5., 7.]), np.array([3., 1.])),
]
lam = 3.25
residuals = []
for u, v in pairs:
    residuals.append(
        determinant_2d(u, v) + determinant_2d(v, u)
    )
    residuals.append(
        determinant_2d(u, v + lam*u) - determinant_2d(u, v)
    )
print(f"max_mutlak_artik: {max(map(abs, residuals)):.3e}")

# --- 2. Çokgen sırası, kapanış ve öteleme ---
import numpy as np
from agbook import polygon_signed_area

p = np.array([
    [0., 0.], [6., 0.], [7., 3.], [4.5, 5.], [1., 4.]
])
closed = np.vstack([p, p[0]])
shifted = p + np.array([1.0e9, -2.0e9])
for name, vertices in (
    ("ozgun", p),
    ("ters", p[::-1]),
    ("kapali", closed),
    ("otelenmis", shifted),
):
    print(name, f"{polygon_signed_area(vertices):.6f}")

# --- 3. Üç tolerans ve kesin determinant ---
import numpy as np
from sympy import Matrix
from agbook import orientation_diagnostics

points = np.array([
    [0., 0.], [1.0e8, 1.0e8], [2.0e8, 2.0e8 + 1.]
])
for tau in (1.0e-6, 1.0e-8, 1.0e-10):
    result = orientation_diagnostics(
        *points, relative_tolerance=tau
    )
    print(f"{tau:.0e}", result.classification,
          f"{result.normalized_determinant:.6e}")
exact = Matrix([
    [100000000, 100000000],
    [200000000, 200000001],
]).det()
print("kesin", exact)

# --- 4. Taşmayı yakalama ve işaret için ölçekleme ---
import numpy as np
from agbook import determinant_2d

u = np.array([1.0e308, 1.0e308])
v = np.array([1.0e308, -1.0e308])
try:
    determinant_2d(u, v)
except OverflowError as error:
    print("overflow:", type(error).__name__)

scale = 1.0e308
scaled_det = determinant_2d(u/scale, v/scale)
print(f"scaled_determinant: {scaled_det:.1f}")
print("sign:", int(np.sign(scaled_det)))

Kaydedilen çıktı

1. Alternatiflik ve kesme artıkları
max_mutlak_artik: 1.776e-15

2. Çokgen sırası, kapanış ve öteleme
ozgun 26.250000
ters -26.250000
kapali 26.250000
otelenmis 26.250000

3. Üç tolerans ve kesin determinant
1e-06 uncertain 2.500000e-09
1e-08 uncertain 2.500000e-09
1e-10 counterclockwise 2.500000e-09
kesin 100000000

4. Taşmayı yakalama ve işaret için ölçekleme
overflow: OverflowError
scaled_determinant: -2.0
sign: -1

Ç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_03_determinant_alan_yonelim.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_03_determinant_alan_yonelim.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.