Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
ВнизРаспределение квадратов по ширине Найти похожие ветки
← →
Алексей О. (2007-08-10 07:58) [0]Здравствуйте! Мне нужно распределить по горизонтали квадраты так, что бы они все влезали в указанную ширину (возможно, накладываясь друг на друга). Я делаю это простейшим алгоритмом:
// центр первого квадрата относительно ширины
// указанную ширину разделить на кол-во квадратов
центрКвадрата:=Округлить( указанная_ширина / 2*кол-во_квадратов )
цикл по квадратам
// --координата по горизонтали относительно нулевой точки указ.ширины--
// центр первого квадрата
// помноженный на его индекс
// минус половина ширины квадрата
квадрат[i].Left:=Округлить( (центрКвадрата*i) - (ширинаКвадрата/2) )
Все отлично, алгоритм работает но есть небольшая проблема. При большом количестве квадратов крайние начинают вылазить за границы указанной ширины (например, Left принимает отрицательные значения) хотя центры остаются внутри. Помогите, пожалуйста, изменить алгоритм так, что бы квадраты не вылезали за границы указанной ширины и при этом относительно равномерно (по центрам квадратов) распределялись внутри ширины (просто уменьшать ширину нельзя).
← →
$FF00FF (2007-08-10 08:13) [1]Почему бы не написать код?
Или содрал где - то алгоритм и незнаешь, как его перевести ?
← →
homm © (2007-08-10 08:20) [2]Подойдет?
procedure TForm1.FormResize(Sender: TObject);
var
i: Integer;
center: Integer;
L, R: Integer;
begin
L := Controls[0].Width div 2;
R := Controls[ControlCount-1].Width div 2;
center := (ClientWidth-L-R) div (ControlCount-1);
for i := 0 to ControlCount-1 do begin
Controls[i].Left := L+(i*center)-(Controls[i].Width div 2);
end;
end;
← →
MBo © (2007-08-10 08:28) [3]dist := (Width - ШиринаКвадрата) div (N - 1);
for i := 0 to N - 1 do
ЦентрКвадрата := ПолуширинаКвадрата + i * dist
← →
homm © (2007-08-10 08:41) [4]> [3] MBo © (10.08.07 08:28)
Они разной ширины, похоже
← →
Алексей О. (2007-08-10 08:53) [5]
> homm © (10.08.07 08:20) [2]
Тут у меня квадраты распределяются относительно левого края. Хотелось бы что бы они распределялись по центру (т.е. если один квадрат то он ровно в центре, два - на равных расстояниях от центра и т.д.). И опять же, если много квадратов, то они вылазят за правую границу.
> MBo © (10.08.07 08:28) [3]
Здесь как-то непонятно, первый квадрат всегда получается на большом расстоянии от края и снова при большом кол-ве квадратов могут вылезти за правую границу...
← →
MBo © (2007-08-10 09:18) [6]
procedure TForm1.Button9Click(Sender: TObject);
var
i, a, a2, Wdt, N, dist, cx :Integer;
begin
Wdt := Image1.Width;
a := 30;
a2 := a div 2;
N := 7;
dist := (Wdt - 1 - a) div (N - 1);
for i := 0 to N - 1 do begin
cx := a2 + i * dist;
Image1.Canvas.Rectangle(cx - a2, 1, cx + a2 + 1, 20);
end;
end;
← →
Алексей О. (2007-08-10 09:37) [7]
> MBo © (10.08.07 09:18) [6]
Это работает... Попробуйте установить N скажем в 70. Квадраты не будут доезжать до правого края приличное расстояние :) Впрочем, я сам с этим попробую разобраться. Спасибо!
← →
MBo © (2007-08-10 10:03) [8]for i := 0 to N - 1 do begin
cx := a2 + Round(i * (Wdt - 1 - a)/(N - 1));
← →
tmp (2007-08-10 12:11) [9]Здесь, наверное при большом количестве этих самых квадратов, происходит ошибка округления, поэтому крайние квадраты могут или вылазить за границу, или не доходить до неё. В этом случае, думаю, лучше будет суммировать ширину всех квадратов и расстояние между ними, которое после расчёта может быть и отрицательным, но крайние расстояния оставить константой. Короче - отказаться от функции округления.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c