2 çizginin yukarı veya uzağa bakıp bakmadığını nasıl hesaplarsınız?


10

2 çizgi parçasını tanımlayan 4 nokta göz önüne alındığında, A çizgisinin B çizgisine doğru veya B çizgisinden uzakta olup olmadığını nasıl hesaplarsınız?

2 çizgi sabit bir uzunluğa sahiptir ve x1 / y1 ile x2 / y2 arasındaki mesafe olarak ölçülebilir.

resim açıklamasını buraya girin


Bezier eğrisindeki durum düz çizgili durumdan nasıl farklıdır? Diğer çizgiyi tamamen kuşatabilecek bir eğriniz var mı (böylece her yön "doğru" gösteriyor)?
bummzack

1
Muhtemelen şartlarınızı netleştirmeniz gerekiyor. Geometride, bir "çizgi" yarım çizginin veya parçanın aksine her iki yönde sonsuz şekilde uzanır, bu nedenle 2 çizgi paralel olmadıkça her zaman kesişir. Hangisini soruyorsun? Yönü ima eden bir ok çizdiniz, bu benim için bir segmenti veya en fazla yarım çizgiyi ima ediyor. Peki "doğru" ve "uzak" tanımınız nedir?
Hackworth

Bezier eğrisinin, bir ışın çizgisi kesişim testini çözmek için gereken eşitlikte temsil edilmesi daha zor olabilir. Bu arada, I'de okunu temsil eden kelimeyi "ışın" olarak değiştir. Daha hızlı yanıt alabilirsiniz. Kimse istemezse öğle yemeğinde zamanım olursa buna cevap vereceğim. Değilse, bu oyunlarda son derece yaygın bir görevdir. Google "Ray çizgi segmenti kesişim testi". Bezier eğrisi testinin benzer olduğundan şüpheleniyorum, ama hiç denemedim.
brandon

3
Sorunuzu ikiye bölmelisiniz. Çizgi parçalarına sahip kısım çok kolaydır. Bezier eğrileri olan parça son derece karmaşıktır ve sadece yaklaşık bir sayısal çözüme sahiptir.
sam hocevar

İstediğim gibi sorumu ikiye böldüm. İkinci bölüm burada: gamedev.stackexchange.com/questions/21463/…
TheFlash

Yanıtlar:


11

Izin vermek Ave Bsiyah çizgi üzerinde iki nokta olmak. Let Cve Dmavi segmenti olmak. zÇapraz ürün koordinatının işareti AB^ACsize Csiyah çizginin "sol" mu yoksa "sağ" mı olduğunu belirtir. Benzer şekilde, çapraz ürün AB^CDolmadığını söyler CDibne "sol" ya da siyah çizginin "doğru".

Sol ya da sağ olup olmadığını gerçekten bilmek istemiyoruz; tek istediğimiz onların aynı yönde ya da ters yönde olduğundan emin olmaktır, bu yüzden iki değeri çarpıyoruz.

Bu nedenle aşağıdaki sözde kod çalışmalıdır:

z1 = (xB-xA)*(yC-yA) - (yB-yA)*(xC-xA);
z2 = (xB-xA)*(yD-yC) - (yB-yA)*(xD-xC);
z3 = z1 * z2;

if (z3 < 0)
    ; /* Pointing towards (BUT maybe even crossing) */
else if (z3 > 0 || z2 != 0)
    ; /* Pointing away */
else
    ; /* Parallel */

Korkarım Bezier eğrisi için uygun bir çözüm yazmak için biraz zamana ihtiyacım var. Aşağıdaki durum doğru mu yoksa uzak mı?

Sorun?


Eğri için, eğrinin tanjantını çizgi segmentinize en yakın noktada bulabileceğinize ve bunu diğer çizgi segmentlerinizi test ettiğiniz gibi kullanabileceğinize inanıyorum. Muhtemelen göründüğünden biraz daha zor :)
notlesh

@ stephelton: Bezier eğrileri için ikinci resme tekrar bakın ve eğri bir eğriyi işaret edin. Ya da, muhtemelen kesişen segmente paralel teğet olan, ancak segmente doğru eğilen ve kesişen bir eğriyi düşünün.
Cascabel

Trollface için +1 ve iyi matematik :). Ancak 'doğru' diyagramınızın aslında hala bir 'uzakta' vardır - başlangıç ​​noktasını çizginin üzerine getirin.
Jonathan Dickinson

@JonathanDickinson teşekkürler, sorgumun ne olduğunu biraz daha net hale getirmek için görüntüyü güncelledim!
sam hocevar

2

Başlangıç ​​noktasının yeşil daire ve bitiş noktasının kırmızı ok olduğunu varsayarsak

DS olarak başlangıç ​​noktası ile siyah segment arasındaki mesafeyi hesaplayın ve bitiş noktası (kırmızı ok) için DE ile aynı işlemi yapın. DS> DE ise, segment yönü gösterir. DE> DS ise, işaret ediyor. Her ikisi de eşitse, ikisi paraleldir.

Bir noktadan bir segmente olan mesafeyi ve burada ikinci dereceden bir çerçeve eğrisini nasıl hesaplayacağınızı burada bulabilirsiniz . Ancak, bezier eğrisinin şekline bağlı olarak, garip sonuçlar döndürebilir (eğri kendini geçebilir)


DS> DE'nin yalnızca düz çizgiler için çalışacağı garanti edilir. Beziers için başarısız olabilir. Ayrıca, "doğru" tanımını da bilmiyorsunuz. Okun uzantısı 2 nokta ile tanımlanan bir çizgiyi geçerse, ancak aynı noktalarla tanımlanan parçayı geçemezse, hala "doğru" mudur?
Hackworth

İki bölümden bahsediyorum, çizgilerden değil, "okun uzantısı" diye bir şey yok. Ayrıca, burada mesafeler hakkında konuştuğumuz için, okun nereye işaret ettiği önemli değil. Siyah çizgideki en yakın nokta, siyah çizginin başlangıç ​​/ bitiş noktası olabilir, önemli değil. İki segment eş zamanlı olabilir, bu yöntem yine de amaçlandığı gibi çalışır. Bezier eğrileri için, eğrinin şekline bağlı olarak garip sonuçlar vereceğinden bahsetmiştim.
Ravachol
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.