Пересечение Круга с Отрезком.

Пожалуй, буду использовать этот блог для разных полезностей, которые и самому могут потом пригодиться.

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


	public static function Line2Circle( x1, y1, x2, y2, x3, y3, r )
	{
		var k, b, d, d1, d2, xx, yy;
		var rx1, ry1, rx2, ry2;
		var res:Object = new Object();
		
		res.b_intersect1 = true;
		res.b_intersect2 = true;
		
		//сдвигаем все на координаты круга
		x1 -= x3;
		y1 -= y3;
		x2 -= x3;
		y2 -= y3;
		
		//если первый отрезок вертикальный
		if (int(x1) == int(x2))
		{
			d = r * r - x1 * x1;
			if (d < 0)
				res = 0;
			else
			{
				ry1 = Math.sqrt(d);
				ry2 = -ry1;
				res.x1 = x1 + x3;
				res.y1 = ry1 + y3;
				res.x2 = x2 + x3;
				res.y2 = ry2 + y3;
			}
		}
		else
		{
			//параметры первого отрезка
			k = (y1 - y2) / (x1 - x2);
			b = y1 - k * x1;
			
			d = k * k * b * b - (k * k + 1) * (b * b - r * r);
			if (d < 0)
				res = 0;
			else
			{
				d = Math.sqrt(d);
				rx1 = (-k * b + d) / (k * k + 1);
				rx2 = (-k * b - d) / (k * k + 1);
				ry1 = k * rx1 + b;
				ry2 = k * rx2 + b;
				res.x1 = rx1 + x3;
				res.y1 = ry1 + y3;
				res.x2 = rx2 + x3;
				res.y2 = ry2 + y3;
			}
		}

		x1 += x3;
		y1 += y3;
		x2 += x3;
		y2 += y3;
		
		//осталось отсортировать по близости к (x1, y1)
		if (res)
		{
			d1 = (res.x1 - x1) * (res.x1 - x1) + (res.y1 - y1) * (res.y1 - y1);
			d2 = (res.x2 - x1) * (res.x2 - x1) + (res.y2 - y1) * (res.y2 - y1);
			if (d2 < d1)
			{
				rx1 = res.x1;
				res.x1 = res.x2;
				res.x2 = rx1;
				ry1 = res.y1;
				res.y1 = res.y2;
				res.y2 = ry1;
			}
		}
		
		//и еще нужно проверить что попадаем в отрезок
		if (res)
		{
			if (x1 > x2)
			{
				xx = x1;
				x1 = x2;
				x2 = xx;
			}
			if (y1 > y2)
			{
				yy = y1;
				y1 = y2;
				y2 = yy;
			}
			if (res.x1 < x1 || res.x1 > x2 || res.y1 < y1 || res.y1 > y2)
			{
				res.x1 = 0;
				res.y1 = 0;
				res.b_intersect1 = false;
			}
			if (res.x2 < x1 || res.x2 > x2 || res.y2 < y1 || res.y2 > y2)
			{
				res.x2 = 0;
				res.y2 = 0;
				res.b_intersect2 = false;
			}
		}
		
		return res;
	}
  • +3

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

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