Среди всех точек этого множества найти пару симметричных относительно оси ОХ точек - C#
Формулировка задачи:
Доброго вечер.
Помогите, пожалуйста, с задачей:
А основной части создал массив для ввода точек:
Но не могу понять, как их правильно проверять ? Т.е. как сравнивать две точки из этого массива для нахождения симметричных ? У нас есть методы Get_x() и Get_y(), но не совсем понимаю, как с ними работать
Дано множество A из N точек на плоскости. Среди всех точек этого множества найти пару симметричных относительно оси ОХ точек с максимальным расстоянием между ними (вывести их номера и значения). Если таких точек нет, то вывести соответствующее сообщение.
Для решения есть класс Point:using System;
using System.Collections.Generic;
using System.Text;
namespace Планиметрия
{
class Point:Figure
{
// Конструкторы:
public Point()
{
Console.WriteLine("Работает конструктор класса Point без параметров");
reality=true;
FigureSizes= new double [2];
FigureSizes[0]=0;
FigureSizes[1]=0;
}
public Point(Point Ob)
{
Console.WriteLine("Работает конструктор-копировщик класса Point ");
reality = true;
FigureSizes = new double[2];
FigureSizes[0] = Ob.FigureSizes[0];
FigureSizes[1] = Ob.FigureSizes[1];
}
public Point(double x, double y)
{
Console.WriteLine("Работает конструктор класса Point с 2-мя параметрами");
reality = true;
FigureSizes = new double[2];
FigureSizes[0] = x;
FigureSizes[1] = y;
}
// Свойства:
public double koord_x
{
get
{
return FigureSizes[0];
}
set
{
FigureSizes[0] = value;
}
}
public double koord_y
{
get
{
return FigureSizes[1];
}
set
{
FigureSizes[1] = value;
}
}
public void show()
{
Console.WriteLine("x = {0:0.##} ,y = {1:0.##}",
FigureSizes[0], FigureSizes[1]);
}
public static Point operator +(Point T1, Point T2)
{
Point Trez = new Point(T1.koord_x+T2.koord_x, T1.koord_y+T2.koord_y);
return Trez;
}
public static Point operator -(Point T1, Point T2)
{
Point Trez = new Point(T1.koord_x - T2.koord_x, T1.koord_y -T2.koord_y);
return Trez;
}
public static bool operator == (Point T1, Point T2)
{
if ((T1.koord_x == T2.koord_x) && (T1.koord_y == T2.koord_y))
{
return true;
}
else return false;
}
public static bool operator != (Point T1, Point T2)
{
if ((T1.koord_x != T2.koord_x) || (T1.koord_y != T2.koord_y))
{
return true;
}
else return false;
}
public override bool Equals(object obj)
{
if (obj ==null || !(obj is Point))
return false;
else
return this==(Point) obj;
}
public override int GetHashCode()
{
return ToString().GetHashCode();
}
public void Input_Point()
{
Console.WriteLine("Введите координаты точки: ");
FigureSizes[0] = Double.Parse(Console.ReadLine());
FigureSizes[1] = Double.Parse(Console.ReadLine());
}
public double Get_x()
{
return FigureSizes[0];
}
public double Get_y()
{
return FigureSizes[1];
}
public void Set_x(double a)
{
FigureSizes[0] = a;
}
public void Set_y(double a)
{
FigureSizes[1] = a;
}
public bool Rawni_li(Point Ob)
{
return FigureSizes[0] == Ob.FigureSizes[0] && FigureSizes[1] == Ob.FigureSizes[1];
}
public void Copy(Point Ob)
{
FigureSizes[0] = Ob.FigureSizes[0];
FigureSizes[1] = Ob.FigureSizes[1];
}
public void Get_x_y(ref double x, ref double y)
{
FigureSizes[0] = this.FigureSizes[0];
FigureSizes[1] = this.FigureSizes[1];
}
public void Swap(ref Point Ob1, ref Point Ob2)
{
Point T = Ob1;
Ob1 = Ob2;
Ob2 = T;
}
public Point Uwelich_tchk(int koef)
{
return new Point(FigureSizes[0] * koef, FigureSizes[1] * koef);
}
public static Point operator +(Point Ob, int z)
{
return new Point(Ob.FigureSizes[0] + z, Ob.FigureSizes[1] + z);
}
public static Point operator +(int z, Point Ob)
{
return new Point(Ob.FigureSizes[0] + z, Ob.FigureSizes[1] + z);
}
public static Point operator -(Point Ob)
{
return new Point(-Ob.FigureSizes[0], -Ob.FigureSizes[1]);
}
public static Point operator ++(Point Ob)
{
Ob.FigureSizes[0]++;
Ob.FigureSizes[1]++;
return Ob;
}
public static Point operator --(Point Ob)
{
Ob.FigureSizes[0]--;
Ob.FigureSizes[1]--;
return Ob;
}
public static bool operator <(Point T1, Point T2)
{
double d1 = Math.Sqrt(T1.FigureSizes[0] * T1.FigureSizes[0] + T1.FigureSizes[1] * T1.FigureSizes[1]);
double d2 = Math.Sqrt(T2.FigureSizes[0] * T2.FigureSizes[0] + T2.FigureSizes[1] * T2.FigureSizes[1]);
if (d1 < d2)
return true;
else return false;
}
public static bool operator >(Point T1, Point T2)
{
double d1 = Math.Sqrt(T1.FigureSizes[0] * T1.FigureSizes[0] + T1.FigureSizes[1] * T1.FigureSizes[1]);
double d2 = Math.Sqrt(T2.FigureSizes[0] * T2.FigureSizes[0] + T2.FigureSizes[1] * T2.FigureSizes[1]);
if (d1 > d2)
return true;
else return false;
}
}
}int i, n;
Console.WriteLine("Введите количество точек: ");
n = Int32.Parse(Console.ReadLine());
Point[] mas = new Point[n];
for (i = 0; i < n; i++)
{
mas[i] = new Point();
mas[i].Input_Point();
}
Console.WriteLine("Содержимое массива точек: ");
for (i = 0; i < n; i++)
{
mas[i].show();
}Решение задачи: «Среди всех точек этого множества найти пару симметричных относительно оси ОХ точек»
textual
Листинг программы
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
private static Random rnd = new Random();
public static void Main()
{
HashSet<Tuple<int, int>> points = new HashSet<Tuple<int, int>>();
while (points.Count != 100)
{
points.Add(Tuple.Create(rnd.Next(-10, 11), rnd.Next(-10, 11)));
}
List<Tuple<int, int>> mirrored = points.Where(p => p.Item2 != 0 && points.Contains(Tuple.Create(p.Item1, -p.Item2))).ToList();
mirrored.ForEach(Console.WriteLine);
Console.WriteLine();
Console.WriteLine(mirrored.OrderByDescending(p => p.Item2).FirstOrDefault());
}
}