Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];
ВнизУменьшенная копия региона Найти похожие ветки
← →
Дмитрий_05 (2005-09-11 17:28) [0]У меня есть регион, как бы мне сделать уменьшенную его копию? Например на 20 пикселей меньше по ширине и высоте... Разбирался с ExtCreateRegion и XForm, что-то ничего не понял... Может ктонибудь подскажет?
← →
Дмитрий_05 (2005-09-11 20:42) [1]???
← →
Дмитрий_05 (2005-09-12 18:21) [2]У меня регион произвольной формы, т.е. ето не эллипс, не круг и т.д. Есть ли функция которая берет этот регион и немного уменьшает?
← →
Джо © (2005-09-12 18:40) [3]Так ты все еще не разобрался с 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, там в табличном виде все хорошо расписано.
← →
Джо © (2005-09-12 18:44) [4]
> Разбирался с ExtCreateRegion и XForm, что-то ничего не понял...
А что именно не понял, если не секрет?
← →
Дмитрий_05 (2005-09-12 19:05) [5]на английском все... а в английском я не очень силен... а можно сделать регион не "в" 0.5, а "на" 20 меньше?
← →
Джо © (2005-09-12 19:16) [6]
> [5] Дмитрий_05 (12.09.05 19:05)
> а можно сделать регион не "в" 0.5, а "на" 20 меньше?
Смотря что иметь под этим в виду.
> на английском все... а в английском я не очень силен...
Эта, учи, брат. Думаю, что слова scaling, rotation, offset выучить не сложно. А вообще-то, по сабжу, тут все сводится к афинным преобразованиям. Посмотри курс геометрии.
← →
Дмитрий_05 (2005-09-12 19:22) [7]размер )))
← →
Дмитрий_05 (2005-09-12 19:22) [8]высоту и ширину на 20 уменьшить )))
← →
Джо © (2005-09-12 19:24) [9]Тут тогда нужно определиться, что имееть в виду под "шириной и высотой" произвольного региона. Ширина и высота она, как-никак у прямоуголников только бывает.
← →
Джо © (2005-09-12 19:27) [10]Если иметь в виду ширину и высоту описывающего прямоугольника, то начинай "плясать" от функции GetRgnBox.
← →
Дмитрий_05 (2005-09-12 23:37) [11]Что-то не получается "плясать" ))) Функцией GetRgnBox мы узнаем прямоугольник описывающий регион, грубо говоря высоту и ширину... Я их и так знал... А как уменьшить высоту и ширину? Какойнибудь SetRgnBox функции я ненашел...
← →
Джо © (2005-09-13 01:20) [12]
> [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-13 05:46) [13]Джо спасибо! ))) Я хотел так сделать, но почему-то думал что есть другой способ...)))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c