Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1126614572
Shamansky
2005-09-13 16:29
2005.10.02
Экспорт в Excel


1-1126158174
Monk
2005-09-08 09:42
2005.10.02
Событие нажатия кнопки мыши на строке скроллинга компонентов


1-1126201432
dRake
2005-09-08 21:43
2005.10.02
Как починить дебаггер?


1-1126271263
Yuri Btr
2005-09-09 17:07
2005.10.02
Установка иконки программы


1-1126614631
Tor
2005-09-13 16:30
2005.10.02
Пауза без остановки процесса типа Sleep





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский