Помогите с математикой
|
|
BLACK_CRAFTER666 | Дата: Суббота, 05.10.2013, 15:46 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 31
Статус: Offline
| Имеются две канвы и одна фотка. На канве2 рисуется фотка оригинального размера, а на канве1 - отмасштабированная с сохранением пропорций и отцентрованная внутри канвы. Нужно тыкнуть на точку x,y (или по движению мыши) канвы1 и пропорционально найти эту же точку на канве2. По-идее, нужна только формула пропорции и нужно правильно ее применить. Несколько дней мозг ломаю - уже задолбался
Сообщение отредактировал BLACK_CRAFTER666 - Суббота, 05.10.2013, 16:15 |
|
| |
xaramamburu | Дата: Воскресенье, 06.10.2013, 00:06 | Сообщение # 2 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: 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;
Да, сразу не доперло, можно не вычислять координаты центра канвы совсем, а координаты точки на второй канве получать простым умножением
xt2:=trunc(x*kx); yt2:=trunc(y*ky);
координат первой канвы на коэффициенты пропорциональности по осям.
Сообщение отредактировал xaramamburu - Воскресенье, 06.10.2013, 12:11 |
|
| |
BLACK_CRAFTER666 | Дата: Воскресенье, 06.10.2013, 16:37 | Сообщение # 3 |
Сержант
Группа: Пользователи
Сообщений: 31
Статус: Offline
| Спасибо. Позже попробую и отпишусь. Это работает, если координаты второй картинки равны 0,0. Т.е, если отмасшабированная фотка не отцентрована. Пробовал исправить, но точка вообще куда-то уходит.Добавлено (06.10.2013, 16:37) ---------------------------------------------
Цитата (xaramamburu) //находим центр канвы для первого рисунка x01:=(image1.Width) div 2; y01:=(image1.Height) div 2; Только не размеры Image, а размеры самого изображения. Иначе, он всю канву за фотку принимает
Сообщение отредактировал BLACK_CRAFTER666 - Воскресенье, 06.10.2013, 16:33 |
|
| |
xaramamburu | Дата: Воскресенье, 06.10.2013, 17:37 | Сообщение # 4 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Цитата Это работает, если координаты второй картинки равны 0,0. Нет, эти операции сопоставляют точки на одной канве с точками на другой. Т.е. изображение на одной канве должно быть трансформировано, пропорционально размерам самой канвы, а иначе понятно, что если вы выводите просто от масштабированное изображение, будет полный бред. В этом случае надо коэффициенты пропорциональности считать не по размерам канвы, а по размерам изображения.)))
Цитата Только не размеры Image, а размеры самого изображения. Иначе, он всю канву за фотку принимает Так быть и должно, ведь фотка та лежит на канве, а размеры канвы определяются размерами Image. В случае если фотка отцентрирована правильно, то будет все ОК в обоих случаях, а если не отцентрирована, то будет бред. А что бы всю канву за фотку не принимал, проверяйте условия по границам фотки и если курсор лежит внутри области фотки то делаем, что нам нужно, иначе игнорируем.)))
|
|
| |
BLACK_CRAFTER666 | Дата: Понедельник, 07.10.2013, 07:46 | Сообщение # 5 |
Сержант
Группа: Пользователи
Сообщений: 31
Статус: 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. Я компоненты не использую. Мне с ними не в кайф Вместо 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. Хотя... Только сейчас дошло, что вы имели ввиду Всё правильно Еще раз спасибо.
Сообщение отредактировал BLACK_CRAFTER666 - Понедельник, 07.10.2013, 08:06 |
|
| |
xaramamburu | Дата: Понедельник, 07.10.2013, 17:14 | Сообщение # 6 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Цитата Это я к тому, что в вашем коде учитывается размер всей канвы, а надо только размер картинки. Это все нюансы. Просто изначально вы писали, что фотка отцентрирована, а это значит, что центр фотки и канвы должен совпадать.
Цитата Так точки вроде совпадают, но я не уверен, что это правильно. Если бы было неправильно, то и точки бы не совпадали.)))
|
|
| |
BLACK_CRAFTER666 | Дата: Понедельник, 07.10.2013, 17:31 | Сообщение # 7 |
Сержант
Группа: Пользователи
Сообщений: 31
Статус: Offline
| Цитата (xaramamburu) Просто изначально вы писали, что фотка отцентрирована, а это значит, что центр фотки и канвы должен совпадать. Я имел ввиду, что отцентрована только масштабируемая фотка))
|
|
| |
xaramamburu | Дата: Понедельник, 07.10.2013, 17:50 | Сообщение # 8 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Тогда все понятно.
|
|
| |
|