Bir algoritma, basit (?) Dizi sorunu çözmek için

oy
7

Bu sorun hızı için oldukça önemlidir. Ben Sorunu daha iyi açıklamak için güzel bir görüntü çizdim. algoritma, bir dikdörtgenin kenarlarına tuvalin sınırları içinde devam etmesi durumunda hesaplamak gerekir, kenar bir dikdörtgen kesişecek?

Biliyoruz:

  1. tuvalin boyutu
  2. Her bir dikdörtgen boyutu
  3. Her dikdörtgenin konum

Daha hızlı çözüm daha iyidir! Bu sefer oldukça şaşırıp ve gerçekten nereden başlayacağımı bilmiyorum.

alt metni http://www.freeimagehosting.net/uploads/8a457f2925.gif

Şerefe

Oluştur 08/07/2010 saat 13:23
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
2

birbirine paralel olmayan hatlar bir noktada kesişir olacak. Her satırın yamaçları hesaplayın ve daha sonra birlikte kesişir edilemez olduğunu çizgiler belirler.

Bununla başlayın ve sonra haydi nasıl optimize görelim. Ben veri nasıl temsil emin değilim ve görüntüyü göremiyorum.

yamaçlar kullanma muhtemelen veri sıralamak yararlanabilirsiniz anlamına basit bir eşitlik kontroldür. Aslında, muhtemelen sadece farklı yamaçları kümesi oluşturabilirsiniz. Aynı dikdörtgenin iki yamaçları kesişen olarak sayılmaz bu tür verileri temsil etmek anlamaya gerekecek.

DÜZENLEME: nasıl, kenarları sonsuza gitmek iki dikdörtgenler kesişemez .. Bekle? Dikdörtgenler temelde birbirine dik olan iki çizgilerdir. o çizgiler sonsuza kadar uzatılabilir eğer hep birbiriyle kesişen anlamına gelmemelidir?

Cevap 08/07/2010 saat 13:35
kaynak kullanıcı

oy
6

Sadece X ve Y ekseni her biri için aralıkları kümesi oluşturmak. X veya Y ekseni kesen aralıkları vardır Sonra her yeni dikdörtgen için, bkz. Buraya bakın aralık setleri sağlamanın bir yolu.

İlk örnekte, yatay eksende ayarlanmış aralık olacağını { [0-8], [0-8], [9-10] }ve dikey tarih:{ [0-3], [4-6], [0-4] }

Bu (genellikle bir "bu bir kesiştiği" yerine, "aralıkları bu bir örtüşme" bir aralık kümesi / ağaç sormak, ama yapılabilir bir şey olmaz mesela) Burada birçok ayrıntı soyutlanmış, sadece bir taslaktır.

Düzenle

Bu, ilgili MİT ders izlemek Lütfen (uzun biraz, ama kesinlikle worths). Eğer (bir artırılmış kırmızı-siyah ağaç uygulanması yerine) daha basit çözümler bulmak bile, bu şeylerin ardındaki fikirler bilmek güzel.

Cevap 08/07/2010 saat 13:36
kaynak kullanıcı

oy
1

sürece sorunu çözmek için seçtim dili söz etmedi olarak, ben sözde kod çeşit kullanacaktır

Fikir herşey yolunda, o zaman bir eksen boyunca dikdörtgen kenarlarının sıralanmış bir koleksiyon örtüşmeyen aralıklarla bir dizi olması gerektiğidir.

  1. numara tüm dikdörtgenler, onlara bireysel kimlikleri atama
  2. Boş bir ikili ağaç koleksiyonu (BTC) oluşturun. Bu toplama bilgi ile bir tam sayı düğümü eklemek için bir yöntem olmalıdır BTC :: ucun (anahtar değeri)
  3. Tüm dikdörtgenler için, yapın:

foreach rect in rects do
    btc.insert(rect.top, rect.id)
    btc.insert(rect.bottom, rect.id)
  1. Şimdi BTC boyunca yineleme (bu size sıralanmış sırası verecektir)

btc_item = btc.first()
do
    id = btc_item.id
    btc_item = btc.next()
    if(id != btc_item.id)
    then report_invalid_placement(id, btc_item.id)
    btc_item = btc.next()
