首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# Rectangle.IntersectsWith負數參數問題:矩形標準化修正方案

     編輯:程式設計綜合問答

問題背景

WinForm繪製選框矩形時,從右下向左上拖拽會產生Width/Height為負數的Rectangle,導致IntersectsWith判斷失效。

根本原因

Rectangle結構體允許負寬高,但IntersectsWith基於標準矩形(左上角為原點,寬高為正)計算交集。負數參數破壞了幾何假設。

標準化修正代碼

// 矩形標準化:確保Width、Height為正數
if (MouseRect.Width < 0) {
    MouseRect.X = MouseRect.X + MouseRect.Width; // 左邊界右移
    MouseRect.Width = -MouseRect.Width;          // 寬度取絕對值
}
if (MouseRect.Height < 0) {
    MouseRect.Y = MouseRect.Y + MouseRect.Height; // 上邊界下移
    MouseRect.Height = -MouseRect.Height;         // 高度取絕對值
}

// 正常交集判斷
foreach (Control ct in tab.Controls) {
    if (MouseRect.IntersectsWith(ct.Bounds)) {
        addListRect(ct);
    }
}

幾何原理圖解

負寬矩形:          標準化後:
X=100, W=-50   →   X=50, W=50
│◄── -50 ──►│        │◄── 50 ──►│
左邊界實際在50       左邊界修正為50

擴展:通用矩形標準化方法


public static Rectangle Normalize(this Rectangle rect) {
    if (rect.Width < 0) {
        rect.X += rect.Width;
        rect.Width = -rect.Width;
    }
    if (rect.Height < 0) {
        rect.Y += rect.Height;
        rect.Height = -rect.Height;
    }
    return rect;
}

// 使用
MouseRect = MouseRect.Normalize();

替代方案

  • Rectangle.Intersect:靜態方法返回交集矩形,自動處理負數
  • 自定義碰撞檢測:分離軸定理(SAT)處理任意多邊形
  • Control.Bounds標準化:控件Bounds通常為正,僅需修正繪製矩形
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved