Показать сообщение отдельно
Старый 07.08.2014, 22:28
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 2  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Тут все не так просто, нужно сначала определить пересекаются ли отрезки в принципе, затем
не углами, через углы не true.
Код AS3:
		public function lineCross(b:Point, e:Point, b1:Point, e1:Point):Boolean {
			//взято с http://progs-maker.narod.ru/algor.html
			var x1:Number = b.x;
			var y1:Number = b.y;
			var x2:Number = e.x;
			var y2:Number = e.y;
			var x3:Number = b1.x;
			var y3:Number = b1.y;
			var x4:Number = e1.x;
			var y4:Number = e1.y;
 
			var maxx1:Number = Math.max(x1, x2);
			var maxy1:Number = Math.max(y1, y2);
			var minx1:Number = Math.min(x1, x2);
			var miny1:Number = Math.min(y1, y2);
			var maxx2:Number = Math.max(x3, x4);
			var maxy2:Number = Math.max(y3, y4);
			var minx2:Number = Math.min(x3, x4);
			var miny2:Number = Math.min(y3, y4);
 
			var dx21:Number = x2 - x1, dy21:Number = y2 - y1; // Длина проекций первой линии на ось x и y
			var dx43:Number = x4 - x3, dy43:Number = y4 - y3; // Длина проекций второй линии на ось x и y
			var dx13:Number = x1 - x3, dy13:Number = y1 - y3;
 
			var div:Number, mul:Number;
			div = dy43 * dx21 - dx43 * dy21;
			if (div == 0) 
			return false; // Линии параллельны...
 
			if (div > 0) {
				mul = dx43 * dy13 - dy43 * dx13;
				if (mul < 0 || mul > div)
				return false; // Первый отрезок пересекается за своими границами...
				mul = dx21 * dy13 - dy21 * dx13;
				if (mul < 0 || mul > div) return false; // Второй отрезок пересекается за своими границами...
			} else
			{
				mul = - (dx43 * dy13 - dy43 * dx13);
				if (mul  < 0 || mul > -div)
				return false; // Первый отрезок пересекается за своими границами...
				mul = - (dx21 * dy13 - dy21 * dx13);
				if (mul < 0 || mul > -div)
				return false; // Второй отрезок пересекается за своими границами...
			}
		return true;
		}
 
		public function lineIntersect(lineAP1:Point, lineAP2:Point, lineBP1:Point, lineBP2:Point):Point {
			// http://forum.vingrad.ru/faq/topic-157574.html
			var lDetlineA:Number, lDetlineB:Number, lDetDivInv:Number, 
			lDiffLA:Point, lDiffLB :Point,
			result:Point = new Point;
			lDetlineA = lineAP1.x*lineAP2.y - lineAP1.y*lineAP2.x;
			lDetlineB = lineBP1.x*lineBP2.y - lineBP1.y*lineBP2.x;
 
			lDiffLA = lineAP1.subtract(lineAP2);
			lDiffLB = lineBP1.subtract(lineBP2);
 
			lDetDivInv = 1 / ((lDiffLA.x*lDiffLB.y) - (lDiffLA.y*lDiffLB.x));
 
			result.x = ((lDetlineA*lDiffLB.x) - (lDiffLA.x*lDetlineB)) * lDetDivInv;
			result.y = ((lDetlineA*lDiffLB.y) - (lDiffLA.y*lDetlineB)) * lDetDivInv;
			return result;
		}
Тут демка
http://www.murmadillo.tut.su/html/li...Intersect.html
__________________
Гоночка