4. Papiroflèxia

La Marina és una apassionada de la papiroflèxia i construeix tota mena de polígons regulars inscrits en una circumferència, com els següents:

Figura amb \(n=6\) costats (hexàgon)

Figura amb \(n=8\) costats (octògon)

PAPIRO6

PAPIRO8

Cobreix \(\approx 83\%\) del cercle

Cobreix \(\approx 90\%\) del cercle

Recordem que

Quan el nombre de costats \(n\) d’un polígon regular inscrit en una circumferència, augmenta, l’àrea del polígon també augmenta. Aquesta àrea s’aproxima gradualment a la superfície del cercle, que és \(\pi r^2\).

L’àrea d’un polígon regular amb \(n\) costats inscrit en una circumferència de radi \(r\) es calcula amb la fórmula següent:

\[area = \frac{nr^2}{2} \cdot sin\left(\frac{2\pi}{n}\right)\]

Per fer aquest càlcul, disposes de la funció area_poligon(r, n) ja implementada al mòdul area_pol.py

La Marina vol saber de quants costats ha de fer un polígon per cobrir un cert percentatge de la superfície d’un cercle. Per exemple, per cobrir un 80% en tindria prou amb un hexàgon, que cobreix un 83%, però per cobrir un 95% necessitaria un dodecàgon de 12 costats, que arriba al 95,5%.

Ajudem a la Marina i dissenyem, al mòdul papiroflexia (fitxer papiroflexia.py), la següent funció:

papiroflexia.perc_area(perc)

Donat un percentatge perc (en tant per cent), la funció comença amb \(n=4\) i va provant valors successius de \(n\) fins a trobar el nombre mínim de costats per obtenir un polígon regular amb un percentatge de cobertura de la superfície del cercle igual o superior a perc.

Només considerarà polígons amb un nombre parell de costats.

Retorna una llista de tuples amb informació sobre els 3 últims polígons provats, tot i que la llista pot ser més petita si la funció acaba abans. Cada tupla conté:

  • El nombre de costats (\(n\)).

  • El percentatge de superfície que cobreix el polígon de \(n\) costats, arrodonit a 4 decimals.

Comentari

El percentatge d’àrea coberta pels polígons és independent del radi del cercle. Podríeu fer servir qualsevol valor, però per acotar la imprecisió en els càlculs, us recomanem \(r=1\).

Els següents doctests mostren exemples del que ha de fer la funció:

Un quadrat cobreix el 63% de l'area del cercle en el que està inscrit
>>> ll1 = perc_area(80)    # un hexàgon cobreix més del 80% de l'area
>>> ll1
[(4, 63.662), (6, 82.6993)]

>>> ll2 = perc_area(85)    # un octògon (8 costats) cobreix més del 85% 
>>> ll2
[(4, 63.662), (6, 82.6993), (8, 90.0316)]

>>> ll3 = perc_area(60)    # un quadrat cobreix més del 60%
>>> ll3
[(4, 63.662)]

Nota

Disposes d’un joc de proves més complet al fitxer test-papiroflexia.txt

Disposes de solucions al fitxer papiroflexia.py.