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

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.

Related

How does one place points around a given axis? [duplicate]

This question already has answers here:
In Unity Calculate Points a Given Distance Perpendicular to a Line at Angles on a Circle
(2 answers)
Closed 1 year ago.
I have been searching for solutions for some time because I just can't wrap my head around complex math formulas.
So, I placed a vector in 3D space, with a position and a direction. Then now I want to place n amount of points equally spaced around this vector with the axis being the direction of the vector.
I'm working in Unity with C#, but pseudocode or even just an explanation is fine by me.
Edit:
Here is a picture that I made to show you what I mean.
The sphere is the vector, the arrow is the direction/axis and the
torus is where I want my points to go. I know how to place points around a circle equally spaced, my code for it is here:
for (int i = 0; i < detail; i++) {
float angle = i * Mathf.PI * 2f / detail;
Vector3 vert = new Vector3(0, Mathf.Sin(angle) * size, Mathf.Cos(angle) * size);
verticies[i] = vert + position;
}
My main problem is that I don't know 'rotate' the points to the new axis.
If you want the points to be around the axis in a circle, you can use the following method:
Calculate the gap between the points in degrees by dividing 360 by the number of points.
Then calculate the position of a point on the circle using its position on the circle (ex: for the 5th point out of 10 points, it is 360/10*5) and the radius of the circle, from this you can simply figure out the position in space using some trigonometry (using Mathf or Math classes).
I hope this helped.

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.

Specify a Triangle's Vertices based on radius and center coordinate

Is there a code formula for this? I am using C# and XNA, and in my class I have an array of three vectors (representing the vertices of the triangle), as well as a separate vector coordinate.
I plan to update these positions in the loop as it escalates further towards the top of the screen.
I'd ask maths.stackexchange.com, but seeing as how this applies to programming (and I personally am better at reading code as opposed to math itself - I'm still taking Algebra in school), I think it would make more sense for me to ask it here.
Edit
Yes, I am looking for an equilateral triangle. Or any triangle, for that matter. It doesn't matter what it is. All I am looking for is a formula; is that so hard to ask for?
Teh Problem
Basically, the problem I am trying to solve is to shoot a triangle out of my player (think Space Invaders; i.e., the triangle acts as a ray from the ray gun). What I need is a formula of code which will allow the triangle to be rendered based on its center position and radius, as the triangle will move upwards on its Y coordinate. I have the draw calls, and they work, but the problem is that the triangle when put in a for loop draw iteration (where the center vector position - on the Y coordinate - is incremented by N) simply sits next to the player's position when being drawn.
I think this is what you are looking for...
the angle is the orientation of the triangle...
this build a triangle....
void BuildTriangle(Vector2 Center, float Radius, float Angle, Vector2[] tri)
{
for (int i=0; i<3; i++)
{
t[i].X = Center.X + Radius * (float) Math.Cos(Angle + i * 2 * MathHelper.PI/3);
t[i].Y = Center.Y + Radius * (float) Math.Sin(Angle + i * 2 * MathHelper.PI/3);
}
}
if you want to move it, add to the center a velocity vector and rebuild it...

Intersecting points of curve!

I am drawing an arc within a square or a polygon with the maximum possible radius inside.
When the arc is drawn within the boundary of the square or polygon,
the arc length will intersect at few points on the square or polygon.
How to find the coordinates of the intersecting points of arc at the periphery of the square/ polygon?
The line segment of the polygon has (or hasn't) a tangent point whose distance from the center point of the arc is the arc radius.
If that is the problem then project two lines parallel to the segment on either side of the segment at a distance of radius, then determine if either line intersects arc center point, if not, no tangent exists...
if so, the point of intersection relative to the projected segment is proportional to the tangent on the original segment.
The arc will intersect those segments of the boundary, which are of distance R from the center of the arc, where R is the radius of the arc. The intersection points are the projections of the center onto the given segments.
Therefore you can find all distances from the center to the segments and find those that match the radius. Then find the projections.

Aligning text on diagonal path

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");

Categories