Aligning text on diagonal path - c#

I have two points that draw a line when connected. The line can be both vertical horizontal, vertical, or (most commonly) diagonal.
I would like to try text along this path. I'm using C# and WinForms, but I think that isn't as important as some simple psuedo-code that may include some math (trig?) needed to find the angle of the path to align the text to.

Use Math.Atan2() to calculate the angle. Convert from radians to degrees by multiplying by 180 / Math.Pi. Getting the center of rotation for RotateTransform() is the critical step to get the text aligned properly with the line. r * Math.Cos(angle) for the X-offset from the line start point, r * Sin(angle) for the Y-offset where r is the offset from the line start point. Adjust by the font's Height to get it above the line.

If you are drawing the text in an OnPaint() method, you can try this (reference):
Graphics g = e.Graphics; // your graphics object.
float deg = 45F; // an angle, this one is 45 degrees
g.RotateTransform(deg);
g.DrawString("slopey text is fun");

Related

Find max radius of an arc between two lines in 3D

I have found this solution to draw an arc between two points in 3D.
solution
Can anyone help to find a way how two limit the radius so the arc starts at max half distance of the shorter line
I have tried some simple geometry method of finding hal of angle between the lines and then calc the radius from r = tan(half_angle) but this works only for an angle close to 45 deg.
The maximum radius of an arc between two lines in 3D depends on the distance between the lines and the angle between them. The radius of the arc is given by: code example :
r = (d / 2) / sin(theta / 2)
Where d is the distance between the lines, and theta is the angle between the lines. The radius r is the maximum possible radius of the arc that can be formed between the lines, such that the arc lies in the plane that is perpendicular to the direction vectors of both lines and bisects the angle between the lines.

Drawing an arc with negative rectangle c#

I'm trying to draw an arc of a circle in C#. The general code to do this is:
e.DrawArc(pen, x, y, d, d, startAngle, endAngle - startAngle);
Where x and y indicate the upper left corner of the Rectangle and d the width of the Rectangle (also the diameter of the arc).
The problem I'm facing is that sometimes I need to draw an arc whoose rectangle x and y values lie outside the bitmap I'm drawing onto (they may even be negative), and thus the arc is not being drawn at all.
Any ideas?
Thanks!
Okay, so I solved it using the Graphics.DrawCurve(pen, points[]) method. I calculated multiple points of the circle doing some math and plotted them as a curve. The result is pretty neat (around 20 points I can't tell that it's not an actual circle), and it works no matter where I want to draw the arc.

Find the angle between any point inside a circle and the up vector direction

