Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 9
1

Перечислить множество всех треугольников, образованных указанными отрезками

09.03.2014, 21:15. Показов 1305. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задачи: На плоскости задано множество и произвольным образом пересекающихся отрезков прямых линий. Перечислить множество всех треугольников, образованных указанными отрезками.
Код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "sButton"
#pragma link "sListBox"
#pragma link "sLabel"
#pragma link "sMemo"
#pragma link "sEdit"
#pragma resource "*.dfm"
int i, k;
int x1[10], y1[10];
int x2[10], y2[10];
int x3[10], y3[10];
int x4[10], y4[10];
int v1, v2, v3, v4, z, j, q, w, r, y;
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::sButton1Click(TObject *Sender)
{
r=StrToInt(sEdit1 ->Text);
 
Form2 ->sListBox1 ->Canvas ->Pen ->Color=(TColor)RGB(0, 0, 0);
Form2 ->sListBox1 ->Canvas ->Pen ->Width=1;
 
for (i = 0; i <r; i++)
{
 
 
x1[i]=random(300); y1[i]=random(300);
Form2 ->sListBox1 ->Canvas ->TextOutW(x1[i], y1[i], IntToStr(i));
Form2 ->sListBox1 ->Canvas ->MoveTo(x1[i], y1[i]);
x2[i]=random(300); y2[i]=random(300);
Form2 ->sListBox1 ->Canvas ->LineTo(x2[i], y2[i]);
Form2 ->sMemo1 ->Text="";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::sButton2Click(TObject *Sender)
{
w=0;
for (i = 0; i < r; i++)
   {
      z=0;
      y=0;
      for (k =0; k < r; k++)
         {
 
            if (k==i) k++;
            if(k>=r-1) break;
            v1= (x2[k]-x1[k])*(y1[i]-y1[k])-(y2[k]-y1[k])*(x1[i]-x1[k]);
            v2= (x2[k]-x1[k])*(y2[i]-y1[k])-(y2[k]-y1[k])*(x2[i]-x1[k]);
            v3= (x2[i]-x1[i])*(y1[k]-y1[i])-(y2[i]-y1[i])*(x1[k]-x1[i]);
            v4= (x2[i]-x1[i])*(y2[k]-y1[i])-(y2[i]-y1[i])*(x2[k]-x1[i]);
            if ((v1*v2<=0) && (v3*v4<=0))
               {
                  for (j=k; j<r; j++)
                     {
 
                        if (j==k) j++;
                        if(j>=r-1) break;
                        v1= (x2[k]-x1[j])*(y1[k]-y1[j])-(y2[j]-y1[j])*(x1[k]-x1[j]);
                        v2= (x2[j]-x1[j])*(y2[k]-y1[j])-(y2[j]-y1[j])*(x2[k]-x1[j]);
                        v3= (x2[k]-x1[k])*(y1[j]-y1[k])-(y2[k]-y1[k])*(x1[j]-x1[k]);
                        v4= (x2[k]-x1[k])*(y2[j]-y1[k])-(y2[k]-y1[k])*(x2[j]-x1[k]);
                        if ((v1*v2<=0) && (v3*v4<=0))
                           {
                              for (q = i; q < r; q++)
                                 {
                                    if (q==j)
                                       {q++;};
                                    if(q>i) break;
                                    v1= (x2[j]-x1[q])*(y1[j]-y1[q])-(y2[q]-y1[q])*(x1[j]-x1[q]);
                                    v2= (x2[q]-x1[q])*(y2[j]-y1[q])-(y2[q]-y1[q])*(x2[j]-x1[q]);
                                    v3= (x2[j]-x1[j])*(y1[q]-y1[j])-(y2[j]-y1[j])*(x1[q]-x1[j]);
                                    v4= (x2[j]-x1[j])*(y2[q]-y1[j])-(y2[j]-y1[j])*(x2[q]-x1[j]);
                                    if ((v1*v2<=0) && (v3*v4<=0))
                                       {
                                          if(i==q)
                                             z=1;
                                       }
                                    if(z==1)
                                       {
Form2 ->sMemo1 ->Text = Form2 ->sMemo1 ->Text + "\r\nПрямые " + IntToStr(i) + " и " + IntToStr(k) + " и " + IntToStr(j) + /*" и " + IntToStr(q) +*/ " образуют треугольник\r\n\r\n"; w=1;}
                           }
                     }
 
               }
         }
 
      }
      if(w!=1)
         Form2 ->sMemo1 ->Text = Form2 ->sMemo1 ->Text + "\r\n Треугольников нет \r\n\r\n";
   }
Проблема в том, что в выводе появляются лишние треугольники.
Заранее спасибо за помощь!
Вложения
Тип файла: rar Пример.rar (7.30 Мб, 3 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2014, 21:15
Ответы с готовыми решениями:

Построить множество всех треугольников с вершинами в заданных точках
помогите пожалуйста р.с. я не совсем хорошо знаю русский задача: на плоскости заданы множество...

Построить множество всех треугольников с вершинами в заданных точках, которые не пересекаются
Заданное случайное множество точек. Построить множество всех треугольников с вершинами в заданных...

Указать множество всех треугольников с вершинами в заданных точках, пересекающихся c окружностью
Требуется решение от проффесионалов в Pascal На плоскости 71 точек заданы своими координатами, а...

Перечислить множество, заданное диаграммой Гессе.
На вас надежда, выручайте, я в дискретке дуб дубом!

3
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
11.03.2014, 09:59 2
опишите вкратце алгоритм по которому кодили
0
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 9
11.03.2014, 15:27  [ТС] 3
Эх... никогда не умел объяснять свои мысли =(
Кнопка 1
1) В переменные рандомом заношу координаты начала(x1, y1) и конца(x2, y2) отрезка
2) По этим координатам рисую прямые

Кнопка 2
Беру первый отрезок и проверяю пересекается ли он с следующим отрезком, если пересекается беру второй отрезок(с которым пересекался первый) и проверяю пересекается ли он со следующим отрезком, если пересекается беру третий отрезок(с которым пересекался второй) и проверяю пересекается ли он со следующим отрезком, если пересекается проверяю является ли четвертый отрезок(с которым пересекался третий) первым отрезком, если является то вывожу сообщение что эти 3 отрезка образуют треугольник.

Понимаю что ерись какую-то написал, но как смог...
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
12.03.2014, 05:57 4
а потом вы начнете со второго отрезка и получите тот же треугольник, но посчитаете новым.
0
12.03.2014, 05:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2014, 05:57
Помогаю со студенческими работами здесь

Посчитать общую сумму периметров всех образованных геометрических фигур
На доске наклеено несколько листов объявлений. Все они прямоугольной формы. Некоторые письма...

Множество треугольников пересекающихся с окружностью
На плоскости n точки заданы своими координатами, дана окружность радиуса R с центром в точке x0,...

Построить множество остроугольных треугольников
Построить множество всех различных остроугольных треугольников с вершинами в заданном множестве...

Построить множество треугольников с вершинами в заданных точках
ДАно 3n точек на плоскости , причем не какие три не лежат на одной прямой. Построить множество...

Поиск всех значений между указанными тегами
Здравствуйте. Мне нужно сделать так что бы выбирались все совпадения. $text =...

Построить множество треугольников с вершинами в заданных точках согласно условию
Прошу помочь с одним заданием по С++, начали изучать не так давно, поэтому не особо разбираюсь,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru