Точки на плоскости, нахождение квадрата

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
PastoriXx
Сообщения: 23
Зарегистрирован: 07 май 2010, 14:11

Такая задача:
Даны N точек на плоскости(N>=4). Выяснить, найдутся ли среди этих точек такие, которые являются вершинами квадрата. Найти стороны этого квадрата.

Можете объяснить способ нахождения вершин квадрата и его сторон?
azrael
Сообщения: 89
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

1) Берете координаты первой точки (x1,y1).
2) Ищете точку с координатой x=x1 и берете ее координату y=y2.
3) Ищете точку с координатой y=y1 и берете ее координату x=x2.
4) Ищете точку с координатами (x2,y2). Если нашли - это и есть квадрат. Если на любом шаге 1-4 точка не найдена - возвращаетесь к первому шагу и берете следующую точку.

И так проходите весь массив точек.
Могу за небольшую плату написать это, аська 55655222
PastoriXx
Сообщения: 23
Зарегистрирован: 07 май 2010, 14:11

azrael писал(а):1) Берете координаты первой точки (x1,y1).
2) Ищете точку с координатой x=x1 и берете ее координату y=y2.
3) Ищете точку с координатой y=y1 и берете ее координату x=x2.
4) Ищете точку с координатами (x2,y2). Если нашли - это и есть квадрат. Если на любом шаге 1-4 точка не найдена - возвращаетесь к первому шагу и берете следующую точку.

И так проходите весь массив точек.
Могу за небольшую плату написать это, аська 55655222

Стороны квадрата могут быть и не паралельными осям координат, поэтому надо находить длины сторон и их сравнивать, потом надо проверить чтобы углы были равны 90 град. Но как это реализовать программно я пока не знаю....
azrael
Сообщения: 89
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

PastoriXx писал(а):Стороны квадрата могут быть и не паралельными осям координат, поэтому надо находить длины сторон и их сравнивать, потом надо проверить чтобы углы были равны 90 град. Но как это реализовать программно я пока не знаю....
Да, что-то я не обратил внимания на то, что могут быть не параллельны :)

Чтобы проверить, что угол между сторонами равен 90 град, наверное надо найти гипотенузу по точкам и по теореме Пифагора и сравнить результат.
azrael
Сообщения: 89
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

Наверное есть какое-то более простое решение, связанное с вписанными и описанными окружностями, но я пока его не вижу :)
PastoriXx
Сообщения: 23
Зарегистрирован: 07 май 2010, 14:11

Массив C[,] хранит номера точек которые образуют квадрат, нужно чтобы не выводило на экран повтор-ся квадраты, помогите правильно отсортировать массив, можно допустим делать флаг на повторах и не выводить на экран, но сам поиск повторов не могу написать


Код: Выделить всё

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Семистровая_задача_5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int N;
        double[,] A;
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            N = (int)numericUpDown1.Value;
            dataGridView1.RowCount = N;
            dataGridView1.ColumnCount = 2;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            double[] B = new double[6];
            int[,] C = new int[4,N];
            A = new double[2, N];
            int j1 = -1, t1 = -1, u1 = -1, p=0;
            for (int i = 0; i < N; i++)
            {
                A[0, i] = Convert.ToDouble(dataGridView1[0, i].Value);
                A[1, i] = Convert.ToDouble(dataGridView1[1, i].Value);
            }

            for (int i = 0; i < N; i++)
            {
                if (i != j1 && i != t1 && i != u1)
                for (int j = 0; j < N; j++)
                {
                    if (j != i && j != t1 && j != u1)
                    B[0] = Math.Sqrt((A[0, i] - A[0, j]) * (A[0, i] - A[0, j]) + (A[1, i] - A[1, j]) * (A[1, i] - A[1, j]));
                    for (int t = 0; t < N; t++)
                    {
                        if (t != i && t != j)
                        for (int u = 0; u < N; u++)
                        {
                            if (u != i && u != j && u != t)
                            {
                                B[1] = Math.Sqrt((A[0, t] - A[0, u]) * (A[0, t] - A[0, u]) + (A[1, t] - A[1, u]) * (A[1, t] - A[1, u]));
                                if (B[0] == B[1] && B[0]>0)
                                {
                                    B[2] = Math.Sqrt((A[0, i] - A[0, u]) * (A[0, i] - A[0, u]) + (A[1, i] - A[1, u]) * (A[1, i] - A[1, u]));
                                    B[3] = Math.Sqrt((A[0, j] - A[0, t]) * (A[0, j] - A[0, t]) + (A[1, j] - A[1, t]) * (A[1, j] - A[1, t]));
                                    if (B[1] == B[2] && B[1] == B[3])
                                    {
                                        B[4] = Math.Sqrt((A[0, i] - A[0, t]) * (A[0, i] - A[0, t]) + (A[1, i] - A[1, t]) * (A[1, i] - A[1, t]));
                                        B[5] = Math.Sqrt((A[0, j] - A[0, u]) * (A[0, j] - A[0, u]) + (A[1, j] - A[1, u]) * (A[1, j] - A[1, u]));
                                        if (B[4] == B[5])
                                        {
                                            C[0, p] = i; C[1, p] = j; C[2, p] = t; C[3, p] = u;
                                            p++;
                                            //textBox1.Text += "Найден квадрат, его вершины " + "А(" + A[0, i] + "," + A[1, i] + "),  " + "B(" + A[0, j] + "," + A[1, j] + "),  " + "C(" + A[0, t] + "," + A[1, t] + "),  " + "D(" + A[0, u] + "," + A[1, u] + "). " + "\r\n";
                                            j1 = j; t1 = t; u1 = u;

                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < 4; i++)
                for (int j = 0; j < N; j++)
                    for (int l = 0; l < N;l++)
                        if (C[0, j] == C[i, l])
                        {
                            for (i = 0; i < 4; i++)
                                if (C[1, j] == C[i, l])
                                {
                                    for (i = 0; i < 4; i++)
                                        if (C[2, j] == C[i, l])
                                        {
                                            for (i = 0; i < 4; i++)
                                                if (C[3, j] == C[i, l])
                                                {
// Попытка избавления от повтора вывода вершин квадрата 
                                                }
                                        }
                                }
                        }
        }
    }
}
Ответить