Skip to content
View in the app

A better way to browse. Learn more.

The AVSIM Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

HSI Rotating Numbers in GDI+

Featured Replies

Hi all,working on my HSI i have a Problem with the Numbers for that. I spent many hours to solve this but it seems i can't see what's wrong. The Numbers are Drawn and rotatet, but both in the wrong Direction. "0" Degrees is drawn at 180 degrees and then all others are Anti-Clockwise.Will Post here the Code i'm using for that and also a Picture of the Result in FSX:

// Full Arc Numbers			float cx = 194; // center point xfloat cy = 194; // center point yfloat radius = 130; // Inner Radiusdouble rotation = (AdiruND.MagHeading() * -1); // Mag Headingfloat dx,dy, nx, ny, angle;int pointx, pointy;int numbers[12] = {0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33};int i = 0;for (angle = 0.0 - rotation; angle < 358.0 - rotation; angle += 30.0){				nx = sin(angle * 3.1415926535 / 180.0);	ny = cos(angle * 3.1415926535 / 180.0);	dx = nx * radius;	dy = ny * radius;	pointx = cx + dx;	pointy = cy + dy;	Matrix matrix;  matrix.RotateAt(angle,PointF(pointx+11,pointy+11),MatrixOrderAppend);graphics.SetTransform(&matrix);RectF strRect(pointx, pointy, 22, 22);WCHAR nbr_wch[24] = L"";swprintf (nbr_wch, L"%d", numbers[i]);graphics.DrawString(nbr_wch, -1, &largeNumbers, strRect,&stringCenter,&whiteBrush);graphics.DrawRectangle(&whitePen, strRect); // As visual referencei++;}

RegardsSven

Ok, now i have it working :-) . Here is the revised Code:float radius = 130; // Number Radiusint pointx, pointy;int numbers[12] = {18, 21, 24, 27, 30, 33, 0, 3, 6, 9, 12, 15};int i = 0;for (angle = 360.0 - rotation ; angle > 2.0 - rotation; angle -= 30.0){ nx = sin(angle * 3.1415926535 / 180.0); ny = cos(angle * 3.1415926535 / 180.0); dx = nx * radius; dy = ny * radius; pointx = (cx + dx) - 11; pointy = (cy + dy) - 11; Matrix matrix; matrix.RotateAt(((angle *-1) +180), PointF(pointx+11, pointy+11), MatrixOrderAppend); graphics.SetTransform(&matrix); RectF strRect(pointx, pointy, 22, 22); WCHAR nbr_wch[24] = L""; swprintf (nbr_wch, L"%d", numbers); graphics.DrawString(nbr_wch, -1, &largeNumbers, strRect, &stringCenter, &whiteBrush); i++;}Have anyone a better (or faster) Solution?RegardsSven

  • Author

>Have anyone a better (or faster) Solution?Graphics->RotateTransform (degs) etcCheers, :-beerchugEtienne :-waveEDITAh btw, for the loop you eventually *could* use something likegraphics->TranslateTransform (cx, cy);for (i = 0; i < 36; i++){ graphics->DrawThatTickMark (...) if (i % 3 == 0) DrawThatNumberString (...) graphics.RotateTransform (10);}Have not tested but something like this might work.

Ok thanks, i will try that.GreetingsSven

Ok. I've tried the following:// Full Arc{ graphics.TranslateTransform(194,194); graphics.RotateTransform(AdiruND.MagHeading() *-1); { float cx = 0; // center point x float cy = 0; // center point y float radius1 = 158; // Outer Radius float radius2 = 146; // Inner Radius float dx,dy, dx2, dy2, nx, ny, angle; int v1x, v1y, v2x, v2y; int numbers[12] = {18, 21, 24, 27, 30, 33, 0, 3, 6, 9, 12, 15}; int i = 0; for (angle = 360.0; angle > 2.0; angle -= 10.0) { nx = sin(angle * 3.1415926535 / 180.0); ny = cos(angle * 3.1415926535 / 180.0); dx = nx * radius1; dy = ny * radius1; v1x = cx + dx; v1y = cy + dy; dx2 = nx * radius2; dy2 = ny * radius2; v2x = cx + dx2; v2y = cy + dy2; graphics.DrawLine(&largeWhitePen, v1x, v1y, v2x, v2y); if(MODULO(angle,3) == 0) { RectF strRect(v1x, v1y, 24, 22); WCHAR nbr_wch[24] = L""; swprintf (nbr_wch, L"%d", numbers); graphics.DrawString(nbr_wch, -1, &largeNumbers, strRect, &stringCenter, &whiteBrush); //graphics.RotateTransform (10); i++; } } }Works, but i can't rotate the Numbers using graphics.RotateTransform(10) in the if(MODULO...) Statement. If i uncomment them a few Tickmarks and most of the Numbers disappear from the HSI. Again, could you give me some Hint how to fix this?RegardsSven

  • Author

As for the mod, the number should usually be of int type, if that helps.Also, you should not need to use that number array (you can simply take your for-loop variable to draw the appropriate number).>nx = sin(angle * 3.1415926535 / 180.0);>ny = cos(angle * 3.1415926535 / 180.0);You actually should not need to do any of that trig calc at all. That's what the xform already does for you.In pseudo code, the only thing you should need to do to e. g. draw the ticks:...TranslateTransform (cx, cy);...RotateTransform (-heading);for (...){graphics.DrawLine (&largeWhitePen, 0, radius1, 0, radius2);......RotateTransform (10);}You could also upload a picture of your current results to make it easier to understand what is going wrong.If you need more help, don't hesitate to post here or just write me a PM.Regards,Etienne

Hi Etienne,with some Help from you and others now i heave it working like it should.// Full Arc { graphics.TranslateTransform(194,194); graphics.RotateTransform(AdiruND.MagHeading() *-1); for(int i = 0; i < 358; i+= 5) { if (i % 30 == 0) { WCHAR nbr_wch[24] = L""; swprintf (nbr_wch, L"%d", (i/10)); graphics.DrawString(nbr_wch, -1, &largeNumbers, PointF(-5, -105), &whiteBrush); } if (i % 10 == 0) { graphics.DrawLine(&largeWhitePen, 0, -110, 0, -120); } graphics.RotateTransform(5.0); } }I think this is what you mean (or similar). So, thanks again.RegardsSven

  • Author

Ok yes, two things though. ;)First of all I am sure a 2-character buffer would also do instead of a 24 one, just to save some bits.And since you are not drawing anything in 5

  • Moderator

In practice, I've found that buffer should be n+1 at a minimum... ;)

Fr. Bill    

AOPA Member: 07141481 AARP Member: 3209010556


     Avsim Board of Directors | Avsim Forums Moderator
  • Author

>In practice, I've found that buffer should be n+1 at a>minimum... ;)Ahm, in practice I think you are very right... LOL :-lol There you go, obvious I have not touched any code for months now. *:-*Thanks for the heads up. :-eekCheers, :-beerchugEtienne :-wave

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.