Найти координаты четвертой вершины прямоугольника по трем заданным - 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);
}
}
}