Расчет правильный;его можно упростить, используя только одно целочисленное деление :
(и переведенное в 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](https://i.stack.imgur.com/D0Iip.png)