Daire için en uygun olanı bulun


12

Aşağıda, ortadaki beyaz noktanın bir noktası varsa ve tüm kırmızı daireler zaten mevcutsa, mavi daire için mümkün olan en yakın yeri bulmak istiyorum (ki açıkça yerleştirdiğim yerde). . Bu yeri nasıl bulabilirim?

Benim için performans bu uygulama için büyük bir endişe değil.

resim açıklamasını buraya girin


1
siyah dairenin önemi nedir? mavi dairenin üzerine yerleştirebilir misin?
Ewan

2
Açık bir şekilde, mavi daireyi yerleştirebileceğiniz konumu, diğer dairelerin üst üste binmeden beyaz noktadan mümkün olan en kısa mesafe olmasını istersiniz?
Robert Harvey


2
Tüm daireler her zaman en az bir yerde başka bir çevreye dokunacak mı?
Robert Harvey

Yanıtlar:


4

Bu genel bir çözüm değildir, çünkü mavi dairenin konumunu beyaz noktaya en kısa mesafede sağlayamayacağı için birkaç durum vardır. Örneğin, birlikte gruplanmış 100 kırmızı topunuz varsa ve beyaz nokta bu kırmızı top grubundan uzaksa, o zaman kırmızı topların hiçbiri mavi dairenin konumunda beyaz nokta üzerinde ortalanabilecek herhangi bir etkiye sahip olmayacaktır. . Ayrıca tüm hesaplama detaylarını göstermeyecektir. Her neyse, çözümün (mavi daire) iki kırmızı daireye teğet olduğu bir yapılandırma alt kümesi için aşağıdakiler çalışmalıdır:
1) R'nin mavi dairenin yarıçapı olmasına izin verin
2) tüm kırmızı daireler çiftinde bir döngü yapın, evet Bunun O (n2) olduğunu biliyorum.
3) her bir çember çifti için, (xi, yi) merkezlerinde ve (xj, yj) ilgili ri ve rj yarıçaplı j, çember çifti arasındaki mesafenin karesini hesaplar

d_ij^2=(xi-xj)^2+(yi-yj)^2  

4) tüm daire çiftlerini

dij^2<R^2

bir listeye.

5) R ve yarıçapı dairelerinin her iki daire i ve j'ye teğet olan 2 çözümünü bularak listeyi gözden geçirin. Bunu yapmak için bu denklemleri bu görüntüyle birlikte kullanın bir çift kırmızı daire için iki mavi daire canditates