while btc_item is valid

5,7,8 - tekrar rect.left ve rect.right koordinatlarını 2,3,4 adımları

Cevap 08/07/2010 saat 13:49
kaynak kullanıcı

oy
1

Bu soruyu gibi. İşte üzerine olsun benim deneyin geçerli:

Mümkünse: Her bir dikdörtgen gelen Poligon oluşturun. Kırpılmış gereken maksimum uzunlukta bir çizgi olarak her bir kenarı tedavi edin. Hava kontrol etmek için bir kırpma algoritması kullanarak ya da bir satır başka bir kesişmektedir. Örneğin: bu bir İçin Çizgi Kırpma

Ama akılda tutulması: Eğer köşe pozisyonunda olan bir kavşak, onun geçerli bir adres bulursanız.

Cevap 08/07/2010 saat 14:01
kaynak kullanıcı

oy
1

İşte bir fikir. Bunun yerine her bir dikdörtgen oluşturmak (x, y, width, height)ile örneğini, (x1, y1, x2, y2)ya da en azından bunun genişliği ve yüksekliği verilen bu değerler yorumlayabilir.

Bu şekilde, benzer bir sahip olan dikdörtgenler kontrol edebilirsiniz xveya ydeğerini ve ilgili dikdörtgen aynı ikincil değere sahip olduğundan emin olun.


Örnek:

Eğer verdik dikdörtgenler şu değerlere sahiptir:

  • Kare 1: [0, 0, 8, 3]
  • Kare 3: [0, 4, 8, 6]
  • Kare 4: [9, 0, 10, 4]

Öncelikle, karşılaştırmak Square 1için Square 3(hiçbir çarpışma):

  • x değerleri karşılaştırın
    • [0, 8] ila [0, 8] tam olarak aynıdır, bu nedenle herhangi bir geçiş vardır.
  • y değerlerini karşılaştırın
    • [0, 4] ile [3, 6] Bu sayıların hiçbiri benzerdir, bu yüzden bir faktör değil

Sonra, karşılaştırmak Square 3için Square 4(çarpışma):

  • x değerleri karşılaştırın
    • [0, 8] için bir faktör olmadığına çok [9, 10] bu sayıların hiçbiri, benzer
  • y değerlerini karşılaştırın
    • [4, 6] olarak [0, 4] dikdörtgenler ortak sayısını 4 var, ama 0! = 6, bu nedenle, bir çarpışma var

Bilmesi ile kastettiğimiz, çarpışma yöntemi sona erecek, böylece ortaya çıkabilir, ancak değerlendirmenize olanak tanır biliyorum Square 1ve Square 4bazı ekstra netlik için.

  • x değerleri karşılaştırın
    • [0, 8] için bir faktör olmadığına çok [9, 10] bu sayıların hiçbiri, benzer
  • y değerlerini karşılaştırın
    • [0, 3] ila [0, 4] dikdörtgenler ortak numarası 0 olan, ancak 3! = 4, bu nedenle, bir çarpışma vardır

Eğer herhangi bir ekstra ayrıntı gerekiyorsa bana bildirin :)

Cevap 08/07/2010 saat 14:08
kaynak kullanıcı

oy
0

Heh, örtüşen aralıklar aşırı cevap alınması, sadece x ve y ekseni boyunca tüm farklı aralıklarını belirlemek. her bir kesme hattı için, veya ara başlangıç ​​değerine göre kesecek ekseni boyunca bir üst sınır arama yapmak. Eğer bir aralık bulmuyorum veya aralık satırı kesiştiği etmezse, o zaman geçerli bir çizgi.

Biraz zor kısmı geçerli kesme hatları bir eksen boyunca bir dikdörtgenin sınırlarını kesişir olmaz gerçekleştirmek için, yani tek bir aralık içine örtüşen aralıklarını birleştirebilirsiniz. Sen (siz O (n) zamanında doldurunuz) basit sıralanan dizide ve O (n günlük) her kesim hattı aramak ile bitirmek.

Cevap 09/07/2010 saat 07:53
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more