Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 03.12.2009, 21:55   #1
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
Лампочка Такой скучный и квадратный(прямоугольный) делфи

Хочу облако тегов на дельфи ! (то что можно найти в сети для дельфи, уж никак не Облако Тегов !)
Хочу поворот(ротация) картинки под углами !
Хочу Парад планет !
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума
Старый 04.12.2009, 01:14   #2
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Сообщение от HellMercenariess Посмотреть сообщение
Хочу облако тегов на дельфи ! (то что можно найти в сети для дельфи, уж никак не Облако Тегов !)
Хочу поворот(ротация) картинки под углами !
Хочу Парад планет !
Хотеть не вредно...
з.ы. а к чему вобще эта тема?
Будь проще и люди к тебе потянутся
spamer вне форума
Старый 04.12.2009, 01:36   #3
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Та вот сижу облако тегов пытаюсь реализовать... с нуля.
И так еще интересуюсь неужели нету лучшего способа повернуть картинку чам здесь - http://www.programmersforum.ru/showthread.php?t=1045 ?
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума
Старый 04.12.2009, 02:28   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Попробуйте вот эти:
Цитата:
Поворот изображения на N градусов

Поворот проще всего осуществляется в полярных кординатах, а у нас доступны только Декартовы. Перевод осуществляется по формулам:
x=LCos(@) L=Sqrt(x**2+y**2)
y=LSin(@) @=arctg(y/x)

Для поворота достаточно добавить к a угол, на который осуществляется поворот. И новые координаты будут выглядеть так:
x'=LCos(@+t)
y'=LSin(@+t)

В принципе это все. Давайте теперь напишем функцию, которая будет переводить координаты из старых в новые.

procedure NewCoord(Var X, Y : Integer; Alpha : Double);
Var
A, L: Double;
Begin
// Вычисляем размер плеча
L:= Sqrt(X*X+Y*Y);
// Вычисляем угол поворота, но если X = 0, то на него делить нельзя, поэтому запишем угол равный PI/2
IF X = 0 THEN
IF Y < 0 THEN
A:= -PI/2
ELSE
A:= PI/2
ELSE
A:= ArcTan(Y/X);
// Скорректируем значение угла (если X < 0, то угол должен лежать в диапазоне от PI/2 до 3PI/2)
IF X < 0 THEN
A:= A+PI;
// Вычисляем новые координаты
X:= Round(L*(Cos(A+Alpha)));
Y:= Round(L*(Sin(A+Alpha)));
End;

Единственный тонкий момент - это вычисление угла. Функция ArcTan возвращает значение в диапазоне -PI/2 до PI/2. Мы должны сами корректировать это значение в зависимости от аргументов.

Теперь, когда есть функция, напишем саму процедуру поворота.
Нам понадобятся 2 объекта TImage, поле для ввода угла поворота и кнопочка, по которой будет осуществляться поворот.
Загрузим в первый объект TImage картинку в формате bmp. А в обработчике события кнопки будем писать саму процедуру.

Var
N : Double;
I, J: Integer;
XMax, YMax: Integer;
Max : Integer;
X, Y: Integer;
Xm, Ym, Xx, Yx: Integer;
L, A: Double;
begin
//Для начала преобразуем наш угол поворота в радианы
N:= -StrToFloat(Edit1.Text)*PI/180;
//Причем угол имеет обратное значение *
// Узнаем максимальные размеры изображения
XMax:= Image1.Width-1;
YMax:= Image1.Height-1;
// Получим координаты середины изображения (именно вокруг него мы и будем вращать)
X2:= XMax DIV 2;
Y2:= YMax DIV 2;
//Размеры будущего изображения
Xm:= 0; Xx:= 0; Ym:= 0; Yx:= 0;
//Определяем размер получаемого изображения
//левый верхний угол
X:= -X2; Y:= -Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//правый верхний угол
X:= X2; Y:= -Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//правый нижний угол
X:= X2; Y:= Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//левый нижний угол
X:= -X2; Y:= Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//Теперь мы знаем размеры изображения, которое получится
Image2.Width:= Xx-Xm;
Image2.Height:= Yx-Ym;
//Идем по координатам полученной картинки и вычисляем для них координаты исходного изображения
FOR I:= Xm TO Xx DO
FOR J:= Ym TO Yx DO
Begin
//Получаем координаты точки изображения относительно его центра
X:= I-X2;
Y:= J-Y2;
//Преобразовываем
NewCoord(X, Y, N);
//Переходим к абсолютным координатам
X:= X+X2; Y:= Y+Y2;
//Если координаты точки не попадают в исходное изображение, то рисуем простую белую точку
IF (X > Image1.Width-1) OR (Y > Image1.Height-1) OR (X < 0) OR (Y < 0) THEN
Image2.Canvas.Pixels[I-Xm, J-Ym]:= clWhite
ELSE // иначе переносим точку с изображения оригинала
Image2.Canvas.Pixels[I-Xm, J-Ym]:= Image1.Canvas.Pixels[X, Y];
End;
//Все поворот завершен
End;

* Нам необходимо, чтобы каждая точка нового изображения соответствовала точкe из старого изображения. Поэтому мы, грубо говоря, осуществляем поворот нового изображения на угол -N. Получая соответствующую координату/ мы получим точку исходного изображения.

**********************************

procedure TForm1.Button1Click(Sender: TObject);
var M:TXFORM;
a:Double;
HDC:THandle;
B: TBitMap;
begin
B := TBitMap.Create;
//B.LoadFromFile('logo.bmp');
B.Assign(Image1.Picture.Bitmap);
hDc := image1.Canvas.Handle;
SetGraphicsMode(hDc, GM_ADVANCED);

M.eM11 := 1;
M.eM12 := 0;
M.eM21 := 0;
M.eM22 := 1;
M.eDx := -B.Width div 2;
M.eDy := -B.Height div 2;
SetWorldTransform(hDc, M);

a := PI/6;
fillChar(M, sizeOf(M), 0);
M.eM11 := Cos(a);
M.eM12 := Sin(a);
M.eM21 := -Sin(a);
M.eM22 := Cos(a);
M.eDx := 0;
M.eDy := 0;
ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);

M.eM11 := 1;
M.eM12 := 0;
M.eM21 := 0;
M.eM22 := 1;
M.eDx := B.Width div 2;
M.eDy := B.Height div 2;
ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);

image1.Canvas.Draw(0, 0, b);
// или BitBlt(hDc, 0, 0, image1.Width, image1.Height, B.Canvas.Handle, 0, 0, SRCCOPY);
B.Free;
end;
Это есть в DFaq...
mihali4 вне форума
Старый 04.12.2009, 03:35   #5
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

mihali4, спс большое, работает !
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума
Старый 04.12.2009, 10:31   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Хм... Облако тегов... Можно например так попробовать: создать трехмерную матрицу 100*100, в ячейке матрицы может находиться текст. Чем дальше (по Z) текст (ячейка) находится от пользователя - тем мельче его следует выводить. Работать проще с канвой от Imag`и. по ОnMouseMove смотреть позицию курсора и те ячейки, которые примерно находятся под курсором (~-10=>10) перетаскивать вперед (разумеется с использованием таймера) и соответственно выводить более крупно. Но тут один момент - вперед их нужно перетаскивать по кругу. Обработка клика по OnMuseDown - смотрим координаты курсора, переводим в координаты матрицы и смотрим, в кого мы попали.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума
Старый 04.12.2009, 10:36   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что такое Облако Тегов?
I'm learning to live...
Stilet вне форума
Старый 04.12.2009, 11:11   #8
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

http://redcode.sk6.ru/
Слева внизу.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума
Старый 04.12.2009, 11:36   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Хорош флудить...
mihali4 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить можно ли вписать в прямоугольный треугольник QuadroX Помощь студентам 5 25.09.2009 13:58
квадратный корень в с++ ben95 Общие вопросы C/C++ 9 09.02.2009 15:42
Корень квадратный помогите написать Woha Общие вопросы C/C++ 5 27.10.2008 06:18
Корень квадратный BETONOMESHALKA Общие вопросы Delphi 2 01.11.2007 10:06
Квадратный диск Fainder Компьютерное железо 10 18.06.2007 19:32