确定矩形的中心点并将新矩形移动到中心

时间:2018-12-22 13:57:34

标签: c# .net winforms system.drawing

我在图像上以编程方式进行了矩形选择。向用户提供了设置矩形大小的选项,这样做可以增加矩形大小,但应保持旧矩形的中心点,以便矩形内的内容并非没有焦点。

这是正确的方法

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 :(得分: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) 方法。
假设您知道参考矩形的LocationSize,然后让用户指定所选内容的新大小:

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

ResizedRect有一个Size(由用户定义),但目前尚不知道其Location
可以使用以下公式计算新选择的矩形(ResizedRectLocation

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