![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уменьшенная копия региона [D7, WinXP]
Дмитрий_05 © (2005-09-11 17:28:00)У меня есть регион, как бы мне сделать уменьшенную его копию? Например на 20 пикселей меньше по ширине и высоте... Разбирался с ExtCreateRegion и XForm, что-то ничего не понял... Может ктонибудь подскажет?
Дмитрий_05 (2005-09-13 05:46:00) [1]Джо спасибо! ))) Я хотел так сделать, но почему-то думал что есть другой способ...)))
Джо (2005-09-13 01:20:00) [2]
> [11] Дмитрий_05 (12.09.05 23:37)
Как уменьшить регион вN раз, я написал в [3]. Вы, надеюсь, 3 класс школы закончили? ;) Ибо далее следуют сложнейшие математические выкладки, которые может понять только 4-классник:
X + M,
X - первоначальное значение,
M - число, накоторое увеличивается X
мы должны найти некое N, удовлетворяющее условию
X*N = X+M.
Несложно увидеть, что
N = (X+M)/X.
Нужно, например, отрезок в 100 пикселей увеличить на10 пикселей. Это будет то же самое, что отрезок в 100 пикселей увеличить в1.1 раза((100+10)/100). Следовательно, следует подставить этот коэффициент в соответствующие поля структуры XFORM, отвечающие за scaling.
Не может быть, чтобы это было настолько сложно для понимания.
Дмитрий_05 (2005-09-12 23:37:00) [3]Что-то не получается "плясать" ))) Функцией GetRgnBox мы узнаем прямоугольник описывающий регион, грубо говоря высоту и ширину... Я их и так знал... А как уменьшить высоту и ширину? Какойнибудь SetRgnBox функции я ненашел...
Джо (2005-09-12 19:27:00) [4]Если иметь в виду ширину и высоту описывающего прямоугольника, то начинай "плясать" от функции GetRgnBox.
Джо (2005-09-12 19:24:00) [5]Тут тогда нужно определиться, что имееть в виду под "шириной и высотой" произвольного региона. Ширина и высота она, как-никак у прямоуголников только бывает.
Дмитрий_05 (2005-09-12 19:22:00) [6]размер )))
Дмитрий_05 (2005-09-12 19:22:00) [7]высоту и ширину на 20 уменьшить )))
Джо (2005-09-12 19:16:00) [8]
> [5] Дмитрий_05 (12.09.05 19:05)
> а можно сделать регион не "в" 0.5, а "на" 20 меньше?
Смотря что иметь под этим в виду.
> на английском все... а в английском я не очень силен...
Эта, учи, брат. Думаю, что слова scaling, rotation, offset выучить не сложно. А вообще-то, по сабжу, тут все сводится к афинным преобразованиям. Посмотри курс геометрии.
Дмитрий_05 (2005-09-12 19:05:00) [9]на английском все... а в английском я не очень силен... а можно сделать регион не "в" 0.5, а "на" 20 меньше?
Джо (2005-09-12 18:44:00) [10]
> Разбирался с ExtCreateRegion и XForm, что-то ничего не понял...
А что именно не понял, если не секрет?
Джо (2005-09-12 18:40:00) [11]Так ты все еще не разобрался с XForm? В MSDN вроде все хорошо описано.
Ну, вот маленький пример, чтобы начать (проверку ошибок делай сам):
procedure TForm6.Button1Click(Sender: TObject);
var
Rgn1,Rgn2: HRGN;
Sz: Cardinal;
RgnData: PRgnData;
XForm: TXForm;
begin
Rgn1 := CreateEllipticRgn(0,0,100,150);
Image1.Canvas.Brush.Color := clBlue;
PaintRgn(Image1.Canvas.Handle,Rgn1);
// get data size for store region data
Sz := GetRegionData(Rgn1,0,nil);
GetMem(RgnData,Sz);
try
// get actual data
GetRegionData(Rgn1,Sz,RgnData);
// масштабируем
XForm.eM11 := 0.5;
XForm.eM22 := 0.5;
Rgn2 := ExtCreateRegion(@XForm,Sz,RgnData^);
// малюем получившийся регион
Image1.Canvas.Brush.Color := clRed;
PaintRgn(Image1.Canvas.Handle,Rgn2);
finally
FreeMem (RgnData);
end;
DeleteObject(Rgn1);
DeleteObject(Rgn2);
end;
Масштабируем первоначальный регион в 0.5 раз по горизонтали и 0.5 по вертикали (члены eM11, eM22 структуры XFORM отвечают за scaling). По остальным типам преобразования (вращение и т.п.) смотри описание структуры XFORM в MSDN, там в табличном виде все хорошо расписано.
Дмитрий_05 (2005-09-12 18:21:00) [12]У меня регион произвольной формы, т.е. ето не эллипс, не круг и т.д. Есть ли функция которая берет этот регион и немного уменьшает?
Дмитрий_05 (2005-09-11 20:42:00) [13]???