DistancePointToLineSegment() public static method

Distance from a point p in 2d to a line segment defined by two points a and b.

public static DistancePointToLineSegment ( Vector2 p, Vector2 a, Vector2 b ) : float
p Vector2
a Vector2
b Vector2
return float
示例#1
0
        internal static float DistanceToDiamondInternal(Vector3 position, Quaternion rotation, float size, Vector2 mousePosition)
        {
            Vector3 b  = rotation * new Vector3(size, 0f, 0f);
            Vector3 b2 = rotation * new Vector3(0f, size, 0f);

            HandleUtility.points[0] = HandleUtility.WorldToGUIPoint(position + b);
            HandleUtility.points[1] = HandleUtility.WorldToGUIPoint(position - b2);
            HandleUtility.points[2] = HandleUtility.WorldToGUIPoint(position - b);
            HandleUtility.points[3] = HandleUtility.WorldToGUIPoint(position + b2);
            HandleUtility.points[4] = HandleUtility.points[0];
            Vector2 p    = mousePosition;
            bool    flag = false;
            int     num  = 4;

            for (int i = 0; i < 5; i++)
            {
                if (HandleUtility.points[i].y > p.y != HandleUtility.points[num].y > p.y)
                {
                    if (p.x < (HandleUtility.points[num].x - HandleUtility.points[i].x) * (p.y - HandleUtility.points[i].y) / (HandleUtility.points[num].y - HandleUtility.points[i].y) + HandleUtility.points[i].x)
                    {
                        flag = !flag;
                    }
                }
                num = i;
            }
            float result;

            if (!flag)
            {
                float num2 = -1f;
                num = 1;
                for (int j = 0; j < 4; j++)
                {
                    float num3 = HandleUtility.DistancePointToLineSegment(p, HandleUtility.points[j], HandleUtility.points[num++]);
                    if (num3 < num2 || num2 < 0f)
                    {
                        num2 = num3;
                    }
                }
                result = num2;
            }
            else
            {
                result = 0f;
            }
            return(result);
        }
示例#2
0
		internal static float DistanceToRectangleInternal(Vector3 position, Quaternion rotation, Vector2 size)
		{
			Vector3 b = rotation * new Vector3(size.x, 0f, 0f);
			Vector3 b2 = rotation * new Vector3(0f, size.y, 0f);
			HandleUtility.points[0] = HandleUtility.WorldToGUIPoint(position + b + b2);
			HandleUtility.points[1] = HandleUtility.WorldToGUIPoint(position + b - b2);
			HandleUtility.points[2] = HandleUtility.WorldToGUIPoint(position - b - b2);
			HandleUtility.points[3] = HandleUtility.WorldToGUIPoint(position - b + b2);
			HandleUtility.points[4] = HandleUtility.points[0];
			Vector2 mousePosition = Event.current.mousePosition;
			bool flag = false;
			int num = 4;
			for (int i = 0; i < 5; i++)
			{
				if (HandleUtility.points[i].y > mousePosition.y != HandleUtility.points[num].y > mousePosition.y)
				{
					if (mousePosition.x < (HandleUtility.points[num].x - HandleUtility.points[i].x) * (mousePosition.y - HandleUtility.points[i].y) / (HandleUtility.points[num].y - HandleUtility.points[i].y) + HandleUtility.points[i].x)
					{
						flag = !flag;
					}
				}
				num = i;
			}
			float result;
			if (!flag)
			{
				float num2 = -1f;
				num = 1;
				for (int j = 0; j < 4; j++)
				{
					float num3 = HandleUtility.DistancePointToLineSegment(mousePosition, HandleUtility.points[j], HandleUtility.points[num++]);
					if (num3 < num2 || num2 < 0f)
					{
						num2 = num3;
					}
				}
				result = num2;
			}
			else
			{
				result = 0f;
			}
			return result;
		}
示例#3
0
        /// <summary>
        ///   <para>Pixel distance from mouse pointer to a rectangle on screen.</para>
        /// </summary>
        /// <param name="position"></param>
        /// <param name="rotation"></param>
        /// <param name="size"></param>
        public static float DistanceToRectangle(Vector3 position, Quaternion rotation, float size)
        {
            Vector3 vector3_1 = rotation * new Vector3(size, 0.0f, 0.0f);
            Vector3 vector3_2 = rotation * new Vector3(0.0f, size, 0.0f);

            HandleUtility.points[0] = (Vector3)HandleUtility.WorldToGUIPoint(position + vector3_1 + vector3_2);
            HandleUtility.points[1] = (Vector3)HandleUtility.WorldToGUIPoint(position + vector3_1 - vector3_2);
            HandleUtility.points[2] = (Vector3)HandleUtility.WorldToGUIPoint(position - vector3_1 - vector3_2);
            HandleUtility.points[3] = (Vector3)HandleUtility.WorldToGUIPoint(position - vector3_1 + vector3_2);
            HandleUtility.points[4] = HandleUtility.points[0];
            Vector2 mousePosition = Event.current.mousePosition;
            bool    flag          = false;
            int     index1        = 4;

            for (int index2 = 0; index2 < 5; ++index2)
            {
                if ((double)HandleUtility.points[index2].y > (double)mousePosition.y != (double)HandleUtility.points[index1].y > (double)mousePosition.y && (double)mousePosition.x < ((double)HandleUtility.points[index1].x - (double)HandleUtility.points[index2].x) * ((double)mousePosition.y - (double)HandleUtility.points[index2].y) / ((double)HandleUtility.points[index1].y - (double)HandleUtility.points[index2].y) + (double)HandleUtility.points[index2].x)
                {
                    flag = !flag;
                }
                index1 = index2;
            }
            if (flag)
            {
                return(0.0f);
            }
            float num1 = -1f;
            int   num2 = 1;

            for (int index2 = 0; index2 < 4; ++index2)
            {
                float lineSegment = HandleUtility.DistancePointToLineSegment(mousePosition, (Vector2)HandleUtility.points[index2], (Vector2)HandleUtility.points[num2++]);
                if ((double)lineSegment < (double)num1 || (double)num1 < 0.0)
                {
                    num1 = lineSegment;
                }
            }
            return(num1);
        }