I have a circle with the up vector direction is Vector(0, -1) and a point, B which could be anywhere on that circle. I know its exact position inside the circle. The (0,0) point is located on the top left of the image.
How can I find the angle x between the point B and the up vector, relative to center of the circle?
I am developing a game in XNA and C#.
Update: I do not understand why this question is marked as not about programming. Anyway here's what I have done so far.
I can find the radian between two vectors
private float radianBetweenVectors(Vector2 a, Vector2 b)
{
return (float)Math.Atan2(b.Y - a.Y, b.X - a.X);
}
But I do not want to know about the location of the up vector on the sprite image if possible. The location here is the point at which it starts at 0 degree on the circle's circumference .
Update 2:
Once I have the angle, I want to obtain the rotation matrix:
Matrix rotMatrix = Matrix.CreateRotationZ(angle);
Now I have this matrix containing the rotation, I can ask XNA to transform the Up vector with this rotation:
moveDirection = Vector2.Transform(up, rotMatrix);
This I hope will take the original up direction, transform it with the rotation around the Z axis. I am still trying to figure out if this is the correct approach.
Find relative x and y coordinates of point B from center of the circle. (You can do this if you know the radius of the circle). If the circle diameter is the width of the sprite, just divide width by two to get radius. Then use arc tangent.
I'll try to help you out since I started XNA when I was relatively young and before I had any experience with vectors and you might be in the same position I was in 5 years ago.
If you don't understand the math behind it, you just treat point B as a point on a triangle that is formed from the 3 lines. I'll use (0,0) as the center of the circle, you can calculate the relative position of the center of the circle from the absolute position given radius. (If you can't do this part, you'll need to pay more attention in math class).
(0,0) to (0, B.y) will be the vertical leg.
(0, B.y) to (B.x, B.y) will be the horizontal leg
(B.x, B.y) to (0,0) will be the hypotenuse.
Then you use tangent with the rule tangent = opposite/adjacent. So you will know the distance of the opposite leg from the angle X is the distance from (0, B.y) to (B.x, B.y), the horizontal leg. The adjacent leg distance is (0,0) to (0, B.y). No need for distance formula, just subtract the coordinates. Now you have the value of tangent and want to find the value of X, so we'll use arctan. Math.Atan2(opposite/adjacent). That will give you your answer in radians.
Edit: Oh and I remember you can draw the sprite so the center of the sprite will be rendered at the center of the sprite bitmap using the origin argument of draw. That way you don't have to worry about calcuating the center of the circle.
Speaking mathematically, if you have two vectors, lets supose A(0, -1) and B(222, 90) the angle X between the two vectors can be computed as cos(X)=(A.B)/(||A||.||B||).
A x B = (a1 x b1) + (a2 x b2) = 0x222 + (-1x90) = 0 - 90 = -90.
2.I. ||A|| = squareroot[0^2+(-1)^2] = sqrt[(-1)^2] = 1
2.II. ||B|| = squareroot[222^2+90^2] = sqrt(57384) ~= 239.55 (~= is approximately)
2.III. ||A||.||B|| = 1 x 239.55 ~= 239.55
Result: cos(X) ~= (-90)/(239.55) ~= X ~= cos^-1(X) ~= 1.955 radian.
For the vectors you gave above, the angle you looking for is approximately 1.955 radian.
Note: using a calculator, you will obtain the exact value, which is very close to the aproximate value.

Fitting a rectangle into screen with XNA

I am drawing a rectangle with primitives in XNA. The width is:
width = GraphicsDevice.Viewport.Width
and the height is
height = GraphicsDevice.Viewport.Height
I am trying to fit this rectangle in the screen (using different screens and devices) but I am not sure where to put the camera on the Z-axis. Sometimes the camera is too close and sometimes to far.
This is what I am using to get the camera distance:
//Height of piramid
float alpha = 0;
float beta = 0;
float gamma = 0;
alpha = (float)Math.Sqrt((width / 2 * width/2) + (height / 2 * height / 2));
beta = height / ((float)Math.Cos(MathHelper.ToRadians(67.5f)) * 2);
gamma = (float)Math.Sqrt(beta*beta - alpha*alpha);
position = new Vector3(0, 0, gamma);
Any idea where to put the camera on the Z-axis?
The trick to doing this is to draw the rectangle directly in raster space. This is the space that the GPU works in when actually rendering stuff.
Normally your model starts in its own model space, you apply a world transform to get it into world space. You then apply a view transform to move the points in the world around the camera (to get the effect of the camera moving around the world). Then you apply a projection matrix to get all those points into the space that the GPU uses for drawing.
It just so happens that this space is always - no matter the screen size - from (-1,-1) in the bottom left corner of the viewport, to (1,1) in the top right (and from 0 to 1 on the Z axis for depth).
So the trick is to set all your matrices (world, view, project) to Matrix.Identity, and then draw a rectangle from (-1,-1,0) to (1,1,0). You probably also want to set DepthStencilState.None so that it doesn't affect the depth buffer.
An alternative method is to just use SpriteBatch and draw to a rectangle that is the same size as the Viewport.

Calculating the x and y of rotated image

When we rotate any object like Image then its x and y will also change according to the
roation angle.
I just want to know how we can calculate the outer rectangle x and y ( pointed with red
circle in the image ) while rotating the image. We have image width, height and
rotation angle ?
x - your x coordinate
height - height of your image
angle - rotation angle
Then you need (x - height * sin(angle))
One usually uses a Rotation Matrix for such a thing.
In linear algebra, a rotation matrix is a matrix that is used to
perform a rotation in Euclidean space
This web page contains a section on rotation which should be useful to explain the concept.

Categories