[ shpiki @ 17.05.2011. 18:35 ] @
Dakle, kako ovo nacrtati u VB6, ali koristeci gotove kontrole za recimo shape (circle)? Veze se ostvaruju na osnovu odredjenih kriterijuma u samom programu, muci me samo kako sad izvuci iz sacuvanih podataka (u kojima su veze medju clanovima) veze i naterati VB6 da poveze krugove (npr) linijama?

Svaka ideja je dobrodosla... Hvala unapred.
Pozdrav.

[Ovu poruku je menjao shpiki dana 17.05.2011. u 20:40 GMT+1]
[ unisoft @ 17.05.2011. 19:08 ] @
To moze samo moras malo da mozgas. Nisam se nesto posebno bavio grafikom u VB6 i licno najvise volim da radim aplikacije u VB6. Buducnost programiranja i rada sa grafikom su kako sada stvari stoje C (za neke kompleksnije stvari), C++ i C# (ja polako se prebacujem na C# 4.0 2010)

Ako zelis mogu da ti pomognem ali na C# jeziku sto se tice VB6 moraces da guglas. To sigurno moze samo malo surfuj po netu.

Ispod su ti neki od veoma korisnih linkova za crtanje u C# jeziku. To ti je prvih par sajtova za pretragu na temu 'C# draw circle'.


[ shpiki @ 17.05.2011. 19:39 ] @
Hvala na odgovoru unisoft.
Ni ja ne volim da radim sa grafikom, ali sad je situacija takva kakva je. Ne prelazi mi se na C# (ili bilo koji C), jer nemam potrebu za nekom ekstremnom grafikom, a ostatak mi VB sasvim uredno zavrsava...
Elem, meni nije problem da nacrtam bilo koji od ovih oblika, niti liniju, ali mi je problem povezati ih po kriterijumu...
Recimo, Krug1 i Krug2 imaju iste osobine (recimo boju), kriterijum ja unosim,a program sam treba da prepozna iste osobine i linijom da spoji ta dva kruga... nadam se da sam bio malo jasniji... ili jos jednostavnije: recimo da imam dve Liste, i da iz liste1 izaberem elemenat i iz liste2 koji ce biti povezani...
Znaci, treba mi logika kojom da se vodim da napisem takav program za povezivanje...

Hvala jos jednom. Pozdrav.

Edit: Izvinjavam se, u prvom postu nije bila uploadovana slika (ne znam zasto)
[ ventura @ 17.05.2011. 19:55 ] @
Povezati krugove je prilično lako... Ono što je komplikovano jeste odrediti poziciju tih krugova tako da kada se povežu to prati neku logiku... Tako da ako korisnik sam određuje poziciju krugova, samo povezivanje nije nikakav problem..
[ shpiki @ 17.05.2011. 20:07 ] @
Pozicija moze da bude random, napravicu da kontrole mogu da se pomeraju u runtime, znaci korisnik ce moci da slozi krugove kako njemu odgovara... Mene samo ubija logika!
[ unisoft @ 17.05.2011. 20:28 ] @
Nauci Teoriju grafova, tj Teorija usmerenih grafova (najlaksa matematika koja postoji). Inace uci se na trecoj godini Fakulteta tehnickih nauka (trebalo bi na svim) i bice ti sigurno mnogo lakase da ovo resis. Knjiga nije mnogo velika, ima samo oko 1200str :(.

A slazem se u potpunosti sa forumasom da bi bilo veoma tesko resiti da sam graf prati neku logiku. Povezati ih je veoma lako e sada da prate neku logiku je ???.
[ shpiki @ 17.05.2011. 22:03 ] @
Uf... znaci ima mozdane gimnastike dosta...
A da li bi bio problem da se napravi program koji ce da spoji dva kruga koja mu ja naznacim (znaci ne mora da razmislja, ja kazem spoji taj i taj krug, a njegovo je samo da to nacrta)?
Da li bi to bio problem da se uradi i ima li neko ideju za ovo?

Pozdrav.
[ Marko_L @ 18.05.2011. 01:05 ] @
Krugove i linije koje spajaju te krugove, treba posmatrati kao objekte koji imaju neke svoje atribute. Recimo, krug treba da ima X i Y koordinatu (koje predstavljaju centar kružnice), zatim radijus, boju i naravno druge atribute koje u konkretnom slučaju taj element treba da ima. E sad, ja predlažem da se tu napravi UDF (user defined type) koji će predstavljati taj element, u tvom slučaju krug. Dakle, ovako
Code:
Private Type e_Circle
    X As Integer
    Y As Integer
    Radius As Integer
    Color As Long
End Type

a možemo napraviti i tip za relacije (koji će sadržati podatak o tome, koji krug treba da bude povezan sa kojim)
Code:
Private Type e_Relations
    Master As Integer
    Slave As Integer
End Type

E sad, kad smo to definisali možemo da deklarišemo matricu tih objekata.
Code:
Dim objCircles() As e_Circle
Dim objRelations() As e_Relations

U Load eventu forme redimujemo te objekte na nulu (iako će kec biti prvi element u nizu), kako bismo kasnije mogli da koristimo redim preserve
Code:
Private Sub Form_Load()
    ReDim objCircles(0) As e_Circle
    ReDim objRelations(0) As e_Relations
End Sub

E sad nam trebaju prcedure za dodavanje novog kruga i nove relacije. To bi moglo da izgleda nekako ovako
Code:
Private Sub AddCircle(iX As Integer, iY As Integer, iRadius As Integer, lColor As Long)
    ReDim Preserve objCircles(UBound(objCircles) + 1) As e_Circle
    
    objCircles(UBound(objCircles)).X = iX
    objCircles(UBound(objCircles)).Y = iY
    objCircles(UBound(objCircles)).Radius = iRadius
    objCircles(UBound(objCircles)).Color = lColor
End Sub

Private Sub AddRelation(iMaster As Integer, iSlave As Integer)
    ReDim Preserve objRelations(UBound(objRelations) + 1) As e_Relations
    
    objRelations(UBound(objRelations)).Master = iMaster
    objRelations(UBound(objRelations)).Slave = iSlave
End Sub

I naravno, da bi sve to imalo smisla, treba to i grafički predstaviti u koju svrhu ćemo napraviti proceduru DrawScheme koja će sve to da iscrta u jednom picturebox-u koji smo nazvali picMain
Code:
Private Sub DrawScheme()
    Dim I As Integer
    
    For I = 1 To UBound(objRelations)
        picMain.Line (objCircles(objRelations(I).Master).X, objCircles(objRelations(I).Master).Y) _
        -(objCircles(objRelations(I).Slave).X, objCircles(objRelations(I).Slave).Y), 0
    Next I
    
    picMain.FillStyle = FillStyleConstants.vbFSSolid

    For I = 1 To UBound(objCircles)
        picMain.FillColor = picMain.BackColor
        picMain.Circle (objCircles(I).X, objCircles(I).Y), objCircles(I).Radius, objCircles(I).Color
    Next I
End Sub

Malo pojašnjenje. Dakle, prvo iscrtamo linije koje predstavljaju relacije između krugova i to tako što se te linije iscrtavaju od centra jedne kružnice do centra druge kružnice. U sledećoj petlji, crtamo kreirane krugove, i to tako što će im okvir biti određene boje koju smo odredili prilikom dodavanja kruga, a ti isti krugovi će biti filovani bojom pozadine. Zašto filovanje kruga ? Da bi se sakrio "višak" od linija, odnosno da bi se stekao utisak da linije idu od ivice kruga do ivice kruga, a ne od centra do centra. Zašto bojom pozadine ? No reason. Čisto da bi se stekao utisak da je krug providan, ali može se obojiti bilo kojom bojom ukoliko za tim ima potrebe. Samo treba promeniti liniju picMain.FillColor = picMain.BackColor u picMain.FillColor = objCircles(I).Color i krug 'e biti filovan bojom koju smo mu dodelili prilikom dodavanja.

Primer kako bi mogli da dodajemo krugove i relacije na klik dugmeta bi izgledao nekako ovako. Za dodavanje kruga
Code:
Private Sub cmdAddCircle_Click()
    Dim sX As String
    Dim sY As String
    Dim sRadius As String
    
    sX = InputBox("Unesite X koordinatu kruga", "Novi krug", "100")
    
    If sX = "" Then Exit Sub
    
    sY = InputBox("Unesite Y koordinatu kruga", "Novi krug", "100")
    
    If sY = "" Then Exit Sub
    
    sRadius = InputBox("Unesite radijus kruga", "Novi krug", "25")
    
    If sRadius = "" Then Exit Sub
    
    Call AddCircle(Val(sX), Val(sY), Val(sRadius), RGB(200, 0, 0))
    Call DrawScheme
End Sub

za dodavanje relacija
Code:
Private Sub cmdAddRelation_Click()
    Dim sMaster As String
    Dim sSlave As String
    
    sMaster = InputBox("Unesite redni broj master kruga", "Nova relacija", "1")
    
    If sMaster = "" Then Exit Sub
    
    If Val(sMaster) < 1 Or Val(sMaster) > UBound(objCircles) Then
        MsgBox "Ovaj krug ne postoji", vbCritical, "Greška"
        Exit Sub
    End If
    
    sSlave = InputBox("Unesite redni broj slave kruga", "Nova relacija", "2")
    
    If sSlave = "" Then Exit Sub
    
    If Val(sSlave) < 1 Or Val(sSlave) > UBound(objCircles) Then
        MsgBox "Ovaj krug ne postoji", vbCritical, "Greška"
        Exit Sub
    End If
    
    If Val(sMaster) = Val(sSlave) Then
        MsgBox "Ne možete povezati krug sa samim sobom", vbCritical, "Greška"
        Exit Sub
    End If
    
    Call AddRelation(Val(sMaster), Val(sSlave))
    Call DrawScheme
End Sub


I eto otprilike bi to bilo to. Klikom na prvo dugme program će te pitati za X, Y koordinate kruga i radijus. Boju sam stavio fiksnu, ali lako može da se doda izbornik boja (nisam hteo sad da se zamlaćujem sa tim, a i nije bitno za primer). Klikom na drugo, program će pitati koji krug povezuješ sa kojim tako što trebaš da uneseš broj master kruga, a zatim i slave kruga.

Ovaj primer možeš isprobati tako što ćeš na formu dodati jedan picturebox i nazvati ga picMain i setovati ScaleMode na 3 - Pixel. Pozadinu (BackColor) možeš da staviš belu kako bi lepše izgledalo, ali i ne moraš. Može bilo koja boja. Zatim, dodaj dva command buttona, cmdAddCircle i cmdAddRelation. Onda startuj aplikaciju, dodaj nekoliko krugova, a zatim definiši relacije, pa pogledaj rezultat. To ti je čisto sa tehničke strane kako možeš da izvedeš crtanje. A kojom logikom će se krugopvi povezivati, to ti znaš, pa implementiraj. Kompletan kod sledi ispod.

E sad, ovo je samo primer na brzaka, kako bi to što tražiš moglo da se izvede, ne znači da je to i najbolje rešenje.
[ vuchko.vuchko @ 18.05.2011. 23:19 ] @
U sustini, pogram treba da radi logikom kojom i ti to radis na listu papira, s time sto ovde tvoja logika treba da predstavlja programski dio a list papira je npr. picture kontrola!
Dakle, razvijes funkciju za crtanje kruga i za povezivanje tih krugova, razvijes funkciju za razmjestanje tih krugova po nekim geometrijskim i drugim osnovama (npr. da ti se konture povezivanje sto manje puta sijeku i sl.) i razvijes funkciju za ispitivanje slicnosti tih krugova.

I tada opises krug 1 i krug 2, pozoves funkciju funkciju za crtanje tih krugova, ona pozove funkciju slicnosti i ako su slicni pozoves funkciju povezivanja, a ona pozove funkciju razmjestanja i to sve vrtis do n-og kruga.

Eto to bi bio neki moj teoretski koncept ovog problema, a sad prakticno kako ces to rijesiti u programu zavisi od nekoliko faktora. Morao bi dobro izdefinistai sta su to slicni krugovi i od cega sve zavisi njihova slicnost, a ovo ostalo je sve stvar matematike.

Ako budes to radio pa zapnes negdje javi se pa da pokusamo rijesiti i u praksi, jer ovako je dosta uopstena prica!

Pozdrav!
[ Blue82 @ 22.05.2011. 19:22 ] @
@MArko_L - ovom coveku definitivno treba podici spomenik. Primetite samo sa koliko rada on pomaze ostalim ucesnicima na forumu. Nije mu problem ni da iskuca 70 linija koda kako bi nesto objasnio. Trenutno ne postoji ni jedan jedini moderator koji se potrudi i 30% kao ovaj covek.

Stvarno Marko, mnogo ti hvala! Presao sam na VB.NET koji je apsolutno mrtav (sto se tice foruma). Kad god mi je nesto potrebno sa cime se do sada nisam susretao, obicno problem predstavim kao vb6 problem i UVEK od Marka dobijem odgovor.
Ne znam kako se ubacuje onaj smajli sto tapse, ali sada bih rado postavio makar 3 komada.
[ Shadowed @ 22.05.2011. 20:35 ] @
Cudno, posto, koliko znam, Marko radi i u vb.net-u :)
[ Blue82 @ 22.05.2011. 21:28 ] @
Nekad naleti ali nije bas stalni gost (osim mozda novijeg datuma), bilo kako bilo ovo mu je primarno mesto, a mozda sam ja nesto propustio :)