a = R+ri  
b = R+rj  
c = dij  
α = arccos((b^2+c^2-a^2)/(2bc)  

Yukarıdaki bilgilerle (X1ij, Y1ij) ve (X2ij, Y2ij) i ve j dairelerine teğet olan 2 dairenin merkezlerini bulabilirsiniz. Her aday için mavi daire diğer tüm kırmızı daireler üzerinde döngü ve üst üste gelip gelmediğine bakın. Eğer çizmezlerse, beyaz daireye olan uzaklığı kontrol edin. Eğer daha küçük bir mesafeyi korursanız, çember çiftleri listesinden geçmeyi bitirdiğinizde çözümün olacağını düşünüyorum. Algoritma O (n3) gibi görünüyor.


tek bir daire olduğunda çalışmaz
Ewan

ya da iki daire ama her ikisinin de hedef noktası var
Ewan

sorun şu ki, tüm son vakalara sahip olduğunuzdan emin
Ewan

Ayrıca. bu durumlar için benzersiz çözümler var
Ewan

Çözümün doğru olduğu tüm varsayımları yazmanız veya en azından tüm sınır durumlarını belirtmeniz gerekir. Bazıları açık olabilir, ama bazıları değil. Örneğin, beyaz noktayı tüm kırmızı dairelerden ayıran ve beyaz nokta en yakın daireden R'den daha az olan bir çizgi çizmek mümkünse bu işe yaramaz.
Vlad

2

Noktaya en yakın yerleşim ya noktada olacak ya da bir daireye dokunacaktır.

bu nedenle, önce noktayı kontrol edin, ardından yeni daireyi mevcut dairelerin kenarlarına doğru döndürün, noktadan mesafeyi hesaplayın ve giderken üst üste binerseniz ve minimum mesafe noktasını takip edin. Her daireyi geçtiğinizde durun.

yani. yeşil çizgilerdeki tüm noktaları ve beyaz daireyi kontrol edin. burada yeşil çizgi, kırmızı artı mavi yarıçapı olan bir daire

olası merkez noktaları

sadece bu kavşakları değil, aynı zamanda yeşil kenarların tamamını kontrol etmeniz gerekir.

tek daire vakaları

Açıkçası, geçişinizin adım boyutu performans açısından önemli olacaktır. Ancak, performansın bir sorun olmadığını belirttiğiniz için, çıktı değerinizin çözünürlüğüne karşılık gelen değeri seçin. yani yüzer, uzun?

açıklama:

benim önerim, her bir noktadaki diğer tüm dairelerle çakışmak için test edilen her dairenin çevresindeki tüm noktaları kaba kuvvet uygulamaktır . akıllılık yok.

Örnek resim, daire sayısını ve çözünürlüğü gösteriyorsa, standart bir bilgisayar için sorun olmamalıdır

ortalama yarıçapı 200 olan 20 dairemiz var, bu yüzden yaklaşık 20 * 2 π * 200 puan * 20 kavşak testi = 4800000 iterasyon

Not:

Bu gibi yinelemeli yaklaşımlar, adım büyüklüğünüzün, bu durumda çıktınızın çözünürlüğünün sonucu büyük ölçüde etkileyebileceğinden kusurludur.

Diyelim ki 2 piksel aralıklı iki kırmızı daire ve aralarında sıkmak için 1 piksel yarıçaplı mavi bir daire var. Açıkça, mavi dairenin merkezi olarak iki pikselden biriyle kırmızılardan birinin üzerine gelecektir. ancak ortada iki piksel arasında yer alıyorsa, dairenin yer olduğu açıktır.

Dolayısıyla benim çıkarımın çözünürlüğünü soran yorumum. herhangi bir şey olabileceğini söyledin.

mavi dairenin yarıçapı ile yarıçap artışı olan her bir çift daire için eşzamanlı denklemi de çözebilirsiniz.

bu, mavi dairenin her iki kırmızı daireye de yinelemekten daha doğru bir şekilde dokunacağı noktaları verecektir.

Ancak. sadece bunu yaparsanız yanlış ya da cevap almamanız gereken birkaç koşul vardır. yani.

1 veya hiç daire yok

2 veya daha fazla daire, ancak hedef noktası çok uzakta ve dışında.

birçok daire ancak hedef noktası yüzeye yakın


2
Mavi dairenin kenarını diğer dairelerin dışına yuvarlaması gerektiği anlaşılması kolay bir parçadır. Zor kısım bunu yapmak için denklemleri / hesaplamaları bulmaktır.
Robert Harvey

1
Gerçekten mi? sadece (x-x1) ^ 2 + (y-y1) ^ 2 = (r + r1) ^ 2
Ewan

2
Ve sonra bir sonraki noktayı denediğinizde tüm bunları tekrar yapmanız gerekir. OP'nin performansın bir endişe olmadığını, ancak evrenin ısı ölümünden önce tamamlanması gerektiğini söylediğini biliyorum.
Robert Harvey

2
On yukarı oy alıp almayacağınızı bilmenin tek yolu C # kodunuzu göndermeniz ve ne olacağını görmenizdir.
Robert Harvey

2
Ben olacağını düşünüyorum OP ödev cevap olarak bu kodlamak ve biz ondan bir daha asla duymayacağım
Ewan

1

Bu paket çalışma kodu içerir,

kavram

Verilen daireler C1, C2 .... Cn'dir.

ve Cn dairesinin koordinatları Cnx, Cny ve yarıçap Cr'dir

ve gerekli dairenin yarıçapı R

mavi daire X, Y konumundaysa ve başka dairelerle çakışmıyorsa, aşağıdaki denklemler doğrudur

(C1x - X)^2 + (C1y - Y)^2 > (C1r + R)^2
(C2x - X)^2 + (C2y - Y)^2 > (C2r + R)^2
....
(Cnx - X)^2 + (Cny - Y)^2 > (Cnr + R)^2

birinci denklemi değiştirme,

C1x^2 - 2C1x*X + X^2 + C1y^2 - 2C1y*Y + Y^2 > C1r^2 + 2C1r*R + R^2
X^2 + Y^2 - 2C1x*X - 2C1y*Y > C1r^2 + 2C1r*R + R^2 - C1x^2 - C1y^2

böylece denklemler yeniden yazabilir,

X^2 + Y^2 - 2C1x*X - 2C1y*Y > C1r^2 + 2C1r*R + R^2 - C1x^2 - C1y^2
X^2 + Y^2 - 2C2x*X - 2C2y*Y > C2r^2 + 2C2r*R + R^2 - C2x^2 - C2y^2
....
X^2 + Y^2 - 2Cnx*X - 2Cny*Y > Cnr^2 + 2Cnr*R + R^2 - Cnx^2 - Cny^2

uygulama

beyaz noktanın (Xw, Yw) koordinatından başlayın,

    var isValidLocation = function(x,y,r){
       var valid = true;
       for (var i = 0; i< circles.length; i++){
          var circle = circles[i];
          valid = valid && ((x*x + y*y - 2*circle.x*x - 2*circle.y*y) > (circle.radius*circle.radius + 2*circle.radius*r + r*r - circle.x*circle.x - circle.y*circle.y));
       }
       return valid;
      };

      var find = function(Xw,Yw,Rw){
        var radius = 0;
        while(true){
          for (var x=-1 * radius ;x <= radius; x++) {
            for (var y=-1 * radius;y <= radius; y++) {
               if (isValidLocation(Xw + x,Yw + y, Rw)){
                 drawCircle(Xw + x,Yw + y,Rw,"#0000FF");
                 return;
               }
            }   
          } 
          radius++;
        }
     }; 

tüm denklemleri karşılamak için bulunan ilk koordinat mavi dairenin konumudur


Birisi bu yaklaşımda neyin yanlış olduğunu açıklayabilir mi?
Alçak Uçan Pelikan

Okuması zor. Bazı iyi isimler ve soyutlamalar kullanın. Diyagram eklemek seni öldürür mü?
candied_orange

Gördüğüm kadarıyla, bu yaklaşım sadece mavi daire için geçerli yerleşimleri bulmaya çalışıyor, ancak mümkün olan en yakın yeri bulmaya çalışıyor. Bu düzeltilebilir, ancak yaklaşım aynı zamanda (büyük olasılıkla geçersiz) varsayımının yalnızca sınırlı sayıda tamsayı değer koordinatı olduğunu varsaymaktadır.
Doc Brown

Beyaz noktanın koordinatından başlar ve arama ızgarasını genişleterek etrafında dolaşır. Bu nedenle sonsuz sayıda koordinatın olduğu hiçbir durumla karşılaşmayacaktır .. Sonunda eşleşen koordinat bulur.
Alçak Uçan Pelikan

1
... tamsayı koordinatlarında doğru bir çözüm için, artan bir yarıçap kullanmanız ve arama alanınızı beyaz noktanın etrafındaki bu yarıçapın bir dairesi yapmanız gerekir. Ve OP yazdığı verimlilik onun endişesi olmasa da, zaten test edilmiş olan her koordinat çiftini her döngüde tekrar tekrar test etmemek iyi bir fikir olacaktır.
Doc Brown

0
  • Ey yakın olmaya çalıştığın nokta olmak
  • P aradığınız nokta (mavi dairenin merkezi)
  • r mavi dairenin yarıçapı
  • C0 .. Cn mavinin yerleşimini kısıtlayan tüm dairelerin merkezleri
  • genişletilmiş daire yarıçapı r ile genişletilmiş dairelerden biridir

    O bir daire merkezinde değilse bazı ekstra işler vardır . Şimdi O == C0 varsayalım

İlgili yarıçapları artı r'yi kullanarak C0 ile tüm dairelerin tüm kesişimlerini hesaplayın , genişletilmiş daireleri uzatılmış C0 ile kesiştirin. Kavşak yoksa, aradığınız nokta C0 üzerinde herhangi bir yerdedir, kavşak varsa, her kavşak için başka bir genişletilmiş dairenin içinde olup olmadığını kontrol edin (kendinizi C0 ile kavşakları olan çevrelerle sınırlayabilirsiniz). P olarak başka bir genişletilmiş dairede olmayan ilk kavşağı alın, başkaları olabilir.

Genişletilmiş daireler ile C0 arasında başka bir genişletilmiş dairenin içinde olmayan kesişme yoksa, tüm genişletilmiş dairelerin kesişimlerini birbirleriyle hesaplayın. Daha sonra bu kavşakları O'ya olan mesafe sırasına göre kontrol edin, yine kavşaklardan herhangi birinin başka bir genişletilmiş daire içinde olup olmadığı, eğer evetse atın, eğer sonuç yoksa.

Bunun, mavi daireniz için olası bir konumu gösteren tüm dairelerin çevresine bir çizgi çizmeyi hayal ederseniz, tüm genişletilmiş dairelerin birleşimini almak mavi dairenizin olamayacağı alanı gösterecektir . Aradığınız nokta, o birlikte olmayan en yakın noktadır. C0 üzerinde çözüm olan bu birleşimde olmayan herhangi bir nokta varsa, C0 tamamen kaplanmışsa, P diğer iki genişletilmiş daire arasında bir kesişme noktasında olmalı ve bunun kapsamadığı bir alanda olmalıdır. bu birlik ( genişletilmiş bir çevrede değilim ).

Bu O (n ^ 2), bunu iyileştirmek için bazı yollar var , çift bilge aramanın çabasını azaltmak için bir ızgara kullanılabilir, ayrıca bence daireleri O'ya olan yakınlıklarına göre sıralamak ( iki daire radyo tarafından azaltılır) kapsama alanı ve kavşak araması için arama alanını sınırlamaya yardımcı olur


0

Olası çözümler araması

  1. Beyaz noktanın kendi başına bir çözüm olup olmadığını kontrol edin. Kırmızı daireler beyaz noktadan çok uzakta olduğunda 0 kırmızı daire ve önemsiz vakaları kapsar.
  2. Bir kırmızı daire.
    1. Beyaz nokta dairenin merkezidir. Olası çözümler , merkezi beyaz nokta ve yarıçapı mavi daire yarıçapı ve kırmızı daire çapının toplamı ile daire üzerinde sonsuz sayıda noktadır. Buna yeşil daire diyelim .
    2. Beyaz nokta başka bir yerde. Beyaz noktayı ve kırmızı dairenin merkezini birbirine bağlayan hat üzerinde sadece bir olası çözüm vardır, kırmızı dairenin çizgiyi beyaz noktaya geçtiği noktadan uzağa mavi dairenin yarıçapıdır.
  3. İki veya daha fazla kırmızı daire.
    1. Kırmızı daireleri birer birer alalım ve her biri için nokta 2'ye (bir daire) göre olası çözümlere bakalım .
    2. Kırmızı dairelerin her çifti için, kırmızı dairelerin ikisine de dokunarak mavi daireyi çizip çizemeyeceğinizi kontrol edelim. Yani merkezleri arasındaki mesafe yarıçaplarının toplamına eşit veya daha az ise mavi dairenin çapına eşitse. Eğer yapabiliyorsanız iki (veya kırmızı daireler tam olarak bir mavi daire çapı uzakta ise bir) olası çözümleriniz vardır .

Olası çözümler arasında gerçek çözüm arama

Şimdi olası çözümler olan bir dizi noktanız var, bunları tekrarlayın ve her birini kontrol edin.

  1. Nokta aslında bir çözüm ise. Hiçbir kırmızı dairenin merkezi bu noktaya olan yarıçapından daha yakın olmamalıdır.
  2. Beyaz noktaya daha önce bulunan çözeltiden daha yakınsa.
  3. Eğer varsa yeşil bir daire (nokta 2.1)
    • Bireysel noktalar arasında yeşil daireye ait bir çözüm yoksa, yeşil daire cevaptır.
    • Yeşil daire üzerinde bireysel çözümleriniz varsa ve sadece herhangi bir çözüme ihtiyacınız varsa, bunlardan birini alın.
    • Yeşil daire üzerinde bireysel çözümleriniz varsa ve sınırsız sayıda çözüme ihtiyacınız varsa, başka bir sorunu çözmeniz gerekir. Yeşil daireden, her kırmızı daireden gelen bireysel çözümler çifti tarafından tanımlanan tüm yayları kesmeniz gerekir.

Dikkat: Algoritmanın uygulanmasının tam olarak açıklanması gerektiğini söylemiyorum. Dinamik programlama kullanarak performansı artırmayı deneyebilir veya işe yaramayacakları açık olan olası çözümleri atlayabilirsiniz.

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.