9 / 9 / 3
Регистрация: 02.01.2012
Сообщений: 169
1

Задача на построение выпуклой оболочки

15.04.2012, 14:22. Показов 6903. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот задача: на плоскости задано N точек, которые пронумерованы слева на право (а при равных абсциссах снизу вверх). Нужно создать программу, которая строит многоугольник, который является выпуклой их оболочкой, не более чем за C*N действий.
Я уже выяснил, что решается она с помощью алгоритма Джарвиса (с этим, думаю, разберусь сам). Непонятным остается то, как вывести результат. Ввожу координаты точек через stringgrid. Вопрос: как нарисовать точки и соединить их линиями?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2012, 14:22
Ответы с готовыми решениями:

Построение выпуклой оболочки обходом Грэхэма
Привет всем! помогите написать на java этот алгоритм Построение выпуклой оболочки обходом Грэхэма...

Построение выпуклой оболочки множества точек
Дано множество точек на плоскости. построить выпуклую оболочку этого мно- жества. какой тут...

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

Выполнить дилатацию (построение выпуклой оболочки) и дальнейшее выделение контура бинарного изображения
Здравствуйте. Вообщем есть исходное изображение я его бинаризирую и нужно выполнить...

31
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
15.04.2012, 15:19 2
Цитата Сообщение от K1m Посмотреть сообщение
как нарисовать точки и соединить их линиями?
Собрать их в массив в порядке обхода, в конец продублировать первую точку.
Выбрать масштаб и либо соединить линиями Canvas.moveto, Canvas.lineto, либо нарисовать полигон Canvas.polygon.
1
9 / 9 / 3
Регистрация: 02.01.2012
Сообщений: 169
15.04.2012, 15:39  [ТС] 3
А Chart для этого не получится использовать?
0
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
15.04.2012, 15:41 4
Цитата Сообщение от K1m Посмотреть сообщение
А Chart для этого не получится использовать?
Точно не знаю, но думаю нет, да и зачем если все можно на канве нарисовать очень просто.
0
9 / 9 / 3
Регистрация: 02.01.2012
Сообщений: 169
15.04.2012, 15:57  [ТС] 5
Puporev, а как выбрать масштаб?
0
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
15.04.2012, 16:00 6
Я думаю рисовать лучше на канве Image.
Создать ее квадратной.
найти мин и макс по Х и У.
определить что больше разность по Х или по У и определить масштаб как
Delphi
1
m:=(Image1.width-40)/max;//40 для отступа от краев
0
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
15.04.2012, 21:07 7
Лучший ответ Сообщение было отмечено как решение

Решение

Я вот так нарисовал, где идею алгоритма почерпнул, не помню, реализация моя..
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
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, Spin, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    Sg1: TStringGrid;
    Label2: TLabel;
    Label3: TLabel;
    Sg2: TStringGrid;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  Tvyp=record  //точки оболочки с номерами
       x,y:integer;
       k:integer;{номер точки}
       end;
var
  Form1: TForm1;
  n:integer;
  p:array[1..100] of TPoint; //массив всех точек
  p1:array[1..100] of Tvyp; //выпуклая оболочка
implementation
 
{$R *.dfm}
{находится ли точка левее луча}
function IsLeft(p,p1,p2:TPoint):boolean;
begin
IsLeft:=(p1.x-p.x)*(p2.y-p.y)-(p1.y-p.y)*(p2.x-p.x)>0;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
n:=SpinEdit1.Value;
if n=0 then
 begin
  Showmessage('Введите количество точек');
  exit;
 end;
with sg1 do
 begin
  ColCount:=3;
  RowCount:=n+1;
  FixedCols:=1;
  FixedRows:=1;
  defaultcolwidth:=40;
  for i:=1 to n do
  Cells[0,i]:=IntToStr(i);
  Cells[0,0]:='№';
  Cells[1,0]:='X';
  Cells[2,0]:='Y';
 end;
with sg2 do
 begin
  ColCount:=3;
  RowCount:=2;
  FixedCols:=1;
  FixedRows:=1;
  defaultcolwidth:=40;
  Cells[0,0]:='№';
  Cells[1,0]:='X';
  Cells[2,0]:='Y';
 end;
Showmessage('Введите координаты в таблицу')  
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i,j,k,t,t1,m,newt:integer;
    xmx,xmn,ymx,ymn,x0,y0:integer;
    ms:real;
    s:string;
begin
k:=0;
for i:=1 to n do
for j:=1 to 2 do
if StrToIntDef(Sg1.Cells[j,i],-1)=-1 then k:=1;
if k=1 then
 begin
  Showmessage('Не все координаты введены или неправильный формат');
  exit
 end;
for i:=1 to n do
 begin
  p[i].x:=StrToInt(Sg1.Cells[1,i]);
  p[i].y:=StrToInt(Sg1.Cells[2,i]);
 end;
//строим оболочку
t1:=1;{выбираем первую точку}
for i:=1 to n do
if (p[i].y<p[t1].y)or((p[i].y=p[t1].y) and (p[i].x<p[t1].x)) then t1:=i;
t:=t1;
m:=0;
repeat
m:=m+1;//запоминаем координаты и номер выбранной точки
p1[m].x:=p[t].x;p1[m].y:=p[t].y;p1[m].k:=t;
newt:=0;
{ Поиск следующей вершины }
for i:=1 to n do
if i<>t then
if (newt=0) or (IsLeft(p[t], p[i], p[newt]))then newt:=i;
t:=newt;
until t=t1;//дошли обратно до первой выбранной точки
for i:=1 to m do
with sg2 do
 begin
  Cells[0,i]:=IntToStr(i);
  Cells[1,i]:=IntToStr(p1[i].x);
  Cells[2,i]:=IntToStr(p1[i].y);
  RowCount:=RowCount+1;
 end;
m:=m+1;
p1[m].x:=p1[1].x;p1[m].y:=p1[1].y;{замкнем оболочку}
with sg2 do
 begin
  Cells[0,m]:='1';
  Cells[1,m]:=IntToStr(p1[m].x);
  Cells[2,m]:=IntToStr(p1[m].y);
 end;
//найдем мин и макс по Х и У  
xmn:=p[1].x;ymn:=p[1].x;
ymn:=p[1].Y;ymx:=p[1].Y;
for i:=1 to n do
 begin
  if p[i].x<xmn then xmn:=p[i].X;
  if p[i].x>xmx then xmx:=p[i].X;
  if p[i].y<ymn then ymn:=p[i].y;
  if p[i].y>ymx then ymx:=p[i].y;
 end;
Image1.Height:=Image1.Width; //квадратный Image
//определим масштаб
if xmx-xmn>ymx-ymn then ms:=(Image1.Width-40)/(xmx-xmn)
else ms:=(Image1.Width-40)/(ymx-ymn);
x0:=20; //начало отсчета по Х и Y
y0:=20;
with Image1.Canvas do
 begin
   //нарисуем выпуклую оболочку
  pen.Color:=clBlue;
  moveto(x0+round((p1[1].x-xmn)*ms),y0+round((p1[1].y-ymn)*ms));
  for i:=1 to m do
  lineto(x0+round((p1[i].x-xmn)*ms),y0+round((p1[i].y-ymn)*ms));
  //нарисуем все точки
  pen.Color:=clRed;
  for i:=1 to n do
   begin
    ellipse(x0+round((p[i].x-xmn)*ms)-2,y0+round((p[i].y-ymn)*ms)-2,
            x0+round((p[i].x-xmn)*ms)+2,y0+round((p[i].y-ymn)*ms)+2);
    str(i,s);
    textout(x0+round((p[i].x-xmn)*ms)+5,y0+round((p[i].y-ymn)*ms),s);
   end;
 end;
end; 
end.
Вложения
Тип файла: zip Выпуклая оболочка.zip (246.3 Кб, 202 просмотров)
4
9 / 9 / 3
Регистрация: 02.01.2012
Сообщений: 169
17.04.2012, 18:22  [ТС] 8
Puporev, а вот за это спасибо, только рисунок все равно не корректный, но это ничего, ибо понял, что обойдусь и без него.
0
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
17.04.2012, 19:15 9
Цитата Сообщение от K1m Посмотреть сообщение
только рисунок все равно не корректный,
В чем он некорректный?
0
9 / 9 / 3
Регистрация: 02.01.2012
Сообщений: 169
18.04.2012, 19:38  [ТС] 10
Цитата Сообщение от Puporev Посмотреть сообщение
В чем он некорректный?
Задача на построение выпуклой оболочки
0
0 / 0 / 0
Регистрация: 18.04.2012
Сообщений: 15
18.04.2012, 20:32 11
есть корректная? киньте плиз

Добавлено через 25 минут
Puporev можешь подкорректировать прогу на задачу выпуклой оболочки

Добавлено через 3 минуты
Цитата Сообщение от Puporev Посмотреть сообщение
В чем он некорректный?
можешь подкорректировать?

