Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1178193423
Shura
2007-05-03 15:57
2007.09.02
Порядок сохранения записей в ClientDataSet


6-1168754919
DRtM
2007-01-14 09:08
2007.09.02
Проблемма с закачкой


2-1186558517
Евгений Р.
2007-08-08 11:35
2007.09.02
upper для русских букв FB 1.5.3


3-1178790763
Godness
2007-05-10 13:52
2007.09.02
A query with LOB s requires OCI8 mode, but OCI7 mode is used


2-1186646635
Axon
2007-08-09 12:03
2007.09.02
Поменять курсор





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский