Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Treba mi ideja....

[es] :: C/C++ programiranje :: Treba mi ideja....

[ Pregleda: 3101 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

slavkot

Član broj: 18657
Poruke: 166
87.250.102.*



Profil

icon Treba mi ideja....29.04.2006. u 17:19 - pre 218 meseci
Pozdrav, napravio sam običan prozor u kojem je omogućeno korisniku da crta krugove i kvadrate i da ih
međusobno povezuje linijom, kao na slici.
Potrebno mi je da nekako odredim šta je s čim spojeno, kako tj. na koji način da to uradim?



 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: Treba mi ideja....29.04.2006. u 17:54 - pre 218 meseci
I
1. Crtanje novog kruga ili kvadrata: novi graficki objekat.
2. Svaki ovakav objekat ima odgovarajuci pointer p na drugi graficki objekat koji je u principu null.
3. Povezivanje dva objekta, a i b: pointeru p objekta a dodeli adresa objekta b i obrnuto.
4. Objekti c i d su povezani ako pointer p objekta c pokazuje na objekat d.
Vise veza jednog elementa sa drugima: vector pokazivaca na graficke objekte umesto jednog pokazivaca p.

II
1. Nova klasa npr. spoj. Ima dva pokazivaca za odgovorajuce graficke objekte.
2. Kada se dva objekta spoje, napravi se novi objekat tipa spoj i daju mu se pokazivaci na *spojene* elemente.
3. Dva elementa a i b su spojeni ako postoji objekat tipa spoj koji ima njihove pokazivace.
Olaksanje pri pretrazivanju spojeva: mogu biti sortirani po vrednosti pokazivaca sa *manjom* adresom.

III
Mozda kazes nesto vise o trenutnoj arhitekturi...

[Ovu poruku je menjao Mali Misha dana 29.04.2006. u 19:12 GMT+1]
Ipak se ++uje.
 
Odgovor na temu

slavkot

Član broj: 18657
Poruke: 166
87.250.102.*



Profil

icon Re: Treba mi ideja....29.04.2006. u 18:18 - pre 218 meseci
Ovo što si napisao je ok, ali moj problem je pod II između 1 i 2 , tj. napisao si kada se dva objekta spoje...,
Kako da znam tj. kako da detektujem koja će dva objekta korisnik spojiti, npr. ako je korisnik prvo nacrtao R1, R2 i R3,
zatim C1, C2 i C3 i sad crta liniju kojim spaja neka dva objekta, kako da detektujem koja je dva objekta spojio?
Npr. može povući liniju tako da ne spoji nijedan objekat tj. nijedan nacrtani element.
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: Treba mi ideja....29.04.2006. u 18:45 - pre 218 meseci
Pa hvataj gde je poceo klik a gde ga je zavrsio prilikom crtanja linije i trazi najblize objekte. Ako makar jednog od njih nema, spoj je nevalidan tj. ne postoji, i nista... program ide dalje. Ja sam mislio da ionako vrsis tu kontrolu zarad trima linije jer korisnik ne bi trebao da ubada tacne nego pozicije priblizne ili na objektima. Tada program vuce liniju od objekta do objekta. Dakle:

[0. Klik na tool za spajanje objekata]
1. Na pocetak klika: Ako je na nekom objektu ili njegovoj blizini, uzimas adresu tog objekta.
[1a. Markiras pocetni objekat na ekranu]
2. Na kraj klika: Ako postoji prvi objekat i ako je na nekom objektu ili njegovoj blizini, uzimas adresu tog objekta
3. Ako je spoj validan, generises novi spoj sa odgovarajucim podacima i prikazes ga graficki.

[ ... ] - neobavezni koraci
Ipak se ++uje.
 
Odgovor na temu

slavkot

Član broj: 18657
Poruke: 166
87.250.102.*



Profil

icon Re: Treba mi ideja....29.04.2006. u 19:08 - pre 218 meseci
To mi je trebalo, tako sam i mislio uraditi, ali nisam bio siguran da se tako detektuje šta je s čim spojeno, hvala ti na pomoći

[Ovu poruku je menjao slavkot dana 29.04.2006. u 20:09 GMT+1]
 
Odgovor na temu

slavkot

Član broj: 18657
Poruke: 166
87.250.102.*



Profil

icon Re: Treba mi ideja....30.04.2006. u 10:53 - pre 218 meseci
Opet sam zaglavio, evo posmatrajmo krug C1 i recimo hoću da detektujem kada je korisnik kliknuo na njega.
Od podataka imam:,
koordinate centra C1 (x1, y1) i njegov poluprečnik r,
koordinate klika miša (x2, y2),

i šta sad s čim porediti da se zaključi da je tačka sa koordinatama x2 i y2 unutar kruga?
Naravno da postoji više načina da se ovo zaključi, ali koji je najjednostavniji, jer npr. ako imam 50 krugova trebam ispitati svaki krug da bi zaključio gdje je korisnik kliknuo, ima li nekakav algoritam za ovo?
 
Odgovor na temu

blaza
n/a

Član broj: 961
Poruke: 743
*.vdial.verat.net.



+3 Profil

icon Re: Treba mi ideja....30.04.2006. u 11:42 - pre 218 meseci
Ima li tvoje pitanje veze sa C++?
Kada se tacka nalazi unutar kruga? - kada je rastojanje izmedju tacke i centra manje od poluprecnika kruga.
Kako racunas rastojanje izmedju tacke i centra kruga? - d*d = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)
Najefikasniji nacin je da poredis d*d sa r*r - i time izbegnes korenovanje.
O_o
 
