Vogd → Пересечение Отрезка с Отрезком

Функция для нахождения пересечения отрезка с отрезком (AS3).


	public static function Line2Line( x1, y1, x2, y2, x3, y3, x4, y4 )
	{
		var k1, k2, b1, b2;
		var rx, ry, xx, yy;
		var res:Object = new Object();
		
		//оба вертикальны
		if (x1 == x2 && x3 == x4)
			return 0;
		
		//первый отрезок вертикальный
		if (int(x1) == int(x2))
		{
			//параметры второго отрезка
			k2 = (y3 - y4) / (x3 - x4);
			b2 = y3 - k2 * x3;
			//пересечение второго с первым
			rx = x1;
			ry = k2 * rx + b2;
		}
		else if (int(x3) == int(x4))
		{
			//параметры первого отрезка
			k1 = (y1 - y2) / (x1 - x2);
			b1 = y1 - k1 * x1;
			//пересечение второго с первым
			rx = x3;
			ry = k1 * rx + b1;
		}
		else
		{
			//параметры первого отрезка
			k1 = (y1 - y2) / (x1 - x2);
			b1 = y1 - k1 * x1;
			
			//параметры второго отрезка
			k2 = (y3 - y4) / (x3 - x4);
			b2 = y3 - k2 * x3;

			if (k1 == k2)	//параллельны
				return 0;
				
			rx = (b2 - b1) / (k1 - k2);
			ry = k1 * rx + b1;
		}

		//проверка на попадание
		//сортируем иксы и игреки
		if (y2 < y1)
		{
			yy = y1;
			y1 = y2;
			y2 = yy;
		}
		if (y4 < y3)
		{
			yy = y3;
			y3 = y4;
			y4 = yy;
		}
		if (x2 < x1)
		{
			xx = x1;
			x1 = x2;
			x2 = xx;
		}
		if (x4 < x3)
		{
			xx = x3;
			x3 = x4;
			x4 = xx;
		}
		if (rx <= x2 && rx >= x1 && rx <= x4 && rx >= x3 && ry <= y2 && ry >= y1 && ry <= y4 && ry >= y3)
		{
			res.x = rx;
			res.y = ry;
			return res;
		}
		
		return 0;
	}
  • +5
  • 25 мая 2010, 16:47
  • Vogd

Комментарии (2)

RSS свернуть / развернуть
+
0
Еще один вариант:


public static function lineIntersect(
	a1x:Number, a1y:Number, 
	a2x:Number, a2y:Number, 
	b1x:Number, b1y:Number, 
	b2x:Number, b2y:Number
):Object {
	
	var res:Object = new Object();
	res.intersect = -1;
	res.point = new Point();
	
	var d:Number = (a1x - a2x) * (b2y - b1y) - (a1y - a2y) * (b2x - b1x); 
	var da:Number = (a1x - b1x) * (b2y - b1y) - (a1y - b1y) * (b2x - b1x);
	var db:Number = (a1x - a2x) * (a1y - b1y) - (a1y - a2y) * (a1x - b1x);
	
	if (Math.abs(d) < 0.000001) {
		res.intersect = 0;
	} else {
		var ta:Number = da / d;
		var tb:Number = db / d;
		if ((0 <= ta) && (ta <= 1) && (0 <= tb) && (tb <= 1)) {
			res.intersect = 1;
			res.point.x = a1x + ta * (a2x - a1x);
			res.point.y = a1y + ta * (a2y - a1y);
		} 
	}
	
	return res;
	
}


Если значение intersect у возвращаемого обьекта равно 1 — линии пересекаются, если -1 не пересекаются. Если равно 0 — линии параллельны.

В случае пересечения координату точки пересечения можно взять из point возвращаемого обьекта.
avatar

Nautilus

  • 20 мая 2011, 00:08
+
+2
— И руки!
— Что руки?
— Руки оторвать… за отсутствие типизации.
avatar

elmortem

  • 20 мая 2011, 00:44

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.