Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Выделить нужный квадрат.


Автор: assFalt 2.6.2012, 20:40
Добрый день.

Суть программы такая: есть торговая площадь. Загружается карта этажа, на ней отмечается где площадь свободна, где занята, где лишние куски, где проходы и т.д.
Не могу реализовать следующее: Ввожу в один из Edit площадь (Н: 50 кв.м), надо чтобы на карте все "свободные" места, в которые эта площадь влезает как-то выделились (например приобрели другой цвет или рамочку вокруг).
Пример:
Мне нужно поселить арендатора, которому нужна площадь 100 кв. м.
Каждый квадрат на карте означает 75 кв.м., то есть, надо чтобы как-то выделились 2 квадрата с желтым цветом (причем эти квадраты должны стоять рядом друг с другом).
Пыталась сделать что-то такое:

Код

procedure TForm1.Button6Click(Sender: TObject);
var pl,sr,xx,yy:integer;
begin
xx:=(z div 2); //z - сторона клетки
yy:=(z div 2);
sr:=(z div 2);
pl:=strtoint(Edit10.Text); //"вносимая" площадь
if x<form1.Image1.Height then
  begin
  If y<Form1.Image1.Width then
    begin
 if pl<z then begin
for i:=0 to h do
 for j:=0  to w do
 begin
 Image1.Canvas.Pixels[xx,yy];
    if sta=1 then begin
              Form1.Image1.Canvas.Brush.Color:= clAqua;
              Image1.Canvas.Rectangle(xx-sr,yy-sr,xx+sr,yy+sr);
                   END

  else if (pl>z) and (pl<2*z) then begin
                                  Form1.Image1.Canvas.Pixels[xx,yy];
                                  if sta=1 then begin
                                  Form1.Image1.Canvas.Pixels[xx,yy-z];
                                    if sta=1 then begin
                                  Form1.Image1.Canvas.Brush.Color:= clAqua;
                                  Image1.Canvas.Rectangle(xx-sr,yy-3*sr,xx+sr,yy+sr);
                                                  end else
                                  Form1.Image1.Canvas.Pixels[xx-z,yy];
                                    if sta=1 then begin
                                  Form1.Image1.Canvas.Brush.Color:= clAqua;
                                  Image1.Canvas.Rectangle(xx-3*sr,yy-sr,xx+sr,yy+sr);
                                                  end else
                                  Form1.Image1.Canvas.Pixels[xx,yy+z];
                                    if sta=1 then begin
                                  Form1.Image1.Canvas.Brush.Color:= clAqua;
                                  Image1.Canvas.Rectangle(xx-sr,yy-sr,xx+sr,yy+3*sr);
                                                  end else
                                  Form1.Image1.Canvas.Pixels[xx+z,yy];
                                    if sta=1 then begin
                                  Form1.Image1.Canvas.Brush.Color:= clAqua;
                                  Image1.Canvas.Rectangle(xx-sr,yy-sr,xx+3*sr,yy+sr);
                                                  end; end;end; end;
    end;  y:=y+z;
   end;   x:=x+z;
end;   end;

end.


Эта процедура не работает и она плохая, ведь квадратов, которые надо выделить, может быть и 1, и 2, и 22.

user posted image

P.S. Вот такой зубастый курсач.

Автор: DarkProg 3.6.2012, 00:10
времечно позднее и меня если честно вырубает, так что искать у себя вменяемый код не буду... попробую указать направление куда двигаться.
Главное направление - это графы.
А если точнее, то это обходы графов в ширину, если я ничё не путаю.

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

Или можно пойти от обратного - выделить всю свободную площадь и с какого-то одного края(с того с которого религия не запрещает) её начать заполнять по принципу как помещается(это кажется "задача на раскраску" называется) или скажем по принципу улитки(мне щас кажется что так будет наиболее эффективно).



P.S. И ещё совет, в коде где много переменных типа Form1, button1 и прочее непонятное никто разбираться не будет - это слишком долго и сложно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)