Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заставить выводить генерации в канвас? 
:(
    Опции темы
Fringe
Дата 13.5.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Условия задачи таковы:Кольцо шириною 30, внешняя окружность которого проходит как минимум через три точки Т, содержащее максимум точек ТТ.

Господа, помогите пожалуйста, кто чем может, я не могу понять как заставить выводить все генерации графически, программа выводит самую оптимальную и все тут.
Как заставить выводить ее все вариации и где больше всего точек лежит в кольце то и окрашивать в иной цвет + выводить информацию об этом.
Код обработчика:
Код

procedure TForm1.btnSearchClick(Sender: TObject);
var g: Boolean;
    pen1: TPen;
    f:textfile;
    p,q,qt,res,REST:array of integer;

    i,j,count, a, b, c, d, shift,m, n, pCount: integer;
    rect: TRect;


begin
kol:=0;
  SetLength(x, 20);
  SetLength(y, 20);
  SetLength(xt, 20);
  SetLength(yt, 20);
 for i:= 0 to points do
  begin
    x[i] := strtoint(stgCoords.Cells[0,i+1]);
    y[i] := strtoint(stgCoords.Cells[1,i+1]);

  end;
  for j := 0 to points do
  begin
    xt[j] := strtoint(stgCoordsT.Cells[0,j+1]);
    yt[j] := strtoint(stgCoordsT.Cells[1,j+1]);
  end;

  stgParall.Cells[0,0] := 'X';
  stgParall.Cells[1,0] := 'Y';

SetLength(res, 4);
for i:=0 to 2 do res[i]:=i;
res[3]:=0;
SetLength(q, 3);
for i:=0 to 2 do q[i]:=i;
//гланый цикл
g:= true;
while g do
begin
   // поиск координат центра окружности проходящих через три точки
   Z := (2*(x[q[0]]*(y[q[2]]-y[q[1]])+x[q[1]]*(y[q[0]]-y[q[2]])+x[q[2]]*(y[q[1]]-y[q[0]])));
   if z <> 0 then // если точки не находятся на одной линии
   begin
     X0 := ((y[q[2]]-y[q[1]])*(sqr(x[q[0]])+sqr(y[q[0]]))+
         (y[q[0]]-y[q[2]])*(sqr(x[q[1]])+sqr(y[q[1]])) +
         (y[q[1]]-y[q[0]])*(sqr(x[q[2]])+sqr(y[q[2]])))/z;
     y0 := ((x[q[1]]-x[q[2]])*(sqr(x[q[0]])+sqr(y[q[0]]))+
         (x[q[2]]-x[q[0]])*(sqr(x[q[1]])+sqr(y[q[1]])) +
         (x[q[0]]-x[q[1]])*(sqr(x[q[2]])+sqr(y[q[2]])))/z;
         // радиус внешней окружности
         R1:= sqrt(sqr(y0-y[q[0]])+sqr(x0-x[q[0]]));
         // радиус внутренней окружности
         r2:=r1-30;
         // подсчитывается количество точек, попадающих на кольцо
         pCount := 0;
         for i:= 0 to points do
         begin
            if (q[0]<>i)and (q[1]<>i)and(q[2]<>i) then
            begin
             ToPoint:= sqrt(sqr(y0-y[i])+sqr(x0-x[i]));
             if (ToPoint>=r2) and (ToPoint<=r1) then pCount:= pCount + 1;
            end;
         end;
         // если количество точек попавших на текущее кольцо, больше,
         // чем в предыдущей генерации, перезаписываем массив результатов
      if pCount > res[3] then
        begin
          res[3]:= pCount;
          for i:= 0 to 2 do
           res[i]:=q[i];
           X0Res:= X0;
           Y0Res:= Y0;
           R1Res:= R1;
        end;
   end;
   GenSoch(q,g,points); // генерируется следующее сочетание

end;
 begin
 for j := 0 to points do
  begin
   if
   ((xt[j]<x[res[0]]) and (xt[j]>x[res[0]]-30) or
   (xt[j]< x[res[1]]) and (xt[j]>x[res[1]]-30) or
   (xt[j]< x[res[2]]) and (xt[j]>x[res[2]]-30) or
   (yt[j]< y[res[0]]) and (yt[j]>y[res[0]]-30) or
   (yt[j]< y[res[1]]) and (yt[j]>y[res[1]]-30) or
   (yt[j]< y[res[2]]) and (yt[j]> y[res[2]]-30))
   then
   kol:=kol+1;
   end;
 end;
 //заполнение таблицы результатов
  for i:=1 to 3 do
  begin
     stgParall.cells[0,i]:= inttostr(x[res[i-1]]);
     stgParall.cells[1,i]:= inttostr(y[res[i-1]]);
  end;
  kol1.Caption:='Количество ТТ в кольце = '+ inttostr(kol);
  shift := 30;
  form3.visible := true;
end;

Код графики:
Код

 // отображение всех точек из таблицы
  imgparall.Canvas.Brush.color := clred;
  imgparall.Canvas.Pen.color := clGreen;
  imgparall.Canvas.Pen.Style := psSolid;
  for i:=0 to points do
  imgparall.Canvas.Ellipse(x[i] + shift-3,imgparall.Height-1 - y[i] - shift-3,
                x[i] + shift+3,imgparall.Height-1 - y[i] - shift+3);

  imgparall.Canvas.Brush.style := bsClear;
  imgparall.Canvas.Ellipse(round(x0res - R1Res + shift),round(imgparall.Height-1 - Y0Res - R1Res - shift),
               round(x0Res + shift+R1Res),round(imgparall.Height-1 - y0Res - shift+R1Res));
  imgparall.Canvas.Ellipse(round(x0res - R1Res+30 + shift),round(imgparall.Height-1 - Y0Res - R1Res+30 - shift),
                round(x0Res + shift+R1Res - 30),round(imgparall.Height-1 - y0Res-30 - shift+R1Res));

  imgparall.Canvas.Brush.color := clblack;
  imgparall.Canvas.Pen.color := clGreen;
  imgparall.Canvas.Pen.Style := psSolid;

       for j:=0 to points do
imgparall.Canvas.Ellipse(xt[j] + shift-3,imgparall.Height-1 - yt[j] - shift-3,
                xt[j] + shift+3,imgparall.Height-1 - yt[j] - shift+3);
end;



Заранее всем спасибо за советы!
PM MAIL   Вверх
DarkProg
Дата 13.5.2010, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(Fringe @  13.5.2010,  20:12 Найти цитируемый пост)
программа выводит самую оптимальную и все тут.

Ещё бы, а какую же она будет выводить если судя по коду, вы сначала отыскиваете самую оптимальную комбинацию, а потом её и рисуете.


Цитата(Fringe @  13.5.2010,  20:12 Найти цитируемый пост)
Как заставить выводить ее все вариации и где больше всего точек лежит в кольце то и окрашивать в иной цвет + выводить информацию об этом.
Код обработчика:

Очень просто:вы находите первый вариант и считаете сколько у вас там точек, попадает в кольцо и рисуете первым цветом "clYellow", потом второе кольцо - его точки отмечаете "clGreen" и т.д., потом выдаёте информацию о сответствии цветов точек полученным результатам скажем как в Excel'e у графиков с легендой.

Есть более сложный вариант, но там нужно уже знать классы или хотябы записи, правда с этим вариантом можно и более красивых вещей добиться(если хотите поясню).

Если неправильно понимаю, то попробуйте расписать более детально задачу smile


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Fringe
Дата 13.5.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



DarkProg, а как сделать чтобы она все выводила?

с цветом все понял, а что за классы такие, можно по подробнее.
PM MAIL   Вверх
DarkProg
Дата 15.5.2010, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(Fringe @  13.5.2010,  21:36 Найти цитируемый пост)
DarkProg, а как сделать чтобы она все выводила?

Т.Е. все выводила????
Вы канвас сначала сбрасываете а потом заново рисуете???

Какой у вас опыт программирования???(если вы начинающий, ну т.е. совсем недавно-меньше полу года, то пока я не советую изучать и сильно вдаваться, лучше просто почитывайте книги по остальному, по компонентам и т.д.)


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Fringe
Дата 15.5.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Ну смотрите, например у меня по координатам получается два кольца, которые построены по трем точкам. В 1 находится больше точек, чем во 2. И на канвас должны выводится оба кольца и то кольцо в котором больше точек, удовлетворяющих условиям, должно окрашиваться в другой цвет.

Опыт с делфи только полгода :( 
PM MAIL   Вверх
DarkProg
Дата 17.5.2010, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Прикрепите весь проект, потому что я не пойму как у вас вообще кольца рисуются, может я смогу тогда понять....


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Fringe
Дата 17.5.2010, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Вот. Тут лежит все. 
Работаю в Delphi 2010

Это сообщение отредактировал(а) Fringe - 17.5.2010, 08:44

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  _______________.rar 388,40 Kb
PM MAIL   Вверх
DarkProg
Дата 18.5.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Поглядел, наконец-таки(едит стрингридом поуху того к то умудрился в два дня запихать такое число лабораторок и практик)

Обратите внимание на вот этот кусочек кода

Код

    // если количество точек попавших на текущее кольцо, больше,
         // чем в предыдущей генерации, перезаписываем массив результатов
      if pCount > res[3] then
        begin
          res[3]:= pCount;
          for i:= 0 to 2 do
           res[i]:=q[i];
           X0Res:= X0;
           Y0Res:= Y0;
           R1Res:= R1;
        end;


Не надо делать перезаписи.(расскажу ка я вам про записи)

Итак записи это похоже как тип переменной
Объявляется так (сразу Var Form1:TForm1)
 
Код

Type TAllCircles=record
   x0,y0,r:integer; //ну ка бы координаты вершины и радиус
   point:array of TPoint; вот к сожалению не помню TPoint , будет нормально доступен или нет, в общем если добавите так и не компилит, значит объявите ещё TKoord перед этой записью и замените Tpoint на TKoord
 end;

 type TKoord=record
  x,y:integer
 end;


Теперь вам нужно объявить массив всех возможных вариантов ваших колец(обычно мне такие структуры нужны в разных частях программы поэтому объявляю их как глобальные переменные)
Код

Var AllCirles:array of TAllCircles;
......

//обращаться к внутренним переменным так?
AllCircles[i].x0:=123;
AllCircles[i].y0:=456;
AllCircles[i].r:=959;
//Для установки длины массива всех точек которые надо записать так
SetLength(AllCircles[i].point, length(AllCircles[i].point)+1);//увеличили длину ровно на 1
//теперь смело обращаемся к нужному элементу
AllCircles[i].point[high(AllCircles[i].point)].x:=100;
AllCircles[i].point[high(AllCircles[i].point)].y:=200;


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

Если что не понятно спрашивайте

P.S. в коде могут быть мелкие ошибки, т.к. писал от руки прям в браузере и не проверял

Это сообщение отредактировал(а) DarkProg - 18.5.2010, 15:21


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Fringe
Дата 18.5.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



DarkProg, так... более менее понял что да как, но куда что переписать не понял(с переменными знаю что и куда). Особенно это:
Код

Var AllCirles:array of TAllCircles;
......
//обращаться к внутренним переменным так?
AllCircles[i].x0:=123;
AllCircles[i].y0:=456;
AllCircles[i].r:=959;
//Для установки длины массива всех точек которые надо записать так
SetLength(AllCircles[i].point, length(AllCircles[i].point)+1);//увеличили длину ровно на 1
//теперь смело обращаемся к нужному элементу
AllCircles[i].point[high(AllCircles[i].point)].x:=100;
AllCircles[i].point[high(AllCircles[i].point)].y:=200;


PM MAIL   Вверх
DarkProg
Дата 18.5.2010, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



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

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

Дальше, я не писал, так как посчитал не нужным, нужно определить размер массива(т.к. заранее размер неизветен будем выделять по одному в 8-ой строке написано как это делается)
Потом обращаемся к последнему элементу и добавдляем все данные в запись, и массивом загоняем те точки которые попали в кольцо.
Я специально задал внутри ещё массив точек попавших в кольцо, чтобы можно было потом их раскрашивать другим цветом.
Т.е. увеличить длину массива AllCircles надо в тот момент как только определяется что через три точки можно провести окружность.

Я надеюсь так понятнее. smile

Кстати по поводу кода - а не проще ли данные считывать из файла и сразу их кидать и в stringgrid и в те массивы где оно всё хранится при расчётах??? - подумайте над этим.

P.S. И ещё я думаю вам обязательно надо купить книгу по Delphi(набираете по отзывам в нете штук 10 вариантов, потом идёте в магазин и выбираете ту в которой для вас понятно написано) - книг у самого не мало и поверьте они весьма полезны


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Fringe
Дата 18.5.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



DarkProg, а можете в код это мой все включить? Я не могу понять что-то :(

Скорее всего инженерная графика влияет так негативно :(
PM MAIL   Вверх
DarkProg
Дата 18.5.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(Fringe @  18.5.2010,  18:14 Найти цитируемый пост)
DarkProg, а можете в код это мой все включить? Я не могу понять что-то :(

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

Цитата(Fringe @  18.5.2010,  18:14 Найти цитируемый пост)
Скорее всего инженерная графика влияет так негативно :( 

Да чёрт его знает что влияет негативно - может быть просто качество образования....


Вообще совет насчёт книг весьма актуален - попробуйте, может сами дойдёте, пока я буду тут со своимим проблемами разбираться...


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.