
Is composing horz + vert shear the same thing as shearing both? 
Bruce Pascoe
Member #15,931
April 2015

That topic title was probably confusing, so here's a better explanation: Allegro has these functions for doing shear transformation: al_horizontal_shear_transform() al_vertical_shear_transform() If I call both of these in sequence, is that the same thing as shearing both X and Y simultaneously? Think of CSS transformations, it has skewX/skewY() and then just skew() to do both at the same time. I ask this because, in general, matrix multiplication is not commutative. For example translate + rotate is not the same thing as rotate + translate, and I wonder if the same caveat applies here.

SiegeLord
Member #7,827
October 2006

No, you do indeed get different effects depending on which way you skew first. To skew on both axes simulateously, you need a matrix that looks like this: 1 x 0 0 y 1 0 0 0 0 1 0 0 0 0 1 Which Allegro doesn't have a simple function to create. I'd do this: ALLEGRO_TRANSFORM t; al_identity_transform(&t); t.m[1][0] = x; t.m[0][1] = y; al_compose_transform(&your_transform, &t);
"For in much wisdom is much grief: and he that increases knowledge increases sorrow."Ecclesiastes 1:18 
Bruce Pascoe
Member #15,931
April 2015

Thanks, that's what I figured. On a related note, how would I figure out the shear factor given a skew angle? I think tan() is the right function here, but my trig is a bit rusty...

SiegeLord
Member #7,827
October 2006

Wikipedia suggests it's the cotangent, or 1/tan(angle). "For in much wisdom is much grief: and he that increases knowledge increases sorrow."Ecclesiastes 1:18 
Bruce Perry
Member #270
April 2000

Intuitively I expect it's tan if you're measuring the angle by which a horizontal or vertical line will change from its unskewed position; 1/tan if you're measuring the angle of the skewed line against the other axis.  
Bruce Pascoe
Member #15,931
April 2015

@Bruce: I'm actually trying to figure out which values to plug into the matrix for a given skew anglei.e. the angle is already known, and I need to calculate the shear factor from that. Allegro itself seems to use tan for this in al_*_shear_transform(), but like SiegeLord said Wikipedia calls to use the cotangent instead, so... yeah, I'm confused.

Bruce Perry
Member #270
April 2000

Hmm. I already knew what you were trying to do (you haven't told me anything new), and I was already trying to preempt and explain the exact confusion as to how it could be both tan and 1/tan. I assume Wikipedia is using the cotangent because their idea of an identity matrix would have an angle of 90°, whereas yours or Allegro's would have an angle of 0. (Of course remember to use radians in the implementation.) (Possibly missing piece of the puzzle: tan(angle) = 1/tan(90°  angle).) By the way, where is this on Wikipedia? [EDIT] Quote: Straight lines parallel to the xaxis remain where they are, while all other lines are turned, by various angles, about the point where they cross the xaxis. Vertical lines, in particular, become oblique lines with slope 1/m. Therefore the shear factor m is the cotangent of the angle φ by which the vertical lines tilt, called the shear angle. I think it's either unclear in its definition of the angle, or wrong. It absolutely has to be tan because tan(0) is 0 which leads to an identity matrix whereas 1/tan(0) is infinity (sort of). Who wants to fix Wikipedia?  
Bruce Pascoe
Member #15,931
April 2015

Okay, I understand you now. I got confused because you said "measuring the angle", when in my case the angle is already known (and therefore doesn't need to be measured). As for Wikipedia's definition, now that I read it again it actually seems to be correct, in a roundabout way. The article uses vertical lines as an example, but assumes the shear is along the X axis. In the case of perfectly vertical lines, the slope 1/m is either undefined or infinity, depending on how you want to interpret the division by zero. If they're measuring the angle of the oblique against the Y axisin which case perfectly vertical lines are parallel, i.e. so that the slope is 1/Infinity = 0 (for our purposes anyway)that might actually be correct. I say might because it's still very confusingly written, in any casethis is why Wikipedia is useless for any kind of mathematics research. Trigonometry is fascinating! edit + tl;dr: Wikipedia is measuring the oblique against the Y axis, not X. 1/tan is correct in that case.

