Şimdi Ara

Dikdörtgenlerin kesişme noktasını nasıl bulurum?

Bu Konudaki Kullanıcılar:
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
978
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Bir ödevim var, ödevim şöyle;

    Dikdörtgenlerin kesişme noktasını nasıl bulurum?


    Ve ben bir şeyler yapmaya çalıştım fakat, bir türlü bu kesişim noktalarını hesaplayamıyorum. İngilizce kaynaklarda bir kaç bir şey denk geldi fakat onları da tam olarak kavrayamadım açıkçası.

    Çevresini hesaplamada ve onları bir dizinin içine aktarmada falan bir sıkıntım yok fakat bu dikdörtgenlerin kesişen noktalarını nasıl bulup bir formül üreteyim ki bu ödevi çözeyim.

    Yardımcı olacak arkadaşlara şimdiden çok teşekkür ederim.



  • Dikdörtgenin kenarları 1 ve boşlukların 0 olduğu bir grid oluşturup 1 leri takip ederek ve her ilerleme için çevreyi 1 arttırıp bulabilirsin.
  • bersgurs’un dediği gibi uygun boyutlarda 0 dizisi ayarlarsın. Bina sınırlarını dizi içine 1 olarak girersin. Sol alt köşeden tarama yaparsın. Öncelik üst — sağ — alt sırası olmalı. Üst var mı, varsa üst var mı devam, yoksa sağ var mı — varsa üst var mı, yoksa sağ var mı vs

    < Bu ileti tablet sürüm kullanılarak atıldı >
  • https://www.hackerearth.com/practice/math/geometry/line-sweep-technique/tutorial/

    Buradaki union of rectangles algoritmasına da bakılabilir. Burada alan buluyor gerçi ama genel olarak sweep line algoritması
    kullanılabilir.
  • kodu ekledim. dizinin sol alt ve sağ alt kısımlarında duruma göre düzeltme yapılabilir. ayrıca dinamik yapmak için bazı yerleri değiştirmen gerekecek. aşağıdaki kod bu inputlar için çalışıyor. kolay gelsin.


    #include<iostream>
    using namespace std;
    int main()
    {
    int binalar[6][3] = {{1,7,10}, {3,11,3}, {8,4,12}, {9,9,5}, {17,9,3}, {19,3,2}};
    /* girişleri sıralardım {başlangıç yükseklik son} */
    int d[11][21] = {0},i,j,k, ind1, ind2;
    for(i = 0; i < 6; i++)
    {
    ind1 = binalar[i][0] - 1; /* başlangıc ve son indexler*/
    ind2 = binalar[i][2] + binalar[i][0] - 1;
    for(j = 0; j < binalar[i][1]; j++)
    {
    d[10-j][ind1] = 1; /* başlangıç ve son indekslerde dikine yükselme */
    d[10-j][ind2] = 1;
    }
    for(k = ind1; k <= ind2; k++)
    {
    d[10-binalar[i][1]+1][k] = 1; /* başlangıçtan sona yatay */
    }
    }
    /* sonucu yazdır */
    for(i = 0; i < 11; i++)
    {
    for(j = 0; j < 21; j++)
    cout << d[i][j] << " ";
    cout << endl;
    }cout << endl << endl << endl;

    i = 10; j = 0;
    int t = i+1;
    d[10][20] = 2; /* sınırları ayarlayamadım, ilk ve son noktaları belirledim */
    d[10][0] = 2;
    while(1)
    {
    if(j == 20 && i == 9) break; /* durdurma kriteri - en sağ köşe */
    t = i - 1;
    if(d[t][j] == 1)
    {
    d[t][j] = 2;
    i--;
    continue; /* maksat - öncelikle üstte 1 var mı, döngü başına dön */
    }
    t = j+1;
    if(d[i][t] == 1)
    {
    d[i][t] = 2;
    j++;
    continue; /* üst yoksa sağ kontrolü gerçekleştir, başa dön */
    }
    t = i + 1;
    if(d[t][j] == 1)
    {
    d[t][j] = 2;
    i++;
    continue; /* üst ya da sağ yoksa aşağıya git */
    }
    }
    /* 2 lerle çevrelenmiş sınırı gör*/
    for(i = 0; i < 11; i++)
    {
    for(j = 0; j < 21; j++)
    cout << d[i][j] << " ";
    cout << endl;
    }
    cout << endl << endl << endl;
    /* tara - ikilerin olduğu kısım için yıldız yazdır*/
    for(i = 0; i < 11; i++)
    {
    for(j = 0; j < 21; j++)
    if(d[i][j] == 2)
    cout << "*";
    else cout << " ";
    cout << endl;
    }

    return 0;
    }



    < Bu mesaj bu kişi tarafından değiştirildi rukaplan -- 25 Aralık 2018; 14:51:19 >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.