[Alg] Maximale grootte van vierkanten in rechthoek

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dag iedereen,

Misschien een vrij onduidelijke titel maar ik ben op zoek naar een manier om een aantal vierkanten een zo groot mogelijke oppervlakte te geven binnen een rechthoek. Ik moet namelijk een aantal knoppen zo groot mogelijk maken. Ik moet ook wat marge rond de knoppen inbouwen: zo'n 10px.

Ik heb al het een en ander geprobeerd en vond zo de berekening voor het te doen als mijn beschikbaar veld een vierkant was, maar ik zoek nu dus naar de formule voor een rechthoek.

Wat ik nu heb:
code:
1
V(((hoogte * breedte) - ((4*margin) * # knoppen)) / #knoppen)


offtopic:
V = vierkantswortel


Echter, aangezien het hier om een rechthoek gaat mag ik de vierkantswortel niet trekken maar zal ik iets anders moeten doen. Maar wat?

Iemand enig idee?

Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Knip het probleem eens op in subproblemen (of teken het uit en identificeer de repeterende delen):

Je hebt een totale hoogte (tH) beschikbaar om een aantal vierkanten (aH) met een variabele hoogte over te verdelen (vH). Daartussen in (aH-1) liggen stukken margin met een bepaalde hoogte (mH).

code:
1
tH = vH*aH + mH*(aH-1)


Het zelfde doe je met de breedte. Eventueel kun je deze twee dan samen nemen om slechts één formule op te stellen, mocht dit nodig zijn. In deze laatste formule zorg je er dan voor dat vH=vB.

[ Voor 5% gewijzigd door Feanathiel op 26-12-2011 13:40 ]


Acties:
  • 0 Henk 'm!

  • Ghehe
  • Registratie: April 2011
  • Laatst online: 12-09 15:58

Ghehe

400 pound hacker

Moet je niet gewoon kijken naar de kortste zijde van een rechthoek.

Stel rechthoek is
code:
1
200px op 150px


Dan neem je (1)
code:
1
kortste_zijde_rechthoek - 2*margin (=130px).


Dus het grootste vierkant dat je erin kan steken is een 130px x 130px?

Indien je er meerdere op (verticale/horizontale) rij wilt kan je zien of
code:
1
200px > (margin + 130px + margin + 130px + margin).

voor 2 vierkanten.

Of algemener (voor x aantal vierkanten): (2)
code:
1
[x.(breedte_vierkant+margin) + margin] < langste zijde

en kijken tot hoeveel je je x kan laten gaan zodat je voorwaarde nog steeds klopt.

Of (1) in (2) invullen:
code:
1
[(kortste_zijde_rechthoek - margin).x + margin] < langste_zijde_rechthoek


Dus als je de hoogte, breedte en margin weet dan weet je hoeveel vierkanten erin kunnen met maximale afmetingen. (Dus 1 vierkant van 130px x 130px in dit geval)

Als je het aantal vierkanten (=knoppen) weet dan is moet je ook eerst de langste zijde vinden (noem die l en de kortste b):
Dan kan je dit stelsel oplossen:
code:
1
2
l >= (x+1)*m + x*z
b >= z + 2*m


Stel je wilt 3 (x = 3) vierkanten (en l = 200px, b=150px en m=10px):
code:
1
2
200px >= 4*10px + 3*z
150 >= z + 2*10px


De strengste voorwaarde is de onderste en die stelt dat 52,.. >= z. En inderdaad als je 3 vierkanten op een rij wilt dan is: 10px + 52px + 10px + 52px + 10px + 52px + 10px = 196px. :)


Ik kan ook totaal de vraag fout begrepen hebben. :9 (Waarschijnlijk het geval :+ )

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Er zijn speciale methodes ontwikkeld om deze categorie problemen op te lossen. Google eens op 'floorplan design algorithms', daar zal vast wel iets in te vinden zijn.

[ Voor 14% gewijzigd door R4gnax op 27-12-2011 11:34 ]


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 17:10

Knutselsmurf

LED's make things better

Wat je denk ik het beste kunt doen, is kijken hoe groot je knoppen (vierkant?) kunnen worden als je ze allemaal naast elkaar plaatst. Je hebt dan een eventuele beperking in de hoogte, en in de breedte van je beschikbare ruimte. Deze beperking bepaalt de maximale grootte van een knop.
Vervolgens doe je hetzelfde maar dan met je knoppen verdeeld over twee rijen. En dan over 3 rijen.....
Uiteindelijk kan je dan bepalen over hoeveel rijen je je knoppen moet verdelen om ze zo groot mogelijk te laten zijn.

Je moet dus niet naar de oppervlakte kijken, maar naar de hoogte en de breedte afzonderlijk.

Stel, je wilt 2 knoppen naast elkaar plaatsen in een rechthoek van 100 breed en 40 hoog, met een marge van 10 rondom en tussen de knoppen.
In de breedte is dan 100-3*10=70 beschikbaar voor iedere knop.
In de hoogte is dan 40-2*10=20 beschikbaar voor iedere knop.
Omdat de knoppen vierkant zijn, zijn je knoppen dus maximaal 20*20 groot.

Dit werkt natuurlijk ook als je knoppen niet vierkant zijn.
Stel dat je knop 1,5 keer breder is dan hoog. Dan heb je in de hoogte 20 beschikbaar per knop, en in de breedte 35-> Je knoppen worden 30*20

- This line is intentionally left blank -