Odgovor na temu

slavkot

Član broj: 18657
Poruke: 166
87.250.102.*



Profil

icon Re: Treba mi ideja....30.04.2006. u 11:55 - pre 218 meseci
Ima veze sa c++, radim u njemu :), nego mislio sam da postoji neki jednostavan način za rješenje ovog problema, jer nigdje nije diskutovano o tome i zato mi trebaju i vaša razmišljanja vezano za ovo. Znači nema mi druge nego porediti sve, ok. biće dugačak "source code"...
 
Odgovor na temu

Alex21
Zagreb

Član broj: 89590
Poruke: 24
82.193.194.*



Profil

icon Re: Treba mi ideja....02.05.2006. u 09:26 - pre 218 meseci
Na ovakav problem postoji mnogo načina. Ovisi na kojem frameworku radiš.
Ako je to Win32 aplikacija (još i k tome MFC), možeš npr. svoje objekte naslijedit iz CWnd klase, te
hendlat funkciju OnMouseMove gdje testiraš jer LBUTTONDOWN okinut, i slat window "roditelju" poruku da je miš nad objektom

Bit će više u duhu OOP, a i manje source-a.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..81.static.rny.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Treba mi ideja....02.05.2006. u 09:46 - pre 218 meseci
U pitanju je jako prost problem. Svaki od tih "objekata" na prozoru, ili unutar nekakvog tzv. compound objekta (razliciti toolkiti to razlicito zovu, FLTK recimo to zove prosto "Group", Borland C++ "Panel" (ili "Canvas" objasnicu kasnije zasto spominjem oboje), itd.).
Neki koji poznaju Borland C++ (Builder) vec mozda naziru dva resenja, jedno je da se naprave komponente (widget-i) za svaki tip objekta (pravougaonik, krug, itd), drugo resenje je da se sve iscrtava u Canvas objektu... Pitanje je ukusa sta ce covek izabrati.
Generalno se ovako proste stvari resavaju tako sto se napravi prosto zaseban Widget (Component), tako da cu nastaviti sa alternativom broj 1.
Svaki toolkit, kao sto rekoh, ima tip Widget (ili Component), ja cu koristiti termin Widget u nastavku teksta.
Scenario: zelis da imas samo dva tipa objekata (za pocetak) - Pravougaonik i Krug. I zelis da te objekte vizualno vezujes Konektorima (one linije koje vezuju tvoje pravougaonike i krugove). Za realizaciju ovoga trebace ti TRI klase:

- VisualEditor klasa ce naslediti Group (Panel u Borland C++) i bice zaduzena za iscrtavanje konektora i dva nova Widget-a o kojima cu govoriti u narednoj recenici.
- Objekti Pravougaonik i Krug koji ce naslediti klasu Widget (Component u Borland C++, tacnije VCL framework) . Ovi objekti imaju samo jednu jedinu ulogu - da iscrtavaju sami sebe kada treba, i da drze podatke koje treba da sadrzavaju (recimo naziv, boju, itd.).

VisualEditor je, kao sto se moze naslutiti "glavna stvar". On osvezava (samim tim iscrtava) ceo dijagram (ili deo dijagrama, ali to mozes kasnije da optimizujes) kad god se nesto izmeni.

Sada kada sam objasnio sta od klasa imamo mogu odgoviriti na pitanje kako da znamo kako i kada sta mozemo da "povezemo". :)

To se radi na sledeci nacin: VisualEditoru se posalje "poruka" (pozivom nekog metoda), da ulazimo u (recimo) "Connect" mod, pozivanjem metoda connectStart(). Tada se ceka klik na neki od objekata koji se trenutno nalaze na VisualEditoru (mozemo imati N Pravougaonika i M Krugova), kada se klikne na neki od ova dva tipa objekata, onda VisualEditor zna gde je pocetak Konektora, tada on automatski ulazi u mod cekanja na kraj konektora. Tada VisualEditor ocekuje da korisnik ili klikne na neki od objekata tipa Pravougaonik i Krug, ili na nesto drugo (recimo na sam VisualEditor). Ako je kliknut neki od Objekata, onda znamo tacno koji objekat se vezuje sa kojim objektom, i VisualEditor zna tacno sta da crta. Ako je korisnik kliknuo na nesto drugo, ili pritisnuo ESC, onda se izlazi iz ovog moda, i znaci prekida se proces vezivanja dva objekta.

Sigurno ce se neko pitati kako VisualEditor, prilikom iscrtavanja zna koje veze postoje i kako zna koji objekti su vezani sa kojim objektima. Postoji dva nacina koji odmah padaju na pamet.
Jedan je da svaki objekat sadrzi vektor (ili listu) objekata za koje je vezan. Drugi je da VisualEditor sadrzi vektor parova Objekat*,Objekat* (pokazivaci) gde svaki element znaci objekat1 je vezan na objekat2. Kad kazem par mislim na std::pair tip. :)

Ako zelis, ja mogu da napisem kompletan primer ovoga u FLTK-u. :)


[Ovu poruku je menjao leka dana 02.05.2006. u 10:48 GMT+1]
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

slavkot

Član broj: 18657
Poruke: 166
87.250.102.*



Profil

icon Re: Treba mi ideja....02.05.2006. u 15:25 - pre 217 meseci
Leka, nema potrebe da pišeš program, radim u wxWidgets-u i uspio sam riješiti dio problema slično kako si naveo gore i uz pomoć objašnjenja od Malog Mishe.

Formirao sam klasu "pravougaonik" koja crta njega i sadrži njegove koordinate i klasu "krug" koja crta krug i sadrži njegove koordinate.
Na kraju imam klasu za spajanje koja sadrži pokazivače na klase kruga i pravougaonika i pomoću nje odredim šta je s čim povezano.

Još me jedna stvar muči, a to je kada korisnik hoće da pomjeri ili obriše neki element ili čak da odredim na koji je element kliknuo korisnik prilikom spajanja.
Ovo sam riješio tako što sam napravio povezanu listu krugova (znači svaki objekat krug sadrži pokazivač koji pokazuje na sljedeći krug itd.) i povezanu listu pravougaonika (pokazivač pokazuje na sljedeći pravougaonik).
Kada korisnik klikne mišom na neki element ili bilo gdje na prozoru, uzmem koordinate (x1, y1) i krenem da pretražujem koji je element u pitanju, tj. krenem od prvog pravougaonika pa preko pokazivača prođem kroz sve pravougaonike i ako nema nijednog pravougaonika u okolini tačke (x1, y1) nastavim sa pretragom od prvog kruga pa dalje.

Da li je ovo dobro rješenje?
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..81.static.rny.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Treba mi ideja....04.05.2006. u 09:19 - pre 217 meseci
Mislim da nije, jer svaki id tih Widgeta mogu imati "logiku" (koja se nalazi u nekom callback-u), koja obradjuje ove dogadjaje. Posto su Pravougaonik i Krug widgeti (wxWidgets cini mi se koristi termin "Component"), onda oni sami znaju svoje koordinate, i tacno se zna na koji si widget kliknuo. Dakle, vec imas sve sto ti treba za ovo, nema potrebe da ista dodatno pises.

Scenario: Uhvatio si misem (drag) widget tipa Krug i prebacio ga negde unutar VisualEditor-a (pogledaj moj prethodni tekst). Posto su i Krug(ovi) i Pravougaonik(ci) widgeti, oni sami vec "znaju" svoje pozicije. Jedino sto ostaje je da se VisualEditor osvezi, sto se takodje radi AUTOMATSKI. Jedino sto ti treba da odradis je zapravo da napises kod koji ce da odradi osvezivanje VisualEditor-a. Pojma nemam kako se to radi u wxWidgets, iskreno. Pretpostavljam da se tamo hvata neki Paint dogadjaj, ili sta vec. U FLTK-u je to ultrajednostavno, covek jedino treba da napise draw() metod, i da u njemu iscrta Konektore. Kako VisualEditor zna da nacrta sve? Zna tako sto uzme listu sve svoje dece (jer se svi Pravougaonici i Krugovi nalaze U NJEMU), pokupi njihove pozicije i velicine, kao i informaciju koji je povezan sa kojim), i to je sve sto mu treba da bi znao tacno sta da radi...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

[es] :: C/C++ programiranje :: Treba mi ideja....

[ Pregleda: 3101 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.