我在图像上以编程方式进行了矩形选择。向用户提供了设置矩形大小的选项,这样做可以增加矩形大小,但应保持旧矩形的中心点,以便矩形内的内容并非没有焦点。
这是正确的方法
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)))
新矩形可以大于或小于旧矩形。
答案 0 :(得分:1)
计算正确;只需使用一个integer division就可以简化:
(并翻译为C#
,因为源代码为VB.Net
)
可以使用整数除法(MSDN Docs),因为我们要除以2,就像四舍五入一样。但是在绘制时,您应该使用浮点值(float
),尤其是移动的对象(其值用度数表示,当然也用弧度表示):如果不这样,您的位置将偏离很多。 / p>
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)