public static DistancePointToLineSegment ( Vector2 p, Vector2 a, Vector2 b ) : float | ||
p | Vector2 | |
a | Vector2 | |
b | Vector2 | |
return | float |
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); }
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; }
/// <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); }