Найти координаты четвертой вершины прямоугольника по трем заданным - C#

Узнай цену своей работы

Формулировка задачи:

1)Ввести целочисленные координаты трех вершин прямоугольника, стороны которого параллельны координатным осям. Найти координаты его четвертой вершины. Если пользователь введёт координаты точек так, что нельзя по- лучить прямоугольник со сторонами, параллельными координатным осям, вывести соответствующее сообщение. Помогите пожалуйста.

Решение задачи: «Найти координаты четвертой вершины прямоугольника по трем заданным»

textual
Листинг программы
using System;
 
namespace ConsoleApplication1
{
 
    /// <summary>
    /// Класс точки, представленной 2-мя координатами.
    /// </summary>
    class Point
    {
        public Point() { }
 
        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }
 
        public int X { get; set; }
        public int Y { get; set; }
 
        public override string ToString()
        {
            return String.Format("X = {0}, Y = {1}", X, Y);
        }
 
        /// <summary>
        /// Сложение точки с вектором. Результат -точка, смещённая на заданный вектор.
        /// </summary>
        public static Point operator +(Point pt, Vector v)
        {
            return new Point(pt.X + v.X, pt.Y + v.Y);
        }
    }
 
    /// <summary>
    /// Класс вектора, представленный 2-мя координатами.
    /// </summary>
    class Vector
    {
        public Vector(int x, int y)
        {
            X = x;
            Y = y;
        }
 
        public Vector(Point ptStart, Point ptEnd)
        {
            X = ptEnd.X - ptStart.X;
            Y = ptEnd.Y - ptStart.Y;
        }
 
        public int X { get; set; }
        public int Y { get; set; }
 
        /// <summary>
        /// Скалярное произведение 2-х векторов.
        /// </summary>
        public static int ScalarProd(Vector v1, Vector v2)
        {
            return v1.X * v2.X + v1.Y * v2.Y;
        }
 
        /// <summary>
        /// Сложение 2-х векторов, результат - вектор.
        /// </summary>
        public static Vector operator +(Vector v1, Vector v2)
        {
            return new Vector(v1.X + v2.X, v1.Y + v2.Y);
        }
    }
 
    class Program
    {
        /// <summary>
        /// Вспомогательная функция для конвертации строки в экземпляр точки (Point)
        /// В строке через пробел должны быть записаны 2 целые координаты.
        /// </summary>
        static Point stringToPoint(string str)
        {
            string[] coordStrings = str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            if (coordStrings.Length != 2)
                throw new ArgumentException("Недопустимый ввод.");
 
            Point pt = new Point();
            pt.X = Int32.Parse(coordStrings[0]);
            pt.Y = Int32.Parse(coordStrings[1]);
 
            return pt;
        }
 
        static void Main(string[] args)
        {
            Point[] points = new Point[3]; // 3 точки, задаваемые пользователем.
            
            Console.WriteLine("Введите (через пробел) координаты 3-х точек предполагаемого прямоугольника: ");
            Console.WriteLine("Первая точка: ");
            points[0] = stringToPoint(Console.ReadLine());
            Console.WriteLine("Вторая точка: ");
            points[1] = stringToPoint(Console.ReadLine());
            Console.WriteLine("Третья точка: ");
            points[2] = stringToPoint(Console.ReadLine());
            
            /* // Оставлено для тестирования (чтобы пропускать пользовательский ввод).
            points[0] = new Point(1, 2);
            points[1] = new Point(1, 4);
            points[2] = new Point(5, 4);
            // ptMissing = new Point(5, 2);
            */
 
            /*
            points[0] = new Point(1, 4);
            points[1] = new Point(5, 4);
            points[2] = new Point(5, 2);
            // ptMissing = new Point(1, 2);
            */
 
            /*
            points[0] = new Point(1, 2);
            points[1] = new Point(5, 4);
            points[2] = new Point(5, 2);
            // ptMissing = new Point(1, 4);
            */
 
            /*
            points[0] = new Point(1, 4);
            points[1] = new Point(1, 2);
            points[2] = new Point(5, 2);
            // ptMissing = new Point(5, 4);
            */
 
            /*
            points[0] = new Point(1, 4);
            points[1] = new Point(1, 2);
            points[2] = new Point(5, 1);
            // Не прямоугольник.
            */
 
            int rightAnglePointId = -1; // Индекс точки, соответствующей прямому углу.
 
            // Скалярное произведение векторов, образующих прямой угол равно 0,
            // находим точку, соответствующую прямому углу.
            Vector v01 = new Vector(points[0], points[1]);
            Vector v12 = new Vector(points[1], points[2]);
            Vector v20 = new Vector(points[2], points[0]);
 
            if (Vector.ScalarProd(v01, v12) == 0)
                rightAnglePointId = 1;
            else if (Vector.ScalarProd(v12, v20) == 0)
                rightAnglePointId = 2;
            else if (Vector.ScalarProd(v20, v01) == 0)
                rightAnglePointId = 0;
            else
            {
                // Не обнаружили прямого угла.
                Console.WriteLine("Введённые точки не соответствуют прямоугольнику.");
                return;
            }
 
            // Недостающую точку находим по правилу сложения векторов:
            // берём имеющийся у нас один прямой угол; складываем координаты точки прямого угла и 2-х векторов,
            // исходящих из этой точки.
            Point ptMissing = new Point();
            switch (rightAnglePointId)
            {
                case 0:
                    ptMissing = points[0] + new Vector(points[0], points[1]) + new Vector(points[0], points[2]);
                    break;
 
                case 1:
                    ptMissing = points[1] + new Vector(points[1], points[0]) + new Vector(points[1], points[2]);
                    break;
 
                case 2:
                    ptMissing = points[2] + new Vector(points[2], points[1]) + new Vector(points[2], points[0]);
                    break;
            }
 
            // Вывод результатов.
            Console.WriteLine("Введённые точки:");
            foreach(Point pt in points)
            {
                Console.WriteLine(pt);
            }
            Console.WriteLine("Недостающая точка:");
            Console.WriteLine(ptMissing);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы