Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 7 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
delenie obdlznikov

Registrovaný: 30.12.09
Prihlásený: 01.11.23
Príspevky: 265
Témy: 45
Bydlisko: Praha_4/Presov
Príspevok NapísalOffline : 22.01.2011 16:27

nejaka hlava co by vedela poradit algoritmus na delenie obdlznikov?

popisem blizsie.
mam pole struktur, struct obsahuje udaj o dolnom lavom a hornom pravom rohu obdzlnika ktorymi je obdlznik zadany (a ine, pre toto nepodstatne udaje).
takze kazdy obdlznik v zozname je definovany suradnicami v rovine (x1,y1,x2,y2)

mam funkciu na zistenie intersekcie dvoch obdlznikov. teda dva obdlzniky su bud neprekryte a pokracujem porovnanim dalsich dvoch, alebo su prekryte a -> potrebujem ich rozdelit a kazdy z nich pridat do zoznamu.

viac (snad) napovie obrazok:
delenie obdlznikov

do zoznamu chcem teda pridat vsetkych 5 oblznikov (dva povodne zmazem). vedeli by ste poradit co najjednoduchsi a efektivny algoritmus, ktory by bol funkcny pre vsetky pripady intersekcie?

ak ano, poprosil by som len slovny popis, alebo pseudokod.

vopred vdaka







_________________
PC: mobo: Asus PRIME Z490-P cpu: i7 10700F ram: CL16 HyperX 2x8GB DDR4 3200MHz CL16 FURY gpu: MSI R7 250 1GD5 OC ssd: Samsung EVO 850 120GB + EVO 860 250GB psu: EVGA 500B chassis: Fractal CORE 3500W lcd: Samsung U28E590D
<3: mobo: DFI LanParty UT P45 t2rs; cpu: Core2Extreme QX6850; ram:OCZ 4x1GB 1150Mhz PC9200 CL5; gpu: asus 9800gx2 hdd: Samsung F3 500GB; psu: TTTP-1,5kW; chassis: Fractal Define r2 lcd: Samsung SyncMaster 2343NW @2048x1152
tire slayer: RS6 4G
Offline

Skúsený užívateľ
Skúsený užívateľ
delenie obdlznikov

Registrovaný: 11.01.09
Prihlásený: 27.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 22.01.2011 16:50

V prvom rade presne definuj, ako sa majú obdĺžniky rozdeliť, pretože okrem tvojho spôsobu by sa to dalo rozdeliť aj takto:

delenie obdlznikov

alebo takto:

delenie obdlznikov


Offline

Užívateľ
Užívateľ
delenie obdlznikov

Registrovaný: 30.12.09
Prihlásený: 01.11.23
Príspevky: 265
Témy: 45
Bydlisko: Praha_4/Presov
Príspevok Napísal autor témyOffline : 22.01.2011 16:52

je jedno ci podla x alebo y. ten treti urcite nie.







_________________
PC: mobo: Asus PRIME Z490-P cpu: i7 10700F ram: CL16 HyperX 2x8GB DDR4 3200MHz CL16 FURY gpu: MSI R7 250 1GD5 OC ssd: Samsung EVO 850 120GB + EVO 860 250GB psu: EVGA 500B chassis: Fractal CORE 3500W lcd: Samsung U28E590D
<3: mobo: DFI LanParty UT P45 t2rs; cpu: Core2Extreme QX6850; ram:OCZ 4x1GB 1150Mhz PC9200 CL5; gpu: asus 9800gx2 hdd: Samsung F3 500GB; psu: TTTP-1,5kW; chassis: Fractal Define r2 lcd: Samsung SyncMaster 2343NW @2048x1152
tire slayer: RS6 4G
Offline

Skúsený užívateľ
Skúsený užívateľ
delenie obdlznikov

Registrovaný: 11.01.09
Prihlásený: 27.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 22.01.2011 21:19

Fajn, tak postup by mohol byť takýto:

1.) budeš kontrolovať každý bod jedného obdĺžnika, či sa nenachádza v druhom. Pomocná funkcia ( jazyk C ):

Kód:
typedef struct {               // struktura popisujuca suradnice obdlznikov

   int x1, y1, x2, y2;

} coord;


// x a y su suradnice jedneho bodu obdlznika, rect su suradnice x1:y1, x2:y2 druheho obdlznika

bool isInRect( int x, int y, coord rect ) {

   if ( ( ( x > rect.x1 ) && ( x < rect.x2 ) ) && ( ( y > rect.y2 ) && ( y < rect.y1 ) ) )
      return true;

   return false;

}


2.) ak bude výsledok funkcie true, znamená to, že daný bod je vnútri obdĺžnika a vzniká tam nový bod pre ďalšie obdĺžniky.

3.) do poľa (zoznamu), kde chceš ukladať nové súradnice, pridávaj nové súradnice obdĺžnikov a to takto: nakoľko sa kontrolovaný bod jedného obdĺžnika nachádza v druhom obdĺžniku ( popis v bode 2 ), daný bod rozdelí tento obdĺžnik na tri časti:

delenie obdlznikov

čiže do poľa uložíš tri nové obdĺžniky takto (je to rozdelené v osi X, keďže si vravel, že to je jedno):

Kód:
typedef struct {               // struktura popisujuca bod

   int x, y

} point;

// ...

   // kontrolovany bod

   coord rect1, rect2, temp;      // suradnice: 1. obdlznik, 2. obdlznik, pomocna premenna temp
   std::vector< coord > array;      // pole obdlznikov

   point p;            // v nom budu suradnice kontrolovaneho bodu

   // prvy novy obdlznik

   temp.x1 = rect1.x1;
   temp.y1 = p.y;
   temp.x2 = rect1.x2;
   temp.y2 = rect1.y2;
   array.push_back( temp );

   // druhy novy obdlznik

   temp.x1 = rect1.x1;
   temp.y1 = rect1.y1;
   temp.x2 = p.x;
   temp.y2 = p.y;
   array.push_back( temp );

   // treti novy obdlznik

   temp.x1 = p.x;
   temp.y1 = rect1.y1;
   temp.x2 = rect1.x2;
   temp.y2 = p.y;
   array.push_back( temp );


Pre os Y to bude iba s drobnými zmenami. To isté budeš robiť pre všetky body ( tzn celú kontrolu ) a nakoniec v poli porovnáš súradnice, ktoré sú rovnaké ( pretože niektoré sa budú opakovať ).

Je to postup písaný z hlavy, určite to bude mať nejaké muchy, ale snáď máš teraz aspoň nejakú víziu, ako na to.


Offline

Užívateľ
Užívateľ
delenie obdlznikov

Registrovaný: 30.12.09
Prihlásený: 01.11.23
Príspevky: 265
Témy: 45
Bydlisko: Praha_4/Presov
Príspevok Napísal autor témyOffline : 23.01.2011 14:46

velka vdaka za tvoj cas, necakal som ze sa na to niekto pozrie.
funkcne to urcite bude, problem ale pre mna je ze to riesi len jeden pripad (resp 4) a to vtedy ked sa v druhom obdlzniku nachadza prave jeden bod toho prveho.

existuje ale celkom (tusim) 14 sposobov prekrytia, ktore je treba riesit a vypisovat kazdu moznost je dost neefektivne (myslim ze by to slo zredukovat aspon na 3 alebo 4 moznosti).
prikladam obrazok, ako to vidim...

delenie obdlznikov

takymto riesenim by tam dost stupla cyklomaticka zlozitost si myslim, a druhy problem je ten, ze vysledny program (v ktorom je to delenie len jednou z funkcii) ako celok to musi stihnut v obmedzenom casovom horizonte s velkym datovym objemom a obmedzenou pamatou, preto hladam co najefektivnejsie riesenie. v helpe bolo uvedene ze pridavanie obdlznikov do zoznamu by sa malo riesit rekurzivne, ale nejak som nato zatial nedosiel ako ich delit a pridavat rekurzivne.

ako som sa zmienil, ide mi len o nejaky logicky napad, na efektivne riesenie, nejaku moznost ako by to slo riesit. urcite necakam kompletne funkcie alebo neviem co.

vdaka este raz.

//podarilo sa mi to zredukovat na 3 pripady zatial... keby ste ale vedeli o niecom univerzalnom, velmi by mi to pomohlo.







_________________
PC: mobo: Asus PRIME Z490-P cpu: i7 10700F ram: CL16 HyperX 2x8GB DDR4 3200MHz CL16 FURY gpu: MSI R7 250 1GD5 OC ssd: Samsung EVO 850 120GB + EVO 860 250GB psu: EVGA 500B chassis: Fractal CORE 3500W lcd: Samsung U28E590D
<3: mobo: DFI LanParty UT P45 t2rs; cpu: Core2Extreme QX6850; ram:OCZ 4x1GB 1150Mhz PC9200 CL5; gpu: asus 9800gx2 hdd: Samsung F3 500GB; psu: TTTP-1,5kW; chassis: Fractal Define r2 lcd: Samsung SyncMaster 2343NW @2048x1152
tire slayer: RS6 4G
Offline

Užívateľ
Užívateľ
delenie obdlznikov

Registrovaný: 03.01.11
Prihlásený: 21.02.11
Príspevky: 54
Témy: 1
Príspevok NapísalOffline : 24.01.2011 15:15

