Monthly Archives: February 2016

Box with non vertical sides

box

While creating a perch for our parrot, I stumbled upon something non trivial : if you want to assemble a box with non vertical sides, what cut angle are you supposed to use to have a nice assembly ? It’s obvious that it should be a trapeze, but what would be the α angle ?

Screenshot from 2016-02-16 13:21:13Easy peasy, let’s dig into the maths!

On the schematics, once assembly is done, we have B=B’ and A,B, B’, A’ in same plane.

Supposing that we have an angle β with vertical (meaning a standard box has β=0), this means

\( tan(\alpha)=\frac{AB}{OA}=\frac{OA’.sin(\beta}{OA}\)

as OA = OA’, we have trivially \(\alpha=atan(sin(\beta))\)

If you need to be convinced, the animation above is done with β=30°. It’s been realized with pov and the code can be found on my POV repository on bitbucket.

And by the way, why did I need that ? Just to make it real :

IMG_20160214_162044

 

 

Je regarde youtube

Pour changer, voilà un article en français. J’ai longuement hésité à le faire, puis je me suis lancé. Avec 10 ans de retard, je découvre youtube. J’ai un peu honte, je travaille dans la technologie, j’ai travaillé dans l’industrie des médias et c’est seulement maintenant que je m’intérèsse à ce nouveau média.

Pour moi, youtube, c’était des mauvaises vidéos de chat, c’était des gens qui tombent filmés en SD, surencodés et pixellisés, c’était également du contenu copyrighté dont la légalité avait souvent la même odeur que la qualité. Et petit à petit, je me suis mis à regarder de plus en plus de vidéos et à changer d’avis.

Tout d’abord, youtube est certes un repaire de pré-ado, surtout en lecture. De nombreux contenus font peur, par leur naïveté ou pour la violence de leurs propos. En tant que parent, je me dis que jamais je ne laisserai un téléphone portable ou une caméra à mes enfants. Et bien sûr, je n’aurai pas le choix.

Alors oui, il y a des vidéos de gens ivres morts qui font la fête, d’accidents horribles non censurés, de gamines de 13 ans qui font des tuto maquillage hyper sexués sans se rendre compte de l’image qu’elles projettent. Ou sans se rendre compte de qui peut être derrière l’écran. Oui, il y a des viédos de chat qui font des millions de vue. Oui, Gangnam Style a fait tellement de vues qu’il a fallu coder le nombre de vues sur 64 bits. Ca fait quand même plus de deux milliards de vue sur une vidéo qui a de la publicité, probablement de quoi se payer quelques menus objets.

À côté de ces gros tubes, il y a plein d’autres choses et c’est à elles que je veux rendre hommage. Personnellement, les comiques qui passent à la TV ne me font que rarement rire, mais je me marre quand je regarde le rire jaune.

Et puis, il y a de vrais créateurs, qui passent des messages forts ou une vision alternative, de la réalité. Souvent des messages forts, artistiques, contestataires.

Ce qui m’a décidé à faire ce billet, ce sont quelques vidéos que je vais mettre ici, brutes de décoffrage

Les jeunes et la drogue, de Nad Rich’ Hard

Facebook, tu ne nous auras pas, sauf que pour certains métiers, c’est nécessaire. Ou comment la loi est impuissante devant les impératifs business (en anglais sous-titré – le texte anglais est plus policé):

Vous pensez que les motards sont tous de jeunes cintrés de vitesse. Changez d’avis avec mehdiator

Ce que sont les crises d’angoisse, avec Meghan Rienks (en anglais)

JB Bullet chante son indignation au lendemain des attentats de Charlie Hebdo (un an déjà…)

L’analyse musicale par LinksTheSun

Comment bricoler un tour avec une perceuse, par Jack Houweling (en anglais)

J’en aurais encore des centaines comme ça. Des clips, des court-métrages qui mettent une grande baffe. J’ai du faire un choix, il est forcément injuste. Il est forcément très personnel, biaisé. Peut-être même politique, qui sait. Moi pas, en tout cas.

Le point commun entre tous ces clips: ce sont des créations indépendantes, faites par de vrais artistes, souvent peu connus, souvent jeunes, toujours passionés. Des gens qui se battent pour essayer de vivre de leur passion, de se faire un nom, qui donnent de leurs trippes. Quand je compare ce que diffuse la télévision et que paient mes impôts à la qualité du contenu de Youtube, j’avoue que je fais mon choix. Oui, Youtube vit avec la publicité (ou par souscription pour les pays qui ont Youtube Red). Personnelllement, je préfère voir quelques vidéos de publicité et soutenir directement des artistes de valeur que regarder des spots entiers de publicité pour du contenu médiocre. Et parfois, même si je n’y suis pour rien, je suis un peu fier de l’entreprise pour qui je travaille qui permet à cela d’exister.

Les commentaires sont comme d’habitudes modérés et le seront fermement contre tout troll. Cet espace est ouvert au débat, pas à la haine. Et à titre de rappel, ce sont ici exprimés mes avis personnels et non ceux de mon employeur, de mon perroquet ou d’une éventuelle conspiration franc-maçonnique.

Et bien sûr, ça fait un peu plus d’un an, mais je reste charlie.

Egg shape and camshaft

cameIntroduction

For some tinkering, I wanted to be able to draw a standard, egg-shaped cam and compute the displacement it was generating.

I thought this was a trivial problem, but I couldn’t find anything, so I’ll describe the path I used. As a side note, the end-goal was to generate some 3D animation with persistence of vision, so I was somehow constrained by what as doable with this software (knowing that I don’t generate anything and just use the software, so no real way of numerical solution and such)

The approach I followed seems to have been used for centuries by architect to create egg-shaped curves.

It uses 2 parameters, that I named r and h. I’ll describe the geometrical construction and then go to the calculus phase.

As a side note, I had great fun finding all of these and coining it into an article, hope you’ll like reading it as much as I had writing it 🙂 Some other may follow on related subjects, depending on interest / time.

Construction

  • Choose a point (O), this will be your center of rotation for your cam.Screen Shot 2016-01-25 at 6.14.54 PM
  • Draw a circle S1 (black one) , centered on O and radius r
  • Draw a diameter, creating points A and B on circle intersection.
  • Draw a perpendicular diameter and pick a new point C so that OC = h
  • From now, the construction is symmetrical, I’ll focus on one side.
  • Draw a circle S2 (red one) centered on A and going through B (hence, radius = 2r )
  • let D be the intersection of S2 and OC
  • Draw a circle S3 (green one) center on C and going through D
  • Your egg-shape is now, starting from bottom : S1 to B, then S2 to D then S3

 

Calculus

Diameter of green circle

By definition,\(AD = 2r\)

Using pythagore on ACO, \(AC = \sqrt{r^{2}+h^{2}}\)

Then \(CD = \rho = 2r-\sqrt{r^{2}+h^{2}}\)

BOD Angle

If you project D on AB to have a new H point, then you have \(\widehat{HOD} = \widehat{BOD} = \beta\) and \(tan (\beta) = \frac{DH}{OH}\)

\(tan (\widehat{OAC}) = \frac{OC}{AO} = \frac{h}{r}\) then \(\widehat{OAC} = \alpha = tan^{-1}{\frac{h}{r}}\)

\(AH = 2r.cos(\alpha)\) and \(DH = 2r.sin(\alpha)\)

\( OH = AH – OA = 2r.cos(\alpha) – r = r(2.cos(\alpha)-1)\)

Finally : \(tan(\beta) = \frac{2r.sin(\alpha)}{r(2.cos(\alpha)-1)} = \frac{2.sin(tan^{-1}{\frac{h}{r}})}{2.cos(tan^{-1}{\frac{h}{r}})-1}\)

Polar coordinates

Let’s continue the fun, the end-goal is to have the polar coordinates of the cam…

We’ll use \(\theta\) as parameter and assume it’s value is 0 on AB axis. Function will have nice properties:

  • \(f(\theta+2\pi)=f(\theta)\)
  • \(f(\frac{3\pi}{2}-\theta)=f(\theta)\)

Meaning that we can focus on \([-\frac{\pi}{2},\frac{\pi}{2}]\)

On \([-\frac{\pi}{2},0]\), solution is trivial : \(f(\theta)=r\)

On \([0,\beta]\), solution is circle center on (-r,0) radius 2r, which has implicit equation

\( (x+r)^{2}+y^{2} = (2r)^2\)

Using standard polar replacements:

\( (f(\theta)cos(\theta)+r)^{2}+f^{2}(\theta)sin^{2}(\theta) = (2r)^2\)

The interesting function is now a second order equation, that can be trivially solved:

\(f(\theta)=r.(\sqrt{cos^{2}(\theta)+3}-cos(\theta))\)

On \([\beta,\frac{\pi}{2}]\), solution is circle center on (0,h) radius ρ, which has implicit equation

\( x^{2}+(y-h)^{2} = \rho^2\)

or  \(f(\theta)^{2}cos^{2}(\theta)+(f(\theta)sin(\theta)-h)^{2} = (2r-\sqrt{r^{2}+h^{2}})^2\)

Again, the interesting function is now a second order equation, which can be (not so) trivially solved:

\(f(\theta)= h.sin(\theta)+\sqrt{h^{2}sin^{2}(\theta) +5r^{2} -4r\sqrt{r^2+h^2} }\)

Limits on parameter

Due to the way the cam is built, h must be positive.

In addition, the worst case is having D aligned with O and C (actually C = D), and then, using pythagore:

\( h \in [0,\sqrt{3}]\)

Realization with Pov-Ray

Now that we’re done with the maths, it’s time to do the actual stuff. Real implementation can be found on my POV repository, core is in an include file and there is a reference example file.

The cam itself is generated using CSG : intersection of cylinder and plan, the exact same way I’ve explained before. I encapsulated it into a macro with 2 parameters, h and r. With these explanations, reading the file is really straightforward.

The polar function is implemented using a bunch of functions within POV. There are a few caveats:

  • it seems recursion is not well supported and maybe using a modulo would be smarter
  • using an horizontal egg instead of a vertical one (i.e. changing the theta reference) would allow to have a symmetrical function (the current one has a pi/2 offset)
  • POV function do not allow to use #if statement (seems to be limited to global variable). Using select is a ice workaround but is really killing readability

To have an idea of how h parameter influences the result, quick matrix of rendering with r=1 and h variable:

result

Free bonus, script used for the rendering, with some image magick in it:

#/bin/bash
BASE="came"
OUTPUT=output

find $OUTPUT -iname "$BASE*.tga" -delete
TOTAL=""
for a in `seq 0.1 0.1 1.6`; do 
 OUT=$OUTPUT/${BASE}_${a}.tga
 OUT2=${OUTPUT}/${BASE}_${a}.jpg
 TOTAL="${TOTAL} ${OUT2}"
 povray -W200 -H200 +k0.1 -Iscene/$BASE.pov -O${OUT} Declare=h_parameter=$a
 convert ${OUT} -fill white -stroke red -pointsize 40 -gravity south -annotate 0 "h:$a" ${OUT2}
done

montage ${TOTAL} -geometry +2+2 result.jpeg