[ALG] algoritme locatie controls

Pagina: 1
Acties:

  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
Het is nog vroeg en ik denk niet helder, oftewel, ik kom er even niet uit.
Ik heb een windows form met een X en Y (breedte, hoogte) en een variabel aantal controls

Nu is het de bedoeling dat ik die controls (welke vierkant zijn) ga voorzien van een locatie en afmeting om ze optimaal op het scherm te plaatsen.

poging tot voorbeeld:
stel ik heb 4 controls en hoogte en breedte van form zijn 200
dan heb ik dus controls van 50x50 groot en 2 x 2 op het scherm
maar als het scherm 400 breed en 100 hoog zou zijn, zou dat dus 100x100 moeten zijn en dan 4 naast elkaar....

ik moet dus een algoritme hebben wat bepaald:
hoe groot de controls moeten zijn
en wat de begin positie van deze controls is

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik dank dat je een algoritme zoekt ;)
Ik weet niet hoe "complex" je forms zullen worden, maar ik denk dat je een hoop ellende bespaart door het gewoon "op het oog" te doen.

Overigens, bedenk wel dat je form "rare sprongen" gaat maken als je gaat resizen met jouw manier...

[ Voor 74% gewijzigd door RobIII op 14-12-2004 09:52 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
dank...titel kan ik niet aanpassen :(

probleem is dat ik op voorhand niet weet hoeveel controls het zijn. Bovendien kan het runtime wijzigen door userinput.
Resizen is meegenomen.
Ik heb het werkend voor standaard 2x2, 3x3 en 4x4
maar het moet nu zo intelligent worden dat 2x2 ook 4x1 kan worden naar aanleiding van de form-maten en ik moet ook 5 stuks etc. kwijt kunnen.

in geval van bijv. 2 x 2 is het simpel. Kijk welke het kleinst is (breedte of hoogte) en de helft daarvan is de afmeting van je control. Je kunt dan zelf een matrix samenstellen op basis van 2 rows en 2 cols en locaties bepalen. Dat is wel te doen. Hetzelfde geldt voor 3x3 etc.
maar als ik niet op voorhand weet hoeveel het er zijn en dat ze dus ook afhankelijk worden van de form-maten ben ik het even volledig kwijt :(

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:31

Janoz

Moderator Devschuur®

!litemod

dank...titel kan ik niet aanpassen
Ikke wel ;)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

De horizontale ruimte delen door het aantal kolommen en de verticale ruimte delen door het aantal rijen. Niet afronden, maar afkappen, en je controls passen altijd.

En daarna de verhouding van je controls controleren. Te lang, dan er een kolom bij. Te hoog? Dan er een rij bij. En begin opnieuw ;)

Of ben ik weer eens te simpel aan het denken?

[ Voor 25% gewijzigd door Creepy op 14-12-2004 10:34 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
mjah.. probleem is alleen dat ik op voorhand niet weet hoeveel kolommen en rijen ik heb. Dat is het hele punt.

De info die ik heb: breedte, hoogte, aantal controls
en die moet ik zo ideaal mogelijk plaatsen (en zo scherm vullend mogelijk)

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • miw
  • Registratie: November 2002
  • Laatst online: 23-02 13:02

miw

Ik begrijp het probleem nog niet helemaal. Even een poging tot een alternatieve formulering:
Je hebt een vast rechthoekig gebied (breedte B een hoogte H). Je wilt nu die rechthoek opdelen in een bepaald aantal (N) vierkanten terwijl die vierkanten zo groot mogelijk moeten worden.
Dan kan je een aantal combinaties van een aantal rijen (R) en kolommen (K) maken zodat je alle vierkanten kan plaatsen. (dus R*K <= N). De zijde van de vierkant (V) is dan het kleinste getal van B/K en H/R. De gezochte oplossing is dan de R en K waarvoor de V maximaal is.
Dit zou simpel te programmeren moeten zijn.

  • Delphi32
  • Registratie: Juli 2001
  • Nu online

Delphi32

Heading for the gates of Eden

Als je controls geresized moeten kunnen worden, heb je volgens mij nog wat meer info nodig om een goed algoritme te bakken: de minimale afmeting van je controls. En eigenlijk wil je ook het liefst de maximale afmeting en de optimale afmeting weten.
Zonder deze gegeven(s) beland je in een kip-ei-situatie. Tenzij je natuurlijk je controls niet laat resizen (simpelste oplossing, heb ik ook wel eens gemaakt).

  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
suntsu schreef op dinsdag 14 december 2004 @ 10:42:
Ik begrijp het probleem nog niet helemaal. Even een poging tot een alternatieve formulering:
Je hebt een vast rechthoekig gebied (breedte B een hoogte H). Je wilt nu die rechthoek opdelen in een bepaald aantal (N) vierkanten terwijl die vierkanten zo groot mogelijk moeten worden.
Dan kan je een aantal combinaties van een aantal rijen (R) en kolommen (K) maken zodat je alle vierkanten kan plaatsen. (dus R*K <= N). De zijde van de vierkant (V) is dan het kleinste getal van B/K en H/R. De gezochte oplossing is dan de R en K waarvoor de V maximaal is.
Dit zou simpel te programmeren moeten zijn.
ik weet op voorhand de R en K natuurlijk niet. Die moeten bepaald worden
in mijn eerste voorbeeld kan dat dus 2x2 zijn of 4x1 bijvoorbeeld. Afhankelijk van de verhoudingen van B en H.
Overigens R*K >= N zijn ik moet minimaal evenveel plek hebben dan dat ik vierkanten heb nl.

Jouw verhaal klopt dus wel, maar ik moet R en K nog bepalen vooraf.

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
Delphi32 schreef op dinsdag 14 december 2004 @ 10:43:
Als je controls geresized moeten kunnen worden, heb je volgens mij nog wat meer info nodig om een goed algoritme te bakken: de minimale afmeting van je controls. En eigenlijk wil je ook het liefst de maximale afmeting en de optimale afmeting weten.
Zonder deze gegeven(s) beland je in een kip-ei-situatie. Tenzij je natuurlijk je controls niet laat resizen (simpelste oplossing, heb ik ook wel eens gemaakt).
De controls sizen mee. Hebben geen minimum of maximum grootte (is grafisch control wat ik zelf teken zonder tekst)..
Het punt is dat de breedte en hoogte van het scherm eigenlijk bepalen hoe groot ze worden en hoe ze komen te staan. De vraag is alleen, hoe doe ik dat...

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • miw
  • Registratie: November 2002
  • Laatst online: 23-02 13:02

miw

6K schreef op dinsdag 14 december 2004 @ 10:47:
[...]


ik weet op voorhand de R en K natuurlijk niet. Die moeten bepaald worden
in mijn eerste voorbeeld kan dat dus 2x2 zijn of 4x1 bijvoorbeeld. Afhankelijk van de verhoudingen van B en H.
Overigens R*K >= N zijn ik moet minimaal evenveel plek hebben dan dat ik vierkanten heb nl.

Jouw verhaal klopt dus wel, maar ik moet R en K nog bepalen vooraf.
Ik was niet duidelijk genoeg. Het idee is juist dat je R en K varieert, je laat R lopen van 1 tot N en K van 1 tot N. Je berekent dan wel iets teveel gevallen maar je vindt in ieder geval het optimum. Voor elk van die gevallen reken je de zijde van een vierkant uit.
Stel dat je 5 vierkanten moet plaatsen. Je moet dan de situatie doorrekenen voor de volgende configuraties: 5*1, 3*2, 2*3, 5*1. De optimale situatie (i.e. grootste vierkant) hangt dan af van de grootte van het rechthoekig gebied waar je ze in wilt plaatsen.

  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
ik denk dat dit het inderdaad is.
Ben het nog niet helemaal eens qua performancy enzow, maar het werkt en daar ben ik al erg blij mee.
Resizen blijft goed gaan gelukkig.
zit nog 1 bugje in de volgorde, maar das een ander verhaal.

Nu maar eens kijken of ik niets met de ratio kan doen op een later tijdstip om het ' mooier' te maken, maar bedankt!!!! het werkt

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Volgens mij kan het zo:
K = ceil(sqrt(N*B/H))
R = ceil(N/K)
of
R = ceil(sqrt(N*H/B))
K = ceil(N/R)

| Toen / Nu


  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
ja hier was ik ook, maar dan zit je nog met een klein probleempje. Je rondt nu altijd naar boven af en dat hoeft niet altijd, soms is het optimaler om 1 van de 2 naar beneden af te ronden. Er zijn dus feitelijk met deze methode 3 situaties die ik moet beoordelen, maar das nog altijd beter dan alle mogelijke combinaties van rijen en kolommen uitproberen lijkt me ;)

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • miw
  • Registratie: November 2002
  • Laatst online: 23-02 13:02

miw

SuperRembo schreef op dinsdag 14 december 2004 @ 12:47:
Volgens mij kan het zo:
K = ceil(sqrt(N*B/H))
R = ceil(N/K)
of
R = ceil(sqrt(N*H/B))
K = ceil(N/R)
Stel zijde van vierkant is V. Dan heb je N*V2 aan oppervlakte nodig. De rechthoek heeft een oppervlak van B*H. Er geldt dus N*V2 <= B*H. Ofwel: V <= sqrt(H*B/N). Je kan dat ook uitdrukken in K en R zoals SuperRembo aangeeft. Leuke oplossing.
Nu maar hopen dat sqrt() sneller is dan een simpel lusje met een paar vermenigvuldigingen.

  • Yoeri
  • Registratie: Maart 2003
  • Niet online

Yoeri

O+ Joyce O+

(overleden)
Dus, eigenlijk wil je een Java layoutmanager herprogrammeren als ik het goed heb ? :p

Kijkje in de redactiekeuken van Tweakers.net
22 dec: Onze reputatie hooghouden
20 dec: Acht fouten


  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
lol, ja, maar dan in .Net ;)

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
6K schreef op dinsdag 14 december 2004 @ 13:25:
ja hier was ik ook, maar dan zit je nog met een klein probleempje. Je rondt nu altijd naar boven af en dat hoeft niet altijd, soms is het optimaler om 1 van de 2 naar beneden af te ronden. Er zijn dus feitelijk met deze methode 3 situaties die ik moet beoordelen, maar das nog altijd beter dan alle mogelijke combinaties van rijen en kolommen uitproberen lijkt me ;)
Ja dat merk ik nu ook.

B=400, H=178, N=4
Dat geeft K=3, R=2 en V=89.
Terwijl K=4, R=1, V=100 beter is.

| Toen / Nu

Pagina: 1