tvojich 14 moznosti nie je spravne. Ide o rovinu, a nie priestor a teda je jedno ci je obdlznik 2 nad (v zmysle osi z) obdlznikom 1 alebo opacne. Teda v tvojom poslednom prispevku z prvej stvorice su dva pripady (prvy a druhy stlpec), z druhej stvorice mas zase totozne pripady v riadkoch, v tretej stvorici ich mas zase v riadkoch totozne a v poslednej dvojici mas tiez iba jeden pripad. Tebe sa totiz osi pretinaju a vidis ich ako siet a nie ako plne utvary. Takze tych moznosti je 7 + moznost kedy je jeden cely obdlznik vnutry druheho (teda zjednotenie oboch mnozin dava ten vacsi obdlznik. Algoritmicky ti to vsak odchyti druhy typ co si nakreslil, takze uvazujme iba 7 moznosti). Vsetky s vynimkou poslednej ti ale zahrnie Ficov postup, jedine by som navrhol lepsi test na intersekciu bodu a obdlzniku. Netreba tam 4 podmienky, da sa spravit dvoma:
Kód:
bool isInRect( int x, int y, coord rect ) {
   return (x + rect.x1 < rect.x2) && (y + rect.y2 < rect.y1 );
}


tych 7 moznosti tiez nie je maximum, vedel by som to zredukovat na jedinu ale to by si musel byt menej konzervativny a nezavrhnut tak razne posledne Ficove riesenie. Delil by som to v oboch osiach, a potom v jednej osi spajal obdlzniky kde ich je v rade menej ako tri (to mi pokryje aj posledny pripad z tvojich obrazkov)


Offline

Užívateľ
Užívateľ
delenie obdlznikov

Registrovaný: 30.12.09
Prihlásený: 01.11.23
Príspevky: 265
Témy: 45
Bydlisko: Praha_4/Presov
Príspevok Napísal autor témyOffline : 24.01.2011 23:43

jedno to podla mna nieje, kedze tie obdlzniky porovnavas ako obdlznik A a B. na to aby sa dalo riesit menej moznosti teda staci vymenit obdlzniky pri porovnani. delit po oboch osiach je nepripustne kvoli casovemu limitu v ktorom musi program prebehnut, pretoze toto je len cast programu, a zoznam obdlznikov je potrebne prelistovat vela krat, preto udrziavat tam zbytocne obdlzniky nieje vyhodne.
moznost kedy je jeden obdlznik cely v druhom nieje potrebne riesit, taky obdlznik zo zoznamu mazem.
a tie posledne dva su len jeden, mas pravdu, tam som sa sekol.

kazdopadne, delenie mam uz vyriesene(fico mi dal napad, za co velmi pekne dakujem), nie nejak prilis efektivne, ale funkcne, uz len dufam ze to bude stihat.







_________________
PC: mobo: Asus PRIME Z490-P cpu: i7 10700F ram: CL16 HyperX 2x8GB DDR4 3200MHz CL16 FURY gpu: MSI R7 250 1GD5 OC ssd: Samsung EVO 850 120GB + EVO 860 250GB psu: EVGA 500B chassis: Fractal CORE 3500W lcd: Samsung U28E590D
<3: mobo: DFI LanParty UT P45 t2rs; cpu: Core2Extreme QX6850; ram:OCZ 4x1GB 1150Mhz PC9200 CL5; gpu: asus 9800gx2 hdd: Samsung F3 500GB; psu: TTTP-1,5kW; chassis: Fractal Define r2 lcd: Samsung SyncMaster 2343NW @2048x1152
tire slayer: RS6 4G
Odpovedať na tému [ Príspevkov: 7 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Delenie viet

v PHP, ASP

6

934

15.07.2008 16:18

vladooo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Delenie disku

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Pevné disky a radiče

43

2783

21.05.2008 16:24

tommy1104 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Delenie Hdd

v Pevné disky a radiče

7

502

21.09.2015 4:45

branci6138 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Delenie HDD

v Ostatné programy

10

1058

27.12.2011 15:15

Ominous Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. nechapem delenie

v ATI/AMD grafické karty

6

1219

27.01.2010 3:28

foxXx Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Delenie diskov

v Operačné systémy Microsoft

6

521

27.06.2008 19:40

Flety Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. delenie HDD

v Pevné disky a radiče

12

725

05.06.2013 21:52

sp33d Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Assembler i8080 delenie

v Assembler, C, C++, Pascal, Java

1

436

12.04.2010 21:20

dEVIANT Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Delenie wifi signálu

v Poskytovatelia internetu

3

425

27.04.2019 21:16

medrolist Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. delenie pomocou *.cue

v Audio programy

1

923

04.09.2006 19:51

maciakba Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Instalacia OS + delenie HDD

v Operačné systémy Unix a Linux

4

1939

26.10.2009 6:54

Jaro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Program na delenie disku ?

v Ostatné programy

6

1968

08.02.2009 17:59

McDog Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Delenie HDD + 2 OS

v Pevné disky a radiče

4

1560

07.06.2008 20:10

OmeGa Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Delenie v ciselnych sustavach

v Ostatné

1

976

07.11.2010 10:30

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. OpenOffice Writer - delenie slov

v Ostatné programy

3

979

23.04.2009 23:05

SkyHiRider Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Soft na delenie disku.

v Ostatné programy

4

594

06.08.2008 16:46

SilverSurfer Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra