2D line-segment - line intersection?

Started by
2 comments, last by Scet 17 years, 11 months ago
This is probably a simple problem, but my math skills aren't that sharp. What I have is a line segment from (x1,z1) to (x2,z2) and a value z. z represents a horizontal, one-dimensional line. I've gotten to the point where I can tell if z is between the segment's points. Now I'm stuck though, I have no idea how to get the intersection point. Point consists of two variables: X and Z

		public static Point LinePlaneIntersection( Point A, Point B, short Z )
		{
			if( A.Z == Z )
			{
				return A;
			}
			if( B.Z == Z )
			{
				return B;
			}
			if( A.Z < B.Z )
			{
				if( ( Z < A.Z ) || ( Z > B.Z ) )
				{
					return null;
				}
			}
			else
			{
				if( ( Z < B.Z ) || ( Z > A.Z ) )
				{
					return null;
				}
			}
			// intersection test should go here
			return null;
		}

Anyone have any ideas? I thought about getting the slope, but what do I do after that?
Advertisement
Try:
float dx = x2 - x1;float dz = z2 - z1;if (std::fabs(dz) > 0.0f) { // Or an epsilon instead of 0.0    float t = (z1 - z) / dz;    float newX = x1 + t * dx;    float newZ = z1 + t * dz;}
Typed into post, so may or may not be correct.
You calculate the slope by
    m = (y2 - y1) / (x2 - x1)

To calculate the b-value, you put it an arbitrary point you know are on the line, with the m you know, and then solve for b.
    y = m * x + b    b = y1 - m * x1

You now know the equation of the line. Now you wonder for which (x_ans, y_ans) the line intersects with a horizontal line y = z.
We express this as an equation and solve for x
    z = m * x_ans + b    x_ans = (z - b) / m

So now we know the x for intersection, so we can easily get the y from the line equation:
    y_ans = m * x_ans + b

Edit: Oh, stupid me, y_ans will of course always be equal to z, so you're done when you know x_ans.
[s]--------------------------------------------------------[/s]chromecode.com - software with source code
Edit: Thanks guys, I'll try both methods out once I get home.

This topic is closed to new replies.

Advertisement