Intersection between two lines in coordinates
2d, intersection, iphone, math, objective-c
Solution
If I understand your question correctly, you need to determine the intersection point of two line segments. This should work with the following method:
- (NSValue *)intersectionOfLineFrom:(CGPoint)p1 to:(CGPoint)p2 withLineFrom:(CGPoint)p3 to:(CGPoint)p4
{
CGFloat d = (p2.x - p1.x)*(p4.y - p3.y) - (p2.y - p1.y)*(p4.x - p3.x);
if (d == 0)
return nil; // parallel lines
CGFloat u = ((p3.x - p1.x)*(p4.y - p3.y) - (p3.y - p1.y)*(p4.x - p3.x))/d;
CGFloat v = ((p3.x - p1.x)*(p2.y - p1.y) - (p3.y - p1.y)*(p2.x - p1.x))/d;
if (u < 0.0 || u > 1.0)
return nil; // intersection point not between p1 and p2
if (v < 0.0 || v > 1.0)
return nil; // intersection point not between p3 and p4
CGPoint intersection;
intersection.x = p1.x + u * (p2.x - p1.x);
intersection.y = p1.y + u * (p2.y - p1.y);
return [NSValue valueWithCGPoint:intersection];
}
Problem
I can detect the intersection point of two lines, but if my line don't has the length of my screen, it detects the point, where it shouldn't be. Here a preview: So, it shouldn't detect this intersection because the horizontal line isn't that long. Code: ``` - (NSMutableArray *) intersectWithLines:(CGPoint)startPoint andEnd:(CGPoint)endPoint { NSMutableArray *intersects = [[NSMutableArray alloc] init]; for(GameLine *line in [_lineBackground getLines]) { double lineStartX = line.startPos.x; double lineStartY = line.startPos.y; double tempEndX = line.endPos.x; double tempEndY = line.endPos.y; double d = ((startPoint.x - endPoint.x)*(lineStartY - tempEndY)) - ((startPoint.y - endPoint.y) * (lineStartX - tempEndX)); if(d != 0) { double sX = ((lineStartX - tempEndX) * (startPoint.x * endPoint.y - startPoint.y * endPoint.x) - (startPoint.x - endPoint.x) * (lineStartX * tempEndY - lineStartY * tempEndX)) / d; double sY = ((lineStartY - tempEndY) * (startPoint.x * endPoint.y - startPoint.y * endPoint.x) - (startPoint.y - endPoint.y) * (lineStartX * tempEndY - lineStartY * tempEndX)) / d; if([self isValidCGPoint:CGPointMake(sX, sY)]) { [intersects addObject:[NSValue valueWithCGPoint:CGPointMake(sX, sY)]]; } } } return intersects; } ```