Click here to Skip to main content
12,507,845 members (52,336 online)
Click here to Skip to main content
Add your own
alternative version

Stats

139.8K views
4.2K downloads
45 bookmarked
Posted

Using SetWorldTransform() to rotate basic shapes by any angle

, 24 Feb 2002
Rate this:
Please Sign up or sign in to vote.
How to use SetWorldTransform() to draw basic shapes rotated by any angle

Introduction

MFC provides many functions to draw basic shapes, such as rectangle, ellipse, polygon, etc. It’s just a piece of cake. Also, a rectangle rotated 45 degrees can be drawn easily after doing a little math. But what if we want to rotate these shapes to a weird angle, say 11 degrees? Or we want to rotate an ellipse by 37 degrees?

Use SetWorldTransform() can free you from all the mathematics.

Details

First of all, let’s review the definition of rotation: the rotation performs a geometric transform which maps the position (x1, y1) of a picture element in an input image onto a position (x2, y2) in an output image by rotating it through a user-specified angle q about an origin (x0, y0).

The formula is:

x2 = cos(q)*(x1-x0) – sin(q)*(y1-y0) + x0;
y2 = sin(q)*(x1-x0) + cos(q)*(y1-y0) + y0; // ------ (1)

where (x0, y0) are the coordinates of the center of rotation (in the input image) and q is the angle of rotation with clockwise rotations having positive angles.

Note here that we are working in image coordinates, so the y axis goes downward. With above formulas in mind, let’s check what SetWorldTransform() can do for us.

From MSDN, it’s said that using SetWorldTransform(), for any coordinates (x, y) in world space, the transformed coordinates in page space (x’, y’) can be determined by the following algorithm:

x’ = x * eM11 + y * eM12 + eDx;
y’ = x * eM12 + y * eM22 + eDy; // ------ (2)

Compare these two groups of formulas, we can get the correct values for parameter xform:

xform.eM11 = cos(q);
xform.eM12 = sin(q);
xform.eM21 = -sin(q);
xform.eM22 = cos(q);
xform.eDx = x0 – cos(q)*x0 + sin(q)*y0;
xform.eDy = y0 – cos(q)*y0 - sin(q)*x0;

That’s all the myth. Included is a simple project to demonstrate it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

lucy
Software Developer
Canada Canada
I love this place!

You may also be interested in...

Pro
Pro

Comments and Discussions

 
NewsHelping me eleven years later! Pin
Alasdair Craig4-Sep-13 8:44
memberAlasdair Craig4-Sep-13 8:44 
GeneralOutstanding! Good suppliment to the MFC docs Pin
Bruff16-Mar-11 5:02
memberBruff16-Mar-11 5:02 
GeneralRotating bitmap with any angle with out usinf MFC Pin
swethakiran3-Feb-08 17:31
memberswethakiran3-Feb-08 17:31 
GeneralAmazing, but isn't it a little obvious Pin
ArtiBen25-Jun-07 3:52
memberArtiBen25-Jun-07 3:52 
Generalcode to change orientation. Pin
chinesepatriotleague30-May-07 19:33
memberchinesepatriotleague30-May-07 19:33 
GeneralThank you so much! Pin
freeman86827-Mar-07 21:17
memberfreeman86827-Mar-07 21:17 
QuestionWhat is the Logic behind the API CreateRoundRectRgn() or code Pin
prabhashmandal18-Aug-06 3:10
memberprabhashmandal18-Aug-06 3:10 
GeneralCombine with scaling... Pin
RYU^^9-Oct-05 4:37
memberRYU^^9-Oct-05 4:37 
GeneralRe: Combine with scaling... Pin
ArtiBen25-Jun-07 3:54
memberArtiBen25-Jun-07 3:54 
GeneralWinCE Equivalent Pin
Meenu_Sachdeva23-May-05 5:26
memberMeenu_Sachdeva23-May-05 5:26 
GeneralVery good! Pin
andystone6-May-05 19:48
memberandystone6-May-05 19:48 
GeneralPrint Pin
bitmensch13-Feb-05 22:51
memberbitmensch13-Feb-05 22:51 
GeneralSeries of circles Pin
Jolyn13-Dec-03 14:37
memberJolyn13-Dec-03 14:37 
GeneralIt can't work for Windows 95/98/Me Pin
Danney15-Apr-03 22:26
memberDanney15-Apr-03 22:26 
GeneralRe: It can't work for Windows 95/98/Me Pin
jdunlap26-Sep-03 10:06
memberjdunlap26-Sep-03 10:06 
GeneralI need to rotate the whole form (A graphical editor) Pin
Dhirendra10-Mar-03 2:32
memberDhirendra10-Mar-03 2:32 
GeneralRe: I need to rotate the whole form (A graphical editor) Pin
Barty791-Jul-05 5:03
memberBarty791-Jul-05 5:03 
GeneralRe: I need to rotate the whole form (A graphical editor) Pin
Dhirendra3-Jul-05 20:00
memberDhirendra3-Jul-05 20:00 
Generalresizing and moving images as in Word Art Pin
sreemail13-Dec-02 23:24
membersreemail13-Dec-02 23:24 
GeneralRe: resizing and moving images as in Word Art Pin
ArtiBen25-Jun-07 3:58
memberArtiBen25-Jun-07 3:58 
GeneralNice! But show the posibilities! :) Pin
Lars [Large] Werner13-Dec-02 9:41
memberLars [Large] Werner13-Dec-02 9:41 
GeneralNice description and demonstration Pin
Shog95-Mar-02 6:08
memberShog95-Mar-02 6:08 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.160927.1 | Last Updated 25 Feb 2002
Article Copyright 2002 by lucy
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid