0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
1

Как в делфи нарисовать множество точек?

21.04.2009, 14:10. Показов 10021. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здрасте вам! Мне нужно нарисовать множество точек на форме (штук 10). Координаты 3-мя способами ввести: с клавиатуры, рандомом и из файла. Спасибо! И если есть где-то литература по этой теме совсем для чайников, ткните меня туда носом. Искал - не нашел.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2009, 14:10
Ответы с готовыми решениями:

Нарисовать на экране заданное множество точек
Здравствуйте!Пожалуйста,помогите с программой. Во множестве точек на плоскости найти пару точек с...

как нарисовать Elipse в делфи 7
Нужно нарисовать элиипс в делфи Вот парабола... такой код procedure...

Как нарисовать квадрат в делфи?
И найти площадь

Как нарисовать график массива точек x[i]?
program Project1; {$APPTYPE CONSOLE} uses SysUtils; const h=0.01; mu=0.1; n=100; var...

22
Эксперт С++
3189 / 870 / 39
Регистрация: 29.12.2008
Сообщений: 952
21.04.2009, 14:54 2
Чтобы поставить точку на форме, нужно просто закрасить пиксель определенным цветом. Это так делается (допустим, красным цветом точку с коорд. Х и Y):
Delphi
1
canvas.Pixels[x,y]:=clRed;
x и y типа integer. Вот в принципе и всё. Для твоей задачи код будеn примерно такой:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function .....():.....
var x,y: Integer;
     i: byte;
begin
     for i:=1 to 10 do
     begin
        .............................
        .............................
        {здесь получаем координаты с клавиатуры
          или рандомно генерим или из файла считываем
          и потом сохраняем их в x и y и затем....}
         canvas.Pixels[x,y]:=clRed;    //...ставим точку на нужные координаты.
     end;
end;
Ну и ссылочку: http://www.codenet.ru/progr/delphi/stat/gdi.php
как рисовать на канве в Delphi.
2
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
21.04.2009, 17:07  [ТС] 3
Спасибо! С этим разобрался. Вот точки бы пожирнее сделать. И у задачи этой продолжение есть: Из этих точек выбрать две различные точки так, чтобы окружности заданного радиуса с центрами в этих точках содержали внутри себя одинаковое количество заданных точек.

Добавлено через 34 минуты 34 секунды
И еще. Когда пытаюсь вводить координаты точек с клавиатуры использую striggrid. В одну колонку ввожу координаты по Х в другую по У. И по нажатии кнопки, должны появляться точки.
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.Button2Click(Sender: TObject);
var x,y,i:integer;
begin
 for i:=2 to 11 do
  begin
   x:=strtoint(stringgrid1.Cells[2,i]);
   y:=strtoint(stringgrid1.Cells[3,i]);
   form1.canvas.Pixels[x+10,y+10];
  end;
end;
вот это я пишу в коде программы. Программу запускаю. От балды ввожу значения и жму на кнопку. Вот такая ошибка выскакивает:
Project Project1.exe raised exception class EConvertError with message '''is not a valid integer value'. Process stopped. Use step or run to continue.
что это? подскажите
0
Эксперт С++
3189 / 870 / 39
Регистрация: 29.12.2008
Сообщений: 952
21.04.2009, 17:47 4
В StringGrid нумерация начинается с нуля. Т.е. те серенькие клетки имеют индекс ноль. А ошибка эта потому что среди клеток StringGrida попались незаполненные и функция StrToInt не смогла их преобразовать. Я немного поправил код. Пусть на форме лежит StringGrid, с настройками ColCount:=3 и RowCount:=11.(скорей всего у тебя так и есть):
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.Button1Click(Sender: TObject);
var x,y,i:integer;
begin
  for i:=1 to 10 do
  begin
   x:=strtoint(stringgrid1.Cells[1,i]);
   y:=strtoint(stringgrid1.Cells[2,i]);
   form1.canvas.Pixels[x+10,y+10]:=clRed;;
  end;
end;
Вот так будет работать.
1
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
21.04.2009, 18:48  [ТС] 5
И че было самому не догадаться? Спасибо огромное!

Добавлено через 57 минут 49 секунд
А чтобы данные из файлп взять, чем и как лучше воспользоваться?
0
Эксперт С++
3189 / 870 / 39
Регистрация: 29.12.2008
Сообщений: 952
21.04.2009, 19:21 6
Я бы так сделал: пусть имеем файл fail.txt, а в нем числа, например, (чтобы были точки (10,24), (23,19)...) такие:
Код
10 24 23 19 ...
Тогда функция, считывающая пары чисел из файла и рисующая точки будет выглядеть примерно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
var i,x,y: integer;
     f: textfile;
begin
 AssignFile(f,'file.txt'); //инициализируем файл
 reset(f);                  //открываем его на чтение
 for i:=1 to 10 do
 begin
  read(f,x,y);            //считываем очередную пару
  canvas.Pixels[x,y]:=clRed;   //и рисуем точку
 end;
 closefile(f);              //закрываем файл
end;
1
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
21.04.2009, 19:24  [ТС] 7
а можно этим же способом считывать не пары, а допустим, тройки, четверки и т.д. чисел? Когда доберусь до окружностей с центрами в этих точках, было бы удобно. И все таки пожирнее бы точки сделать. Что-то слышал про TPoint, но пользоваться им не умею...
0
Эксперт С++
3189 / 870 / 39
Регистрация: 29.12.2008
Сообщений: 952
21.04.2009, 19:32 8
В таком варианте - да, в файле с проектом, но если он лежит не там, то всё равно можно его использовать файл, но прописывать его полное имя, например:
Delphi
1
AssignFile(f,'C:\Program Files\file.txt');
тройки-четверки тоже можно считывать ф-ей read:
Delphi
1
2
read(f,x,y,z);
read(f,x,y,z,s);
вообще синтаксис такой, что параметров сколько угодно, т.е. первый параметр-файл, а остальные - любое число числовых переменных. Главное - чтобы в файле не было ничего кроме чисел.
1
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
21.04.2009, 19:34  [ТС] 9
Спасибо! Очень доступно объясняешь. Прочти мое предыдущее сообщение, я там исправил маленько
0
Эксперт С++
3189 / 870 / 39
Регистрация: 29.12.2008
Сообщений: 952
21.04.2009, 19:45 10
Delphi
1
2
3
4
 type TPoint = packed record
   X: Longint;
   Y: Longint;
end;
- это всего лишь простая запись, состоящая из двух целых чисел, для хранения координат в двухмерной плоскости. Просто удобно пользоваться. иногда, чтобы хранить очень много точек, легко создать массив из таких записей, а не возиться с двумя массивами x и y.
Насчет точек пожирнее, даже не знаю. Точка по сути это и есть 1 пиксель. Настроек чтобы они больше были кажется нет. Наверно лучше сделать игру фона, чтобы их выделить - белые точки на черной форме, как-то так.
0
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
22.04.2009, 08:36  [ТС] 11
А как мне в stringgrid на сереньких клетках подписи замутить?

Добавлено через 17 минут 36 секунд
Еще пара вопросов есть. Мне нужно выбрать из этих точек две такие, чтобы окружности с центрами в этих точках содержали в себе одинаковое количество оставшихся точек. Рисовать окружности надо в этом же цикле от 1 до 10, да?

Добавлено через 2 часа 9 минут 28 секунд
И еще. Рисую окружности, с радиусами в этих точках, а они получаются закрашеными в цвет формы. Как их прозрачными сделать? чтобы было видно точку, вокруг которой она нарисована

Добавлено через 1 час 11 минут 2 секунды
Ух ты! Сам разобрался! А надо было всего лишь поменять очередность рисования кружков и точек
0
Эксперт С++
3189 / 870 / 39
Регистрация: 29.12.2008
Сообщений: 952
22.04.2009, 09:46 12
Цитата Сообщение от Olega-Irkutsk Посмотреть сообщение
А как мне в stringgrid на сереньких клетках подписи замутить?
Так же как и на беленьких. Просто обращаешься к нулевым индексам:
Delphi
1
StringGrid1.Cells[i,0]:='надпись';
А окружности наверно не нужно рисовать в цикле. По условию, если я правильно понял, нам нужно в конце получить всего две окружности. Значит нужно их находить, не в цикле, а отдельно, когда известны все точки. А значит, нужна информация о точках, а её, лучше всего хранить в массиве (как я в пред. сообщении написал - либо масив из 10 TPaint, либо 2 массива с X и c Y). Потом мы будем смотреть на сохраненные координаты и, соответственно, решать задачу.

А чтобы решить задачу, полезно нарисовать всё на бумаге и прикинуть как это сделать.
0
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
22.04.2009, 10:11  [ТС] 13
В массив Tpoint я уже переделал. Как решать тоже придумал. Надо наверна взять радиус одной окружности и сравнивать его с расстояниями от центра этой окружности до остальных точек. Если расстояние до точки меньше радиуса, то значит точка внутри окружности. Потом переходить ко второй окружности. И так же проверять. А вот как это в коде написать? Здесь-то по-любому какой-то цикл нужен, да? или вручную перебирать. Я даже формулу нашел, по которой расстояние между точками находить

Добавлено через 9 минут 49 секунд
И еще. Что надо поменять, чтобы окружности не были залиты цветом?
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
22.04.2009, 12:26 14
Насчет точек пожирнее, даже не знаю.
Не точки рисовать, а закрашенные круги радиусом 2-3 пиксела.
Что надо поменять, чтобы окружности не были залиты цветом?
А кто это тебе залил? Скажи ему чтоб не заливал. Если будешь просто рисовать Circle, то с чего они залитыми-то будут?
0
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
22.04.2009, 12:29  [ТС] 15
Цитата Сообщение от Puporev Посмотреть сообщение
А кто это тебе залил? Скажи ему чтоб не заливал. Если будешь просто рисовать Circle, то с чего они залитыми-то будут?
Это как? вместо ellipse писать circle да?
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
22.04.2009, 12:44 16
Да хоть и Ellipse, если не дать команду залить, то с чего они залитыми будут?
Вот пример жирных точек.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
var x,y,i:integer;
begin
randomize;
for i:=1 to 10 do
  begin
    x:=random(200);
    y:=random(200);
    Canvas.Ellipse(x-2,y-2,x+2,y+2);
    Canvas.Brush.Color:=clBlack;
    Canvas.FloodFill(x,y, clBlack, fsBorder);
  end;
end;
1
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
22.04.2009, 12:52  [ТС] 17
Цитата Сообщение от Puporev Посмотреть сообщение
Да хоть и Ellipse, если не дать команду залить, то с чего они залитыми будут?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.Button1Click(Sender: TObject);   //случайно
var x,y,i,r:integer;
    m:array[1..10] of tpoint;
begin
 for i:=1 to 10 do
 begin
   m[1].x:=random(280);
   m[1].y:=random(250);
   r:=50;
   form1.Canvas.Pixels[m[1].x,m[1].y]:=clWhite;
   Form1.Canvas.Pen.Color := clRed;
   form1.Canvas.Ellipse(m[1].x-r,m[1].y-r,m[1].x+r,m[1].y+r);
 end;
end;
А где это меняеся? чтобы они не были залитыми
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
22.04.2009, 14:15 18
Чтобы эллипсы не заливались, надо выбрать стиль bsClear.
Вот процедурка рисует 10 точек и 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
type
 Point=record
      x,y:integer;
      end;
 
var
  Form1: TForm1;
   m:array[1..10] of Point;
........................................
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
randomize;
 for i:=1 to 10 do
  begin
   m[i].x:=random(200)+200;
   m[i].y:=random(200)+200;
   Canvas.Brush.Color:=clBlack;
   Canvas.Ellipse(m[i].x-2,m[i].y-2,m[i].x+2,m[i].y+2);
  end;
  Canvas.Brush.Style:=bsClear;
  Canvas.Ellipse(m[2].x-50,m[2].y-50,m[2].x+50,m[2].y+50);
  Canvas.Ellipse(m[8].x-80,m[8].y-80,m[8].x+80,m[8].y+80);
end;
1
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 11
23.04.2009, 08:43  [ТС] 19
А с остальной задачей мне поможете? "... выбрать две точки так, чтобы окружности с центрами в этих точках, содержали в себе одинаковое количество заданных точек.
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
23.04.2009, 11:13 20
Что-то поговорку вспомнил. Дайте воды попить, а то так есть хочется, что переночевать негде.
Вот посмотри.
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
const n=40;
type
 Point=record
       x,y,kt:integer; //добавим поле-кол. "захваченных" точек
       end;
 mas=array[1..n] of Point;
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
function Rasst(a1,a2:point):integer;
begin
result:=round(sqrt(sqr(a1.x-a2.x)+sqr(a1.y-a2.y)));
end;
procedure KolTch(m:mas;r:integer;var a1,a2:Point;var f:byte);
var i,j:byte;
    k:integer;
begin
//считаем сколько точек "захватила" окружность из этой точки
for i:=1 to n do
  begin
    k:=0;
    for j:=1 to n do
    if (Rasst(m[i],m[j])<=r) then k:=k+1;
    m[i].kt:=k;
  end;
//ищем 2 первые точки с равным количеством "захваченных" точек
f:=0;
for i:=1 to n-1 do
  begin
    for j:=i+1 to n do
    if m[i].kt=m[j].kt then
      begin
        f:=1;
        a1:=m[i];
        a2:=m[j];
        break; //если нашли, дальше не ищем
      end;
   end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i,R:integer;
    t1,t2:Point;
    k:byte;
    ms:mas;
begin
randomize;
for i:=1 to n do
  begin
   ms[i].x:=random(200)+200;
   ms[i].y:=random(250)+50;
   Canvas.Brush.Color:=clBlack;
   Canvas.Ellipse(ms[i].x-2,ms[i].y-2,ms[i].x+2,ms[i].y+2);
  end;
R:=StrToInt(Edit1.Text);
KolTch(ms,R,t1,t2,k);
Edit2.Text:=IntTostr(t1.kt);
Edit3.Text:=IntTostr(t2.kt);
if k=0 then ShowMessage('Таких точек нет!')else
  begin
   Canvas.Brush.Style:=bsClear;
   Canvas.Ellipse(t1.x-R,t1.y-R,t1.x+R,t1.y+R);
   Canvas.Ellipse(t2.x-R,t2.y-R,t2.x+R,t2.y+R);
   Canvas.Brush.Style:=bsSolid;
   Canvas.Brush.Color:=clRed;
   Canvas.Ellipse(t1.x-4,t1.y-4,t1.x+4,t1.y+4);
   Canvas.Ellipse(t2.x-4,t2.y-4,t2.x+4,t2.y+4);
  end;
end;
2
23.04.2009, 11:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2009, 11:13
Помогаю со студенческими работами здесь

Множество. (Делфи 7)
Помогите пожалуйста! Я плохо разбираюсь на тему множество. (Вот обязательные компоненты в Edit я...

Множество точек
Помогите реализовать вот эту программу без TPoint Задание:Даны два множества точек на плоскости....

Множество точек
не знаю точно к какому разделу относится эт задача....но помогите пжлста)) определить радиус и...

Множество точек и круг
Всем привет... Парни помогите с понятием формулировки: на плоскости заданно множество точек М и...


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

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

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