Добавлено через 1 минуту
Цитата Сообщение от K1m Посмотреть сообщение
Вот задача: на плоскости задано N точек, которые пронумерованы слева на право (а при равных абсциссах снизу вверх). Нужно создать программу, которая строит многоугольник, который является выпуклой их оболочкой, не более чем за C*N действий.
Я уже выяснил, что решается она с помощью алгоритма Джарвиса (с этим, думаю, разберусь сам). Непонятным остается то, как вывести результат. Ввожу координаты точек через stringgrid. Вопрос: как нарисовать точки и соединить их линиями?
скинь плиз то что ты сделал
0
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
18.04.2012, 20:37 12
Ну и в чем некорректность? Или ты считаешь что оболочка должна проходить через все точки и в том порядке, как ввели? Если так, то лечись. Ты бы хоть на графику глянул.

Добавлено через 2 минуты
Ернар, И ты тоже с головой не дружишь?
1
0 / 0 / 0
Регистрация: 18.04.2012
Сообщений: 15
18.04.2012, 20:42 13
Цитата Сообщение от Puporev Посмотреть сообщение
Ну и в чем некорректность? Или ты считаешь что оболочка должна проходить через все точки и в том порядке, как ввели? Если так, то лечись. Ты бы хоть на графику глянул.

Добавлено через 2 минуты
Ернар, И ты тоже с головой не дружишь?
не обисуй...я воще не шарю в программировании...просто нужно чтобы через узловые точки проходила линия можешь так сделать?
0
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
18.04.2012, 20:50 14
Цитата Сообщение от Ернар Посмотреть сообщение
просто нужно чтобы через узловые точки проходила линия
Через какие точки и какая линия? Если у тебя другая задача, то создавай тему и пиши точное условие, а здесь тема про
Цитата Сообщение от K1m Посмотреть сообщение
Нужно создать программу, которая строит многоугольник, который является выпуклой их оболочкой,
Что я и написал. Если не имеете понятия что такое выпуклая оболочка, то и не вякайте.
0
0 / 0 / 0
Регистрация: 18.04.2012
Сообщений: 15
18.04.2012, 20:50 15
Цитата Сообщение от Puporev Посмотреть сообщение
Ну и в чем некорректность? Или ты считаешь что оболочка должна проходить через все точки и в том порядке, как ввели? Если так, то лечись. Ты бы хоть на графику глянул.

Добавлено через 2 минуты
Ернар, И ты тоже с головой не дружишь?
не через все конечно....желательно чтобы все точки отобразились и по крайним точкам линия провелась....огроооомное спасибо заранее....это к моей дипломке просто....а я в ЯП воообще поооолный ноль((
0
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
18.04.2012, 20:51 16
Ернар, Ты настолько плох, что не можешь скачать архив и запустить программу?
1
0 / 0 / 0
Регистрация: 18.04.2012
Сообщений: 15
18.04.2012, 20:52 17
Цитата Сообщение от Puporev Посмотреть сообщение
Через какие точки и какая линия? Если у тебя другая задача, то создавай тему и пиши точное условие, а здесь тема про

Что я и написал. Если не имеете понятия что такое выпуклая оболочка, то и не вякайте.
да эта тема эта.....все хорошо.....просто нужно чтобы линия прошла по крайним точкам...таким образом создавая выпуклую оболочку....и чтобы все это было видно в графике

Добавлено через 52 секунды
Цитата Сообщение от Puporev Посмотреть сообщение
Ернар, Ты настолько плох, что не можешь скачать архив и запустить программу?
)))) я скачал и запустил.....на графике тока одна точка получается и все как на рисунке выше
0
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
18.04.2012, 21:02 18
Вот что у меня. Что не так?
Миниатюры
Задача на построение выпуклой оболочки  
1
0 / 0 / 0
Регистрация: 18.04.2012
Сообщений: 15
18.04.2012, 21:05 19
Цитата Сообщение от Puporev Посмотреть сообщение
Вот что у меня. Что не так?
воооо то что нужно....а у меня тока одна точка.....(сорь я не знаю как сфоткать показал бы)

Добавлено через 1 минуту
Цитата Сообщение от Puporev Посмотреть сообщение
Вот что у меня. Что не так?
посмотри час у Кима там фотка есть....вот так и у меня получается.....
0
250 / 71 / 18
Регистрация: 10.04.2010
Сообщений: 532
Записей в блоге: 3
18.04.2012, 21:11 20
Цитата Сообщение от Ернар Посмотреть сообщение
воооо то что нужно....а у меня тока одна точка.....(сорь я не знаю как сфоткать показал бы)

Добавлено через 1 минуту


посмотри час у Кима там фотка есть....вот так и у меня получается.....
Четные значения вводи и будет тебе не одна точка!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2012, 21:11
Помогаю со студенческими работами здесь

Нахождение выпуклой оболочки (3D)
Здравствуйте, может на этом форуме кто-нибудь сможет помочь. Мне завтра надо сдавать лабораторную,...

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

Определение выпуклой оболочки по методу Джарвиса
помогите мне написать программу плиз) желательно до четверга и обязательно на бейсике

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru