İki çizginin (doğru parçasının) çakışması problemi

Hazır kütüphaneler sebebiyle kod geliştirirken altında yatan matematiğe pek odaklanmıyoruz. Aslında okul yıllarımızda gördüğümüz matematik birçok problemi çözmemiz için yeterlidir. Bu yazımda iki boyutlu bir ortamda iki çizginin kesişip kesişmediği ve kesişiyorsa hangi x ve y koordinatlarında kesiştiğini bulmaya çalışacağız. Hazır kütüphane kullanan oyun geliştiricilerin ve iki boyut üzerine çalışanların bu gibi problemleri daha geniş düşünmesi dileğiyle deyip yazıma geçiyorum. Görselleştirme için SVG ve kod ortamı içinde tabii ki Javascript kullanacağız.

Bu problemin çözümünde Cramer Kuralını, matris ve determinant hesaplama kullanılacaktır. Problemin çözümünü adım adım yapalım.

Problem:

Birinci çizgi X1, Y1 ile başlayıp X2, Y2 koordinatlarında biterken ikinci çizgi X3, Y3 ile başlayıp X4, Y4 koordinatlarında bitiyor ve X, Y kesişim noktası olarak bulunuyor. Amaç X ve Y koordinatlarını bulmak.

Bir doğruyu ax + by = c şeklinde formülize edebiliriz. Bu durumda iki doğru için:

  • a1x1 + b1y1 = c1 ve
  • a2x2 + b2y2 = c2

Burada:

  • a1 = y2 – y1;
  • b1 = x1 – x2;
  • c1 = a1x1 + b1y1
  • a2 = y4 – y3
  • b2 = x3 – x4
  • c2 = a2x3 + b2y3

Bu iki doğrunun determinatını bulalım.

Determinant sıfır çıkması bu iki doğrunun birbirine paralel veya eşit olduğunu gösterir. Başka bir deyişle bir kesişim noktası yoktur. Eğer determinant farklı sıfır ise kesişim bulmak için Cramer kuralını uygulayalım.

Bu formülasyondan x ve y koordinatı hesaplanabilir. Yanlız bizim doğrular sınırlı idi (Doğrudan ayırmak için çizgi (doğru parçası) ismini kullandım). Yani doğrular çok fazla ilerde kesişebilir. Çizgilerimizin kesişip kesişmediğini bulmak için aşağıdaki 4 şartı sağlaması gerekmektedir.

  • min(x1, x2) <= x <= max(x1, x2)
  • min(x3, x4) <= x <= max(x3, x4)
  • min(y1, y2) <= y <= max(y1, y2)
  • min(y3, y4) <= y <= max(y3, y4)

Şimdi javascriptte kodlanmış halini görelim.

Bazen şu ders neye yarayacak, bu ders neye yarayacak diyen öğrencileri görüyorum. Eğer uygulama geliştirmezsen haklısın bir işine yaramayacaklar. Ama farklı problemlere çözüm bulmak istersen dersleri ve derslerden fazlasını bilmelisin. Her şeyi ezberleyin demiyorum. Bizim formül ezberlemekle işimiz yok. Formülleri modifiye edip kullanabilmeliyiz. Özellikle de Sayısal Analiz ne işime yarayacak diyen çok kişi var. Bu ders kodlamanın ve kodlama mantığının en güzel kullanıldığı derstir.  Eğer temel dersleri bilmezseniz ve araştıracağınız konuyu bilip kodlamaya dökemezseniz piyasada ön plana çıkmanız zordur. Bol kodlu günler…

Kaynaklar: