Ярославль


  Ответ в темуСоздание новой темыСоздание опроса

Задача на проверку заданной фигуры, Внутри темы

Alexey Smirnov
Дата 11.11.2013 - 18:58
Цитировать сообщение




Unregistered












Собственно задача:
На плоскости задано множество точек А и точка d вне его. Подсчитать количество различных неупорядоченных троек точек a, b, c из А, для которых четырехугольник abcd является параллелограммом.

Написал код:

Код



{// На плоскости задано множество точек А  и точка  d  вне его.
   // Подсчитать  количество  различных неупорядоченных троек точек a, b, c из А,  
   // для которых четырехугольник  abcd  является параллелограммом.
   class Program
   {

       static float X1, Y1, X2, Y2, X3, Y3, X4, Y4;
       static void Main(string[] args)
       {
           string line;
          float a, b, c, d;
           char[] delimited = new char[] { ' ', ',', '.' };
           using (StreamReader f = new StreamReader("test1.txt"))
           {
               line = f.ReadLine();
               string[] numbers = line.Split(delimited);
               X1 = float.Parse(numbers[0]);
               X2 = float.Parse(numbers[1]);
               X3 = float.Parse(numbers[2]);
               X4 = float.Parse(numbers[3]);
               Y1 = float.Parse(numbers[4]);
               Y2 = float.Parse(numbers[5]);
               Y3 = float.Parse(numbers[6]);
               Y4 = float.Parse(numbers[7]);
               line = f.ReadLine();
               numbers = line.Split(delimited);
               a = X2 - X1;
               b = X3 - X4;
               c = Y2 - Y1;
               d = Y3 - Y4;
               if ((a == 0) && (b == 0) && (c == 0) && (d == 0))
               {
                   Console.WriteLine("Является параллелоограммом");
               }
               else if ((a != 0) || (b != 0) || (c != 0) || (d != 0))
               {
                   Console.WriteLine("Не является параллелограммом");
                   Console.ReadKey();
               }
           }
       }
   }
}


Где ошибка в коде?
Top
dumbI4
Дата 12.11.2013 - 11:08
Цитировать сообщение




Эцилопп
****

Профиль
Группа: Пользователи
Сообщений: 754
Пользователь №: 33431
Регистрация: 14.10.2008 - 11:18





такое ощущение, что проверкой
Код
if ((a == 0) && (b == 0) && (c == 0) && (d == 0))

Вы находите прямоугольники, а не параллелограммы.

для нахождения параллелограмма по 4м точкам, надо строить 4 уравнения прямых, вида
Код
y = kx + b

т.е. решать 2 системы уравнений и высчитывать коэффициенты k и b.
далее смотреть чтобы пары полученных прямых были параллельны, т.е. у них должны совпадать k и b
PMПисьмо на e-mail пользователю
Top
Alexey Smirnov
Дата 12.11.2013 - 20:15
Цитировать сообщение




Unregistered












А вот такой код пройдет:
?
Код


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Tao.FreeGlut;
using Tao.OpenGl;



namespace LabRab_5
{// На плоскости задано множество точек А  и точка  d  вне его.
   // Подсчитать  количество  различных неупорядоченных троек точек a, b, c из А,  
   // для которых четырехугольник  abcd  является параллелограммом.
   class Program
   {

       static float X1, Y1, X2, Y2, X3, Y3, X4, Y4;
       static void Main(string[] args)
       {
           string line;
           float a, b;
           char[] delimited = new char[] { ' ', ',', '.' };
           using (StreamReader f = new StreamReader("test1.txt"))
           {
               line = f.ReadLine();
               string[] numbers = line.Split(delimited);
               X1 = float.Parse(numbers[0]);
               X2 = float.Parse(numbers[1]);
               X3 = float.Parse(numbers[2]);
               X4 = float.Parse(numbers[3]);
               Y1 = float.Parse(numbers[4]);
               Y2 = float.Parse(numbers[5]);
               Y3 = float.Parse(numbers[6]);
               Y4 = float.Parse(numbers[7]);
               line = f.ReadLine();
               a = Math.Abs(X2 - X1);
               b = Math.Abs(X3 - X4);
               if ((Y1 == Y4) && (Y2 == Y3) && (a == b))
               {
                   Console.WriteLine("Является параллелоограммом");
               }
               else if ((Y1 != Y4) || (Y2 != Y3) || (a != b))
               {
                   Console.WriteLine("Не является параллелограммом");

               }


Это сообщение отредактировал Alexey Smirnov - 12.11.2013 - 20:15
Top
dumbI4
Дата 13.11.2013 - 10:44
Цитировать сообщение




Эцилопп
****

Профиль
Группа: Пользователи
Сообщений: 754
Пользователь №: 33431
Регистрация: 14.10.2008 - 11:18





user posted image

A(x1, y1), B(x2, y2), C(x3, y3), D(x4, y4).

Ваша проверка показывает, что точки A и D лежат на одной горизонтальной прямой (y1 = y4), точки B и C лежат на одной горизонтальной прямой (y2 = y3) и длина отрезка AB равна длине отрезка BC (в проекции на ось Х).

Такая фигура может быть как параллелограммом, так и трапецией.

Если добавить проверку, что длины отрезков AD и BC (в проекции на ось Y) совпадают, то этого должно хватить для решения Вашей задачи. Хотя так будет найден только частный случай параллелограмма, у которого AD и BC горизонтальны.

ЗЫ. на вики есть несколько условий, присущих параллелограммам. возможно, стоит реализовать проверку этих свойств
PMПисьмо на e-mail пользователю
Top
Alexey Smirnov
Дата 13.11.2013 - 19:48
Цитировать сообщение




Unregistered












А как еще графику подключить? Я написал код, но он частично правильный:

Код
// инициализация графики
               Glut.glutInit();
               // для окна изображения будет использоваться один буфер регенерации
               // для выбора цветовых значений режим RGB(красный зеленый синий)
               Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
               // задание размера окна,где будет выведена графика
               Glut.glutInitWindowSize(800, 800);
               // создание окна для вывода графики с заголовком
               Glut.glutCreateWindow("Параллелограмм");
               //вызов процедуры инициализации
               Init();
               // посылает графическое изображение в созданное окно
               Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
               // изображает всё и ожидает
               Glut.glutMainLoop();
               Console.ReadLine();
           }
       }
       
       
       
           
       // процедура инициализации        
       private static void Init()
       {
           // задает белый цвет фона окна изображения
           Gl.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
           Gl.glMatrixMode(Gl.GL_PROJECTION);
           Glu.gluOrtho2D(-5.0, 20.0, -5.0, 20.0);
       }
       // подпрограмма рисования прямой по координатам точек
        static void DrawLine(float X1, float Y1, float X2, float Y2, float X3, float Y3, float X4, float Y4)
       {
           Gl.glBegin(Gl.GL_LINES);
           Gl.glVertex2f(X1, Y1);
           Gl.glVertex2f(X2, Y2);
           Gl.glVertex2f(X3, Y3);
           Gl.glVertex2f(X4, Y4);
           Gl.glEnd();
       }
     
       static void Display()
       { // метод, формирующий изображение
           // очистка окна
           Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
           // выбор цвета
           Gl.glColor3f(0.0f, 0.0f, 0.0f);
           
           DrawLine(X1, Y1, X2, Y2, X3, Y3, X4, Y4);
       }
   }
   }
Top
dumbI4
Дата 14.11.2013 - 09:20
Цитировать сообщение




Эцилопп
****

Профиль
Группа: Пользователи
Сообщений: 754
Пользователь №: 33431
Регистрация: 14.10.2008 - 11:18





про графику ничего не подскажу, не работал с ней
PMПисьмо на e-mail пользователю
Top
Alexey Smirnov
Дата 15.11.2013 - 20:00
Цитировать сообщение




Unregistered












Я так и не написал рабочий код для задачи sad.gif

Кто разбирается в этом, помогите написать.
Top

Опции темы Ответ в темуСоздание новой темыСоздание опроса

 



[ Время генерации скрипта: 0.0109 ]   [ Использовано запросов: 16 ]   [ GZIP включён ]



Яндекс.Метрика

Правила Ярпортала (включая политику обработки персональных данных)

Все вопросы: yaroslavl@bk.ru