Помощь - Поиск - Пользователи - Календарь
Полная версия: Калейдоскоп! Помогите чем можете...
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Valkirie
Началась графика и я решила, что наверное лучше было вешаться сразу, но теперь уже отступать некуда... unsure.gif

Вообщем задание у меня такое:

Калейдоскоп. PaintBox делится на 4 части. В одной из них выбирается случайно прямоугольник и закрашивается в случайно выбранный цвет. В остальных частях рисуются прямоугольники того же размера цвета, расположенные симметрично. Для восстановления запоминать 20 предыдущих прямоугольников.

И всё бы хорошо... вот только в моём понятие калейдоскоп это такая штучка наполненная осколками цветного стекла... и я смутно представляю как это будет выглядеть с помощью прямоугольников... huh.gif
Вообщем PaintBox я на 4 части разделила, и прямоугольнички сгенирировала...
А дальше... unsure.gif

Я не совсем понимаю:
1. Прямоугольники должна быть случайными по размеру или одинаковыми ?
2. Могут ли они пересекаться ? Если нет, то каково условие для того, чтобы они не пересекались ?
3. Как сгенирировать 3 симметричных прямоугольника в остальных частях ?
4. И ещё момент "Для восстановления запоминать 20 предыдущих прямоугольников" - это как ?


Help me please... :p2:
volvo
Значит, по-порядку: ;)
Цитата(Valkirie @ 11.04.05 14:45)
1. Прямоугольники должна быть случайными по размеру или одинаковыми ?
Скорее всего - разными (случайного) размера.
Цитата(Valkirie @ 11.04.05 14:45)
2. Могут ли они пересекаться ? Если нет, то каково условие для того, чтобы они не пересекались ?
А у тебя это не оговорено, почему бы не сделать их с пересечениями? И на калейдоскоп больше походить будет...
Цитата(Valkirie @ 11.04.05 14:45)
3. Как сгенирировать 3 симметричных прямоугольника в остальных частях ?
А вот это как раз напрямую зависит от того, КАК ты разбила PaintBox на 4 части... Я бы сделал так: Разбиваешь PaintBox на 4 прямоугольника, или квадрата (так, что линии разделения пересекаются точно в центре), и привязываешь к точке пересечения этих самых линий начало локальной системы координат. Теперь если ты сгенерировала один прямоугольник с положительными координатами (в математике это называется 1-я четверть), то для получения 3-х остальных тебе достаточно изменить знак или одной или обоих координат (в локальной системе, естественно), преобразовать координаты всех 4-х прямоугольников в систему глобальную и отрисовать их...
Цитата(Valkirie @ 11.04.05 14:45)
4. И ещё момент "Для восстановления запоминать 20 предыдущих прямоугольников" - это как ?
blink.gif Честно говоря - непонятно, о каком восстановлении речь
Valkirie
Ню...вообщем у меня получается такая штучка, разноцветные произвольные прямоугольники "носятся" как сумасшедшие в одной части PaintBox`a - до такой степени, что в конце концов получается какая-то каша sad.gif

PaintBox - разделён ровненько по центру, так как говорил ты... вот только как привязать начало координат к центру ? И как их проектировать дальше... Я не сильна в математике... :p2:
volvo
Цитата(Valkirie @ 11.04.05 16:32)
PaintBox - разделён ровненько по центру, так как говорил ты... вот только как привязать начало координат к центру ? И как их проектировать дальше...

Приведи здесь кусок программы, как ты делишь PaintBox и генерируешь (и рисуешь) прямоугольники, я попробую попрыгать с бубном :D
Valkirie
Вот то, что я имею на данный момент...

Код

const N=20;
type TRect=record
x,y,x1,x2,y1,y2:integer;
Color:TColor;
end;

var Mas:array[1..N] of TRect;

procedure DrawRect(Rec:TRect);
begin
Form1.PaintBox1.Canvas.Pen.color:=Rec.Color;
Form1.PaintBox1.Canvas.Brush.Color:=Rec.Color;
Form1.PaintBox1.Canvas.Rectangle(Rec.x1,Rec.x2,Rec.y1,Rec.y2);
end;

procedure HideRect (Rec:TRect);
begin
Form1.PaintBox1.Canvas.Pen.Color:=Form1.PaintBox1.Color;
Form1.PaintBox1.Canvas.Brush.Color:=Form1.PaintBox1.Color;
Form1.PaintBox1.Canvas.Rectangle(Rec.x1,Rec.x2,Rec.y1,Rec.y2);
end;

function GenerateRect(N:integer):TRect;
var
Rec:TRect;
begin
Rec.x1:=Random(200)+1;
Rec.x2:=Random(200)+1;
Rec.y1:=Random(200)+1;
Rec.y2:=Random(200)+1;
Rec.x:=Random(Form1.PaintBox1.Width div 2)-1;
Rec.y:=Random(Form1.PaintBox1.Height div 2)-1;
Rec.Color:=RGB(Random(256),Random(256),Random(256));
Result:=Rec
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var i,x,y,w,h:integer;
begin
w:=PaintBox1.Width;
h:=PaintBox1.Height;
x:=w div 2;
y:=h div 2;
PaintBox1.Canvas.Rectangle(0,0,w,h);
PaintBox1.Canvas.MoveTo(x,0);
PaintBox1.Canvas.LineTo(y,h);
PaintBox1.Canvas.MoveTo(0,y);
PaintBox1.Canvas.LineTo(w,x);
for i:=1 to N do
DrawRect(Mas[i]);
HideRect(Mas[i]);
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=1 to N do
Mas[i]:=GenerateRect(i);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var k:integer;
begin
k:=random(n)+1;
HideRect(Mas[k]);
Mas[k]:=GenerateRect(N);
DrawRect(Mas[k]);
end;
end.


Посмотри что тут к чему... :p2: И спасибо за отзывчивость smile.gif
volvo
Ну, в общем, я поменял кое-что, теперь оно рисует одинаковую картинку во всех 4-х частях PaintBox-а. Но я рисовал не по таймеру, а по нажатию кнопки. Если нужно - перенеси это в таймер, можешь поиграться со значениями при генерации прямоугольников.
Valkirie
Спасибо ;) Перенесла... всё крутится по таймеру ;)
Надеюсь - это то, что нужно...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.