Marco Antonio
Marco Antonio

Reputation: 339

How to calculate a point horizontaly projected to an angled line

enter image description here

We are using Unity C#. This image is a simplified 2D situation, in which we know the coordinates (x,y) of points p1 and p2.

We know the angle Theta, using this beauty

static float CalculateAngle(Vector3 p1, Vector3 p2)
{ return Quaternion.FromToRotation(Vector3.right, p1 - p2).eulerAngles.z; }

// The use of Vector3.right make zero degrees start at 3h00
// The values of z are irrelevant in this post, always zeroed.

Now a new point p3 shows up, imagine a screen touch, so we know it's coordinates (x,y). In essence, everything blue in the image, we know it's values.

The question is this: how to calculate a new p4 coordinates, in which

How to calculate the unknown p4.x, to have the full p4(x,y) coordinates, using Unity C#?

Upvotes: 2

Views: 229

Answers (3)

Ruzihm
Ruzihm

Reputation: 20249

This will solve your problem, and it also works for p1,p2, and/or p3 with different depths:

Create a plane where Y=p3.y, and then raycast from p1->p2 to find where it intersects.

Plane plane = new Plane(Vector3.up, p3);
float enter;
Ray ray = new Ray(p1, p2-p1);

bool doesIntersect = plane.Raycast(ray, out enter);
if (doesIntersect) {
    Vector3 p4 = ray.GetPoint(enter); 
    DoStuff(p4.x); 
}

If you need to project along a non-horizontal direction, you'll need to use a different normal than Vector3.up.

Upvotes: 0

Fabian Bigler
Fabian Bigler

Reputation: 10895

There may be easier solutions out there. The basic Math solution is as follows:

  1. Calculate the linear function of p1 and p2 as mentioned here. An equation in the slope-intercept form is written as

y = mx + b

where m is the slope of the line and b is the y-intercept.

  1. Insert P3's y into the form.
  2. Solve x.

Example in C# for Unity:

Vector3 p1 = new Vector3(1f, 2f);
Vector3 p2 = new Vector3(2f, 3f);
Vector3 p3 = new Vector3(1000f, 5f);
Vector3 p4 = Vector3.zero;

float m = ((p2.y - p1.y) / (p2.x - p1.x));
float b = p1.y - (m * p1.x);

// x = ( y - b ) / m
p4.x = (p3.y - b) / m;
p4.y = p3.y;

print(p4); // (4.0, 5.0, 0.0) as expected

Upvotes: 3

Roger Hill
Roger Hill

Reputation: 4099

Linear functions are of the form y = mx + b, where m is the slope and b is the vertical shift. If P3 is a point with an xy values, then you can take the slope, the offset, and y and solve for x:

(y - b) / m = x 

This is more of a general math question than a unity specific question; in the future, I'd suggest trying the stack exchange math site.

Upvotes: 0

Related Questions