Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 7
1

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

26.06.2016, 15:57. Показов 1366. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В заданном множестве точек найти координаты вершин всех треугольников, для которых один строго лежит внутри другого.
Помогите, пожалуйста!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2016, 15:57
Ответы с готовыми решениями:

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

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

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

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

6
Почетный модератор
64305 / 47600 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
26.06.2016, 20:15 2
Вроде так.
Delphi
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
{$R *.dfm}
//определение площади треугольника по координатам вершин
function Plosh(a,b,c:Tpoint):real;
begin
Plosh:=abs((a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y))/2;
end;
//проверка точки на принадлежность треугольнику
function Prin(a,b,c,d:Tpoint):boolean;
var s,s1,s2,s3:real;
begin
s:=Plosh(a,b,c);{площадь данного треугольника}
if s<t then result:=false
else
 begin
  s1:=Plosh(a,b,d);{1 маленький}
  s2:=Plosh(a,c,d);{2}
  s3:=Plosh(b,c,d);{3}
  result:=abs(s1+s2+s3-s)<t;//если площади равны с заданной точностью
 end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
with StringGrid1 do
 begin
  colcount:=3;
  defaultcolwidth:=40;
  rowcount:=2;
  cells[0,0]:='№пп';
  cells[1,0]:='X';
  cells[2,0]:='Y';
  scrollbars:=ssVertical;
 end;
Memo1.ScrollBars:=ssVertical;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a:array of TPoint;
    n,i,j,k,p,q,r:integer;
    f:boolean;
begin
randomize;
val(Edit1.Text,n,k);
if(k<>0)or(n<6)then
 begin
  ShowMessage('Неверно введено количество точек');
  Edit1.Clear;
  Edit1.SetFocus;
  exit;
 end;
setlength(a,n);
StringGrid1.RowCount:=2;
for i:=0 to n-1 do
 begin
  a[i].X:=-10+random(21);
  a[i].Y:=-10+random(21);
  with StringGrid1 do
   begin
    cells[0,i+1]:=inttostr(i+1);
    cells[1,i+1]:=inttostr(a[i].X);
    cells[2,i+1]:=inttostr(a[i].Y);
    rowcount:=rowcount+1;
   end;
  end;
StringGrid1.RowCount:=StringGrid1.RowCount-1;
Memo1.Clear;
Memo1.Lines.Add('Пары треугольников, входящих друг в друга');
f:=false;
for i:=0 to n-3 do//перебираем точи для 1 треугольника
for j:=i+1 to n-2 do
for k:=j+1 to n-1 do
for p:=0 to n-3 do//то же ддя второго
for q:=p+1 to n-2 do
for r:=q+1 to n-1 do
if not(p in [i,j,k])and not(q in [i,j,k])and not(r in [i,j,k])//если не совпадают
//и точки 2 принадлежат первому
and Prin(a[i],a[j],a[k],a[p])and Prin(a[i],a[j],a[k],a[q])
and Prin(a[i],a[j],a[k],a[r])then
 begin
  f:=true;
  Memo1.Lines.Add('[('+inttostr(a[i].X)+';'+inttostr(a[i].Y)+');'+
                   '('+inttostr(a[j].X)+';'+inttostr(a[j].Y)+');'+
                   '('+inttostr(a[k].X)+';'+inttostr(a[k].Y)+')]'+
                   '   [('+inttostr(a[p].X)+';'+inttostr(a[p].Y)+');'+
                   '('+inttostr(a[q].X)+';'+inttostr(a[q].Y)+');'+
                   '('+inttostr(a[r].X)+';'+inttostr(a[r].Y)+')]');
  end;
if not f then Memo1.Lines.Add('Таких пар нет');
end;
1
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 7
27.06.2016, 08:57  [ТС] 3
Puporev,
Цитата Сообщение от Puporev Посмотреть сообщение
if s<t then result:=false
А t здесь это что?
0
Почетный модератор
64305 / 47600 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.06.2016, 09:51 4
А, не написал, это выше было
Delphi
1
const t=0.001;//точность сравнения вещественных чисел
Добавлено через 2 минуты
А можно это и не писать, а в строке 12 так
Delphi
1
if s<0.001 then result:=false
1
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 7
27.06.2016, 10:17  [ТС] 5
Puporev, спасибо
0
Почетный модератор
64305 / 47600 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.06.2016, 12:02 6
Лучший ответ Сообщение было отмечено Elizavetaa как решение

Решение

Приведенный выше пример не решат задачу точно
Цитата Сообщение от Elizavetaa Посмотреть сообщение
для которых один строго лежит внутри другого.
Лучше так.
Delphi
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
{$R *.dfm}
//проверка принадлежности точки треугольнику
function prin(t1,t2,t3,t:TPoint):boolean;
//положение точки относительно прямой, проходящей через 2 точки
function odin(tt1,tt2,tt:TPoint):integer;
begin
result:=tt.X*(tt2.Y-tt1.Y)+tt.Y*(tt1.X-tt2.X)+tt1.Y*tt2.X-tt1.X*tt2.Y;
end;
var q1,q2,q3:integer;
begin
q1:=odin(t1,t2,t);
q2:=odin(t2,t3,t);
q3:=odin(t3,t1,t);
result:=((q1>0)and(q2>0)and(q3>0))
or((q1<0)and(q2<0)and(q3<0));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with StringGrid1 do
 begin
  colcount:=3;
  defaultcolwidth:=40;
  rowcount:=2;
  cells[0,0]:='№пп';
  cells[1,0]:='X';
  cells[2,0]:='Y';
  scrollbars:=ssVertical;
 end;
Memo1.ScrollBars:=ssVertical;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a:array of TPoint;
    n,i,j,k,p,q,r:integer;
    f:boolean;
begin
randomize;
val(Edit1.Text,n,k);
if(k<>0)or(n<4)then
 begin
  ShowMessage('Неверно введено количество точек');
  Edit1.Clear;
  Edit1.SetFocus;
  exit;
 end;
setlength(a,n);
StringGrid1.RowCount:=2;
for i:=0 to n-1 do
 begin
  a[i].X:=-10+random(21);
  a[i].Y:=-10+random(21);
  with StringGrid1 do
   begin
    cells[0,i+1]:=inttostr(i+1);
    cells[1,i+1]:=inttostr(a[i].X);
    cells[2,i+1]:=inttostr(a[i].Y);
    rowcount:=rowcount+1;
   end;
  end;
StringGrid1.RowCount:=StringGrid1.RowCount-1;
Memo1.Clear;
Memo1.Lines.Add('Пары треугольников, входящих друг в друга');
f:=false;
for i:=0 to n-3 do//перебираем точи для 1 треугольника
for j:=i+1 to n-2 do
for k:=j+1 to n-1 do
for p:=0 to n-3 do//то же ддя второго
for q:=p+1 to n-2 do
for r:=q+1 to n-1 do
if not(p in [i,j,k])and not(q in [i,j,k])and not(r in [i,j,k])//если не совпадают
and prin(a[i],a[j],a[k],a[p])//и принадлежат точки 2-го 1-му
and prin(a[i],a[j],a[k],a[q])
and prin(a[i],a[j],a[k],a[r]) then
 begin
  f:=true;
  Memo1.Lines.Add('[('+inttostr(a[i].X)+';'+inttostr(a[i].Y)+');'+
                   '('+inttostr(a[j].X)+';'+inttostr(a[j].Y)+');'+
                   '('+inttostr(a[k].X)+';'+inttostr(a[k].Y)+')]'+
                   '   [('+inttostr(a[p].X)+';'+inttostr(a[p].Y)+');'+
                   '('+inttostr(a[q].X)+';'+inttostr(a[q].Y)+');'+
                   '('+inttostr(a[r].X)+';'+inttostr(a[r].Y)+')]');
  end;
if not f then Memo1.Lines.Add('Таких пар нет');
end;
1
0 / 0 / 0
Регистрация: 22.06.2016
Сообщений: 7
28.06.2016, 20:18  [ТС] 7
Puporev, спасибо большое!
0
28.06.2016, 20:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2016, 20:18
Помогаю со студенческими работами здесь

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

У квадрата ABCD на плоскости известны координаты двух противоположных вершин - точек A и C. Найти координаты точек B и
У квадрата ABCD на плоскости известны координаты двух противоположных вершин - точек A и C. Найти...

В заданном множестве точек плоскости найти количество точек в каждой из четвертей
В заданном множестве точек плоскости найти количество точек в каждой из четвертей

В заданном множестве точек плоскости найти количество точек в каждой из четвертей
В заданном множестве точек плоскости найти количество точек в каждой из четвертей. Знаете я не...


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

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