/// <summary> /// Проверяет, пересекает ли отрезок с переданными концами это тело. /// </summary> /// /// <param name="cs1"> Система координат, в которой задается vector1.</param>м /// <param name="cs2"> Система координат, в которой задается vector2.</param> /// <param name="vector1"> Конец отрезка, заданный в системе координат cs1. Если равен null, то принимается за нулевой вектор.</param> /// <param name="vector2"> Конец отрезка, заданный в системе координат cs2. Если равен null, то принимается за нулевой вектор.</param> /// /// <returns> /// true, если пересекает, false — если нет. /// </returns> public static bool IsCrossing(CoordinateSystem cs1, CoordinateSystem cs2, Vector vector1 = null, Vector vector2 = null) { if (cs1 == null) { throw new ArgumentNullException("body1 mustn't be null"); } if (cs2 == null) { throw new ArgumentNullException("body2 mustn't be null"); } Vector v1 = cs1.GetVectorFromRoot(vector1); Vector v2 = cs2.GetVectorFromRoot(vector2); foreach (Body body in Body.Bodies) { if (body.VectorFromRoot != v1 && body.VectorFromRoot != v2 && body.IsCrossing(cs1.ConvertTo(body, vector1), cs2.ConvertTo(body, vector2))) { return(true); } } return(false); }
/// <summary> /// Переводит вектор point, заданный в этой системе координат в систему координат System. /// </summary> /// /// <param name="system"> Новая система координат.</param> /// <param name="point"> Переводимый вектор. Если отсутствует, то принимается за нулевой вектор.</param> /// /// <returns> /// Переведенный вектор. /// </returns> /// /// <exception cref="ArgumentNullException"> /// Вызывается при передаче null в параметр system. /// </exception> public Vector ConvertTo(CoordinateSystem system, Vector point = null) { if (system == null) { throw new ArgumentNullException("system mustn't be null"); } if (point == null) { point = new Vector(0.0, 0.0, 0.0); } return(system.TransitionMatrixRelativelyRoot.Inversed * (GetVectorFromRoot(point) - system.GetVectorFromRoot())); }