Определить центральную точку прямоугольника и переместить новый прямоугольник в центр - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть прямоугольное выделение, сделанное программно на изображении. Пользователю предоставляется возможность установить размер прямоугольника, при этом размер прямоугольника должен увеличиться, но следует сохранить центральную точку старого прямоугольника, чтобысодержимое прямоугольника не в фокусе.

Правильный ли это подход

objSmall.X = CInt(objBig.X + (Math.Round(((objBig.Width / 2) - (objSmall.Width / 2)), 0)))
objSmall.Y = CInt(objBig.Y + (Math.Round(((objBig.Height / 2) - (objSmall.Height / 2)), 0)))

Новый прямоугольник может быть больше или меньше старого.

1 Ответ

0 голосов
/ 22 декабря 2018

Расчет правильный;его можно упростить, используя только одно целочисленное деление :
(и переведенное в C#, потому что исходный код VB.Net)

деление между числами ( MSDNДокументы ) можно использовать, потому что мы делим на 2, это как округление вниз.Но вы должны использовать значения с плавающей точкой (float) при рисовании, особенно движущихся объектов (со значениями, выраженными как в градусах, так и, конечно, в радианах): ваши позиции будут совсем немного отличаться, если вы этого не сделаете.

objSmall.X = objBig.X + (objBig.Width - objSmall.Width) / 2;
objSmall.Y = objBig.Y + (objBig.Height - objSmall.Height) / 2;

Или (2):

objSmall.Location = new Point(objBig.X + (objBig.Width - objSmall.Width) / 2,
                              objBig.Y + (objBig.Height - objSmall.Height) / 2);

Или, используя относительные координаты центра более крупного объекта:

Point BigRectCenter = new Point((objBig.Width / 2) + objBig.X, (objBig.Height / 2) + objBig.Y);

objSmall.Location = new Point(BigRectCenter.X - (objSmall.Width / 2),
                              BigRectCenter.Y - (objSmall.Height / 2));

(2) метод также может быть использован, когда вы не знаете, какой из прямоугольников самый большой.
Предположим, что вы знаете свои ссылочные прямоугольники Location и Size, и вы позволяете пользователю указатьновый Размер выделения:

Rectangle OriginalRect = new Rectangle(30, 30, 120, 90);
Rectangle ResizedRect = new Rectangle(0, 0, 140, 140);

У ResizedRect есть Size (определяется пользователем), но его Location неизвестно.
Новый прямоугольник выбора (ResizedRect) Location можно рассчитать с помощью:

ResizedRect.Location = new Point(OriginalRect.X + (OriginalRect.Width - ResizedRect.Width) / 2,
                                 OriginalRect.Y + (OriginalRect.Height - ResizedRect.Height) / 2);

Original Selection (Green)                    Original Selection (Green)
    (20, 20, 120, 120)                           (30, 30, 120,  90)
 Resized Selection (Red)                       Resized Selection (Red) 
    ( 0,  0,  95,  86)                           ( 0,  0, 140, 140)

  Calculated Selection                          Calculated Selection
       Rectangle                                      Rectangle
    (32, 37,  95,  86)                           (20, 5, 140, 140)

Rectangle Selection

...