powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / треугольники
11 сообщений из 11, страница 1 из 1
треугольники
    #33006706
regromus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем

Помогите вот с такой задачей:

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

Вот то что я сделал:
Код: plaintext
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.
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define M  100 
float x[M];
float y[M];
int i,j,k,n;
//----------------------------------------------------------//
int Chten()
{
 ifstream chten;
 chten.open("c:\\bc\\zadachi\\koor.txt");
 if (chten==NULL)
  {
   cout<<"error";
   return  0 ;
  }
 chten >> n;
 for (i= 0 ;i<n;i++)
  {
   chten>>x[i];
   chten>>y[i];
  }
}
//-----------------------------------------------------------//
int proverka()
{
 for (i= 0 ;i<n;i++){
 for (j=i;j<n;j++){
 for (k=j;k<n;k++){
 if ((x[j]-x[i])== 0 )   continue;
 if ((y[j]-y[i])== 0 )   continue;
 if ((k==j) || (i==j)) continue;
 if (((x[k]-x[i])/(x[j]-x[i]))-((y[k]-y[i])/(y[j]-y[i]))== 0 )
 {
  cout<<"error";
  return  0 ;
 }
}}}}
//===========================================================//
int main()
{
 clrscr();
 Chten();//чтение точек из файла//
 proverka();//чтобы никакие 3 точки не лежали на 1ой прямой//
 printf("\nX\n");//распечатка исходных точек//
 for (i= 0 ;i<n;i++)
  {
   printf("%f",x[i]);
   printf("%c",i% 2 ?'\t':'\n');
  }
 printf("\nY\n");
 for (i= 0 ;i<n;i++)
  {
   printf("%f",y[i]);
   printf("%c",i% 2 ?'\t':'\n');
  }
 getch();
}

Теперь надо:Построить множество n треугольников с вершинами в этих точках так, чтобы никакие 2 треугольника не пересекались и не содержали друг друга.

Помогите плз
...
Рейтинг: 0 / 0
треугольники
    #33006771
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последнее время уважаемый regromus интересутеся исключительно геометрическими задачами, к чему бы?
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
треугольники
    #33006773
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гы, построить несамопересекающийся контур, охватывающий все точки и свести задачу к триангуляции невыпуклого полигона
...
Рейтинг: 0 / 0
треугольники
    #33006835
regromus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ХА-ХА блин
...
Рейтинг: 0 / 0
треугольники
    #33006837
regromus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чё вы коры мочите.Помог бы кто!!!
...
Рейтинг: 0 / 0
треугольники
    #33007163
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMГы, построить несамопересекающийся контур, охватывающий все точки и свести задачу к триангуляции невыпуклого полигона

Вообще-то это уже решение, осталось немного подумать над кодом. Все алгоритмы стандартны.
...
Рейтинг: 0 / 0
треугольники
    #33007536
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каждой OS есть OpenGL а в ней есть класс - тесселятор
Код: plaintext
gluTessBeginPolygon
сделает тебе триангуляцию полигона и даже невыпуклого.
)))))).
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
треугольники
    #33010658
rergomus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.

Выкладываю код готовой программы:

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

Все кому не лень, могут разобраться в коде, заодно ПРОТЕСТИРОВАТЬ и доложить мне об ошибке(я даже не прошу её исправлять,но надеюсь на это). Можете обсерать этот код - мне по..уй.

Код: plaintext
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.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#define M  50 
float x[M],y[M]; //координаты точек//
int i,j,k,n,q,l= 0 ,z[M],w= 0 ,r;
long double a,b,c,a1,b1,c1;
long double p,p1,p2,p3,s,s1,s2,s3;
float t[M][ 6 ];  //треугольники//

