Last active
January 14, 2019 22:27
-
-
Save lennyferguson/d5914bf35e53951d8b8e7c608180110f to your computer and use it in GitHub Desktop.
Example of a function that generates a range of font sizes from min -> max -> min modeling the traversal of a sin wave
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from typing import List, TypeVar, Callable | |
from math import sin, pi | |
# TypeVar for a generic number type | |
Num = TypeVar('Num', int, float) | |
""" | |
Function that generates a List of integers that represent a interpolation of font sizes from min to max along | |
a sin wave function that has been transformed to have the desired properties. | |
Returns a List of Integers (List[int]) of size num_pages containing font sizes interpolated between min and max. | |
""" | |
def get_font_sizes(num_pages: int, min: int = 6, max: int = 72, round_strategy: Callable[[Num], int] = round) -> List[int]: | |
# Define a function y that transforms an input t from [0 .. 2pi] to a font size between min and max | |
amplitude = (max - min) / 2.0 | |
y = lambda t: round_strategy(amplitude * sin(t - (pi / 2.0)) + amplitude + min) | |
# Transform the range of inputs from [0 .. N] to [0 .. 2*pi] where N = num_pages | |
delta = 2.0 * pi / num_pages | |
# Invoke y with inputs translated to [0 .. 2pi] using delta constant | |
return [ y(t) for t in [ delta * n for n in range(num_pages) ] ] | |
# Example of interpolating over 40 pages from min to max back to min between 6 and 72 | |
pages = 40 | |
sizes = get_font_sizes(pages) | |
print("Example 1:\n{}\n".format(sizes)) | |
# This example interpolates between size 10 and 60 instead of the default 6 and 72 | |
pages = 100 | |
sizes = get_font_sizes(pages, 10, 60) | |
print("Example 2:\n{}\n".format(sizes)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment