С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/37: Рейтинг темы: голосов - 37, средняя оценка - 4.89
 Аватар для K1m
9 / 9 / 3
Регистрация: 02.01.2012
Сообщений: 169

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

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

Студворк — интернет-сервис помощи студентам
Вот задача: на плоскости задано N точек, которые пронумерованы слева на право (а при равных абсциссах снизу вверх). Нужно создать программу, которая строит многоугольник, который является выпуклой их оболочкой, не более чем за C*N действий.
Я уже выяснил, что решается она с помощью алгоритма Джарвиса (с этим, думаю, разберусь сам). Непонятным остается то, как вывести результат. Ввожу координаты точек через stringgrid. Вопрос: как нарисовать точки и соединить их линиями?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2012, 14:22
Ответы с готовыми решениями:

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

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

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

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

Решение

Я вот так нарисовал, где идею алгоритма почерпнул, не помню, реализация моя..
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 Кб, 207 просмотров)
4
 Аватар для K1m
9 / 9 / 3
Регистрация: 02.01.2012
Сообщений: 169
17.04.2012, 18:22  [ТС]
Puporev, а вот за это спасибо, только рисунок все равно не корректный, но это ничего, ибо понял, что обойдусь и без него.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
17.04.2012, 19:15
Цитата Сообщение от K1m Посмотреть сообщение
только рисунок все равно не корректный,
В чем он некорректный?
0
 Аватар для K1m
9 / 9 / 3
Регистрация: 02.01.2012
Сообщений: 169
18.04.2012, 19:38  [ТС]
Цитата Сообщение от Puporev Посмотреть сообщение
В чем он некорректный?
0
0 / 0 / 0
Регистрация: 18.04.2012
Сообщений: 15
18.04.2012, 20:32
есть корректная? киньте плиз

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

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

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

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

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

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

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

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

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

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


посмотри час у Кима там фотка есть....вот так и у меня получается.....
Четные значения вводи и будет тебе не одна точка!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.04.2012, 21:11
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru