CodeBlanks Logo Icon CodeBlanks

İki doğru kesişimi

İki doğrunun kesişip kesişmediğini saptamayı öğrenirsin.

İki doğru kesişimi

İki doğru parçasının kesişip kesişmediğini saptamak, çizgi düzenleme ve çarpışma algılamada temel bir işlemdir.

Standart yöntem yönelim testi ile çalışır: her parça diğerinin iki üçünü zıt yönlere ayırıyorsa kesişme vardır.

Dört yönelim testi yeterlidir; çapraz çarpım ile O(1)'de hesaplanır. Köşe durumlar için ek kontrol gerekebilir.

Yönelim testi

P₁P₂ parçası ile P₃P₄ parçası için dört çapraz çarpım hesaplarız: d₁ = orient(P₃, P₄, P₁), d₂ = orient(P₃, P₄, P₂), d₃ = orient(P₁, P₂, P₃), d₄ = orient(P₁, P₂, P₄).

Eğer d₁ ve d₂ zıt işaretliyse, P₁ ve P₂ P₃P₄ doğrusunun iki yanındadır. Aynısı d₃ ve d₄ için de geçerliyse, parçalar kesişir.

İşaret kontrolü (d > 0) != (d' > 0) ile yapılır.

Uygulama segments_intersect fonksiyonu

segments_intersect(p1, p2, p3, p4) yaz. İki parça kesişirse True, yoksa False. print(segments_intersect((0,0), (4,4), (0,4), (4,0))) ile True yazdır.

Başlangıç kodu

solution.py
def segments_intersect(p1, p2, p3, p4):
    # İki parça kesişir mi?

Örnek çözüm

solution.py
def segments_intersect(p1, p2, p3, p4):
    # İki parça kesişir mi?
    def orient(a, b, c):
        return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0])
    d1 = orient(p3, p4, p1)
    d2 = orient(p3, p4, p2)
    d3 = orient(p1, p2, p3)
    d4 = orient(p1, p2, p4)
    if ((d1 > 0 and d2 < 0) or (d1 < 0 and d2 > 0)) and ((d3 > 0 and d4 < 0) or (d3 < 0 and d4 > 0)):
        return True
    return False
print(segments_intersect((0,0), (4,4), (0,4), (4,0)))

Beklenen çıktı

True

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Kesişim kavramları

Kavram Anlamı
yönelim Çapraz çarpım
zıt yön Kesişme var
aynı yön Kesişme yok
O(1) Sabit zaman

2 Parçalar ne zaman kesişir?

solution.py
d1 = orient(p3, p4, p1)
d2 = orient(p3, p4, p2)
  • d1 ve d2 aynı işaretliyse
  • d1 ve d2 zıt işaretliyse Doğru cevap
  • d1 sıfırsa
  • d2 sıfırsa

Açıklama: d1 ve d2 zıt işaretliyse P1 ve P2 doğrunun iki yanındadır.

3 yönelim işareti

Soru
if ((d1 > 0 and d2 < 0) or (d1 < 0 and d2 > ____)) and ((d3 > 0 and d4 < 0) or (d3 < 0 and d4 > 0)):
Cevap
if ((d1 > 0 and d2 < 0) or (d1 < 0 and d2 > 0)) and ((d3 > 0 and d4 < 0) or (d3 < 0 and d4 > 0)):

Açıklama: d2 > 0 ile zıt işaret sınanır.

Uzman seviye bölümündeki tüm dersler