Суббота, 16.12.2017, 21:31
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Delphi » Задачи по программированию на Delphi » Помогите с математикой (я уже все мозги сломал)
Помогите с математикой
BLACK_CRAFTER666Дата: Суббота, 05.10.2013, 15:46 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 31
Репутация: 0
Статус: Offline
Имеются две канвы и одна фотка. На канве2 рисуется фотка оригинального размера, а на канве1 - отмасштабированная с сохранением пропорций и отцентрованная внутри канвы.
Нужно тыкнуть на точку x,y (или по движению мыши) канвы1 и пропорционально найти эту же точку на канве2.
По-идее, нужна только формула пропорции и нужно правильно ее применить. Несколько дней мозг ломаю - уже задолбался smile


Сообщение отредактировал BLACK_CRAFTER666 - Суббота, 05.10.2013, 16:15
 
xaramamburuДата: Воскресенье, 06.10.2013, 00:06 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Я бы попробовал так:

var x01,y01:integer; //координаты центра первой канвы
x02,y02::integer; //координаты центра второй канвы
xt1,y1t:integer; //координаты искомой точки на первой канве относительно центра канвы
xt2,yt2:integer; //координаты этой же точки на второй канве относительно центра канвы
kx,ky:real;// коэффициенты пропорциональности (масштаб по осям)

begin
------------------------------
------------------------------
//находим центр канвы для первого рисунка
x01:=(image1.Width) div 2;
y01:=(image1.Height) div 2;

//для второго рисунка
x02:=(image2.Width) div 2;
y02:=(image2.Height) div 2;

//вычисляем координаты точки на которую кликнули мышкой относительно центра рисунка для первой канвы
//x,y координаты относительно левого верхнего угла канвы
xt1:=x-x01;
y1t:=y-y01;

//вычисляем коэффициент пропорциональности по осям
kx:=image2.Width/image1.Width;
ky:=image2.Height/image1.Height;

//вычисляем координаты этой же точки на второй канве (на оригинале) с учетом коэффициента пропорциональности.
xt2:=trunc((xt1*kx)) + x02;
yt2:=trunc((yt1*ky)) + y02;

--------------------------------
--------------------------------
end;
smile


Да, сразу  не доперло, можно не вычислять координаты центра канвы совсем, а координаты точки на второй канве получать простым умножением

xt2:=trunc(x*kx);
yt2:=trunc(y*ky);

координат первой канвы на коэффициенты пропорциональности по осям. smile


Сообщение отредактировал xaramamburu - Воскресенье, 06.10.2013, 12:11
 
BLACK_CRAFTER666Дата: Воскресенье, 06.10.2013, 16:37 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 31
Репутация: 0
Статус: Offline
Спасибо. Позже попробую и отпишусь.
Это работает, если координаты второй картинки равны 0,0. Т.е, если отмасшабированная фотка не отцентрована. Пробовал исправить, но точка вообще куда-то уходит.

Добавлено (06.10.2013, 16:37)
---------------------------------------------

Цитата (xaramamburu)

//находим центр канвы для первого рисунка
x01:=(image1.Width) div 2;
y01:=(image1.Height) div 2;

Только не размеры Image, а размеры самого изображения. Иначе, он всю канву за фотку принимает smile


Сообщение отредактировал BLACK_CRAFTER666 - Воскресенье, 06.10.2013, 16:33
 
xaramamburuДата: Воскресенье, 06.10.2013, 17:37 | Сообщение # 4
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline

Цитата
Это работает, если координаты второй картинки равны 0,0.

Нет, эти операции сопоставляют точки на одной  канве с точками на  другой. Т.е. изображение на одной канве должно быть трансформировано, пропорционально размерам самой канвы, а иначе понятно, что если вы выводите просто от масштабированное изображение,  будет  полный бред. В этом случае надо коэффициенты пропорциональности считать не по размерам канвы, а по размерам изображения.)))


Цитата
Только не размеры Image, а размеры самого изображения. Иначе, он всю канву за фотку принимает 

Так быть и должно, ведь  фотка та лежит на канве, а размеры канвы определяются размерами Image. В случае если фотка отцентрирована правильно, то будет все ОК в обоих случаях, а если не отцентрирована, то будет бред. А что бы всю канву за фотку не принимал, проверяйте условия по границам  фотки и если курсор лежит внутри области фотки то делаем,  что нам нужно, иначе игнорируем.)))
 
BLACK_CRAFTER666Дата: Понедельник, 07.10.2013, 07:46 | Сообщение # 5
Сержант
Группа: Пользователи
Сообщений: 31
Репутация: 0
Статус: Offline
Цитата (xaramamburu)
Так быть и должно, ведь фотка та лежит на канве, а размеры канвы определяются размерами Image

Я знаю. Но если делать так:

Цитата (xaramamburu)
//находим центр канвы для первого рисунка
x01:=(image1.Width) div 2;
y01:=(image1.Height) div 2;

То мы находим центр всей канвы, а мне надо искать центр только фотки. По-этому, если я правильно понял, мне надо заменить Image1.width,Image.Height на (imagerect.right - imagerect.left), (imagerect.buttom - imagerect.top) и отнять коэффициент смещения?
Я сделал так:

Код
xt2:=trunc((x - ImageRect.Left)*kx);
yt2:=trunc((y - ImageRect.Top)*ky);

где ImageRect - прямоугольник, в котором я рисую битмап. Так точки вроде совпадают, но я не уверен, что это правильно.
p.s. Я компоненты не использую. Мне с ними не в кайф smile Вместо TImage у меня винапишный аналог TPanel. Он у меня является канвой, на которой я масштабирую и рисую фотку. Примерно так:

Код
img := CreateWindow(pchar('Static'),'',WS_CHILD or WS_VISIBLE or SS_BITMAP or SS_NOTIFY,
                             0,0,0,0,wnd,0, hInstance, nil);
         dc1 := GetDC(img);
         canv := TCanvas.Create;
         canv.Handle := dc1;

Потом можно рисовать:

Код
canv.StretchDraw(ImageRect,bmp);

Это я к тому, что в вашем коде учитывается размер всей канвы, а надо только размер картинки. P.S. Хотя... Только сейчас дошло, что вы имели ввиду smile Всё правильно smile Еще раз спасибо.


Сообщение отредактировал BLACK_CRAFTER666 - Понедельник, 07.10.2013, 08:06
 
xaramamburuДата: Понедельник, 07.10.2013, 17:14 | Сообщение # 6
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Цитата
Это я к тому, что в вашем коде учитывается размер всей канвы, а надо только размер картинки.

Это все нюансы. Просто изначально вы писали, что фотка отцентрирована, а это значит, что центр фотки и канвы должен совпадать.

Цитата
Так точки вроде совпадают, но я не уверен, что это правильно.

Если бы было неправильно, то и точки бы не совпадали.)))
 
BLACK_CRAFTER666Дата: Понедельник, 07.10.2013, 17:31 | Сообщение # 7
Сержант
Группа: Пользователи
Сообщений: 31
Репутация: 0
Статус: Offline
Цитата (xaramamburu)
Просто изначально вы писали, что фотка отцентрирована, а это значит, что центр фотки и канвы должен совпадать.

Я имел ввиду, что отцентрована только масштабируемая фотка))
 
xaramamburuДата: Понедельник, 07.10.2013, 17:50 | Сообщение # 8
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Тогда все понятно. smile
 
Форум » Delphi » Задачи по программированию на Delphi » Помогите с математикой (я уже все мозги сломал)
Страница 1 из 11
Поиск:


Copyright MyCorp © 2017Конструктор сайтов - uCoz