//----------------------------------------------------------//
int Chten()
{
 ifstream chten;
 chten.open("c:\\bc\\zadachi\\koor.txt");
 if (chten==NULL)
  {
   cout<<"error";
   return  0 ;
  }
 chten >> n;
 for (i= 0 ;i<n;i++)
  {
   chten>>x[i];
   chten>>y[i];
  }
}
//-----------------------------------------------------------//
int proverka()
{
 for (i= 0 ;i<n;i++){
 for (j=i;j<n;j++){
 for (k=j;k<n;k++){
 if ((x[j]-x[i])== 0 )   continue;
 if ((y[j]-y[i])== 0 )   continue;
 if ((k==j) || (i==j)) continue;
 if (((x[k]-x[i])/(x[j]-x[i]))-((y[k]-y[i])/(y[j]-y[i]))== 0 )
 {
  cout<<"error";
  getch();
  return  0 ;
 }
}}}}
//-----------------------------------------------------------//
float postr()
{
  a=sqrt((x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]));
  b=sqrt((x[j]-x[k])*(x[j]-x[k])+(y[j]-y[k])*(y[j]-y[k]));
  c=sqrt((x[i]-x[k])*(x[i]-x[k])+(y[i]-y[k])*(y[i]-y[k]));
  p=(a+b+c)/ 2 ;
  s=sqrt(p*(p-a)*(p-b)*(p-c));
  for (q= 0 ;q<n;q++)
  {
   if ((q==i)||(q==k)||(q==j))
   continue;
   a1=sqrt((x[k]-x[q])*(x[k]-x[q])+(y[k]-y[q])*(y[k]-y[q]));
   b1=sqrt((x[j]-x[q])*(x[j]-x[q])+(y[j]-y[q])*(y[j]-y[q]));
   c1=sqrt((x[i]-x[q])*(x[i]-x[q])+(y[i]-y[q])*(y[i]-y[q]));

double  ca=(y[k]-y[j])*(x[q]-x[j]) - (y[q]-y[j])*(x[k]-x[j]);
double  cb=(y[q]-y[j])*(x[q]-x[i]) - (y[q]-y[i])*(x[q]-x[j]);
double  z =(y[k]-y[j])*(x[q]-x[i]) - (y[q]-y[i])*(x[k]-x[j]);
double  ua;
double  ub;

           if (z!= 0 )
                { ua=ca/z;
                  ub=cb/z; }
           else
                { ua=ub= 0 ; }

  if ( ( 0 <=ua)&&(ua<= 1 )&&( 0 <=ub)&&(ub<= 1 ) )
  {
   p1=(a1+b1+b)/ 2 ;
   p2=(b1+c1+a)/ 2 ;
   p3=(a1+c1+c)/ 2 ;
   goto kor;
  }

        ca=(y[i]-y[j])*(x[q]-x[j]) - (y[q]-y[j])*(x[i]-x[j]);
        cb=(y[q]-y[j])*(x[q]-x[k]) - (y[q]-y[k])*(x[q]-x[j]);
        z =(y[i]-y[j])*(x[q]-x[k]) - (y[q]-y[k])*(x[i]-x[j]);

        if (z!= 0 )
                { ua=ca/z;
                  ub=cb/z; }
           else
                { ua=ub= 0 ; }

  if ( ( 0 <=ua)&&(ua<= 1 )&&( 0 <=ub)&&(ub<= 1 ) )
  {
   p1=(a1+b1+c)/ 2 ;
   p2=(b1+c1+b)/ 2 ;
   p3=(a1+c1+a)/ 2 ;
   goto kor;
  }

        ca=(y[i]-y[j])*(x[q]-x[k]) - (y[q]-y[k])*(x[i]-x[j]);
        cb=(y[q]-y[j])*(x[q]-x[i]) - (y[q]-y[i])*(x[q]-x[j]);
        z =(y[i]-y[j])*(x[q]-x[i]) - (y[q]-y[i])*(x[i]-x[j]);

        if (z!= 0 )
                { ua=ca/z;
                  ub=cb/z; }
           else
                { ua=ub= 0 ; }

  if ( ( 0 <=ua)&&(ua<= 1 )&&( 0 <=ub)&&(ub<= 1 ) )
  {
   p1=(a1+b1+a)/ 2 ;
   p2=(b1+c1+c)/ 2 ;
   p3=(a1+c1+b)/ 2 ;
   goto kor;
  }


       p1=(a1+b1+b)/ 2 ;
       p2=(b1+c1+c)/ 2 ;
       p3=(a1+c1+a)/ 2 ;

kor:  s1=sqrt(p1*(p1-a1)*(p1-b1)*(p1-b));
      s2=sqrt(p2*(p2-b1)*(p2-c1)*(p2-c));
      s3=sqrt(p3*(p3-a1)*(p3-c1)*(p3-a));
   if (s==(s1+s2+s3)) return  0 . 0 ;
  }
    t[l][ 0 ]=x[i];
    t[l][ 1 ]=y[i];
     z[w]=i;
     w=w+ 1 ;
    t[l][ 2 ]=x[j];
    t[l][ 3 ]=y[j];
     z[w]=j;
     w=w+ 1 ;
    t[l][ 4 ]=x[k];
    t[l][ 5 ]=y[k];
     z[w]=k;
     w=w+ 1 ;
     l=l+ 1 ;
    return  1 . 0 ;
}
//===========================================================//
int main()
{
 clrscr();
 z[ 0 ]= 100 ;//главное чтобы z[i]!=0//
 z[ 0 ]= 100 ;//главное чтобы z[i]!=0//
 Chten();//чтение точек из файла//
 if (n% 3 != 0 ) {printf("error");getch();return  0 ;}//чтобы кол_во точек делилось
 if (proverka()== 0 ) return  0 ;//чтобы никакие 3 точки не лежали на 1ой прямой//
  if (n== 3 )//если кол_во точек равно 3 то строим 1 теругольник и выходим//
 {
  t[ 0 ][ 0 ]=x[ 0 ];
  t[ 0 ][ 1 ]=y[ 0 ];
  t[ 0 ][ 2 ]=x[ 1 ];
  t[ 0 ][ 3 ]=y[ 1 ];
  t[ 0 ][ 4 ]=x[ 2 ];
  t[ 0 ][ 5 ]=y[ 2 ];
  goto kc;
}
 for (i= 0 ;i<n;i++){  //строим тругольники!!!//
 for (j=i;j<n;j++){
 for (k=j;k<n;k++){
 if ((i==j)||(j==k)||(k==i)) continue;
 for (r= 0 ;r<=w;r++)  //мы не берем координаты уже построенных треугольников//
 {
  if ((i==z[r])||(j==z[r])||(k==z[r])) goto as;
 }
 if (postr()== 0 . 0 ) continue;//проверяем лежит ли точка внутри треугольника//
as:;
 }}}
kc:printf("\nответ!!!\n");//распечатка координат треугольников//
   for (i= 0 ;i<l;i++)
   {
    printf("%d треугольник",(i+ 1 ));
   for (j= 0 ;j< 6 ;j++)
   {
    printf("%5.2f",t[i][j]);
    if ((j% 5 == 0 )&&(j!= 0 )) printf("\n");
   }
   }
 getch();
}



Можете задавать вопросы по коду....
...
Рейтинг: 0 / 0
треугольники
    #33010711
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Весело .
Раз тебе "по..уй", то нам тем-более.
)))))))).
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
треугольники
    #33011594
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 rergomus:
Ну нафига нам разбирать твой код?
Если он работает, то и прекрасно, пользуйся
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
треугольники
    #33011971
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 regromus

А в чем проблема-то?

Все алгоритмы которые тебе рекомендовали использользовать - стандартны. Часть из них реализована в STL. Часть содержится в любой библиотеки работы с графикой.

Чего непонятно-то конкретно?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / треугольники
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]