矩形与点运算子系统(CategoryRect)
SDL 提供的矩形和 2D 点管理辅助函数集,包含整型和浮点型两个版本,覆盖矩形相交、包含、合并等常用几何运算。
函数
- SDL_GetRectAndLineIntersection:计算整型矩形与线段的交点(修改线段坐标为交点)
- SDL_GetRectAndLineIntersectionFloat:计算浮点型矩形与线段的交点(修改线段坐标为交点)
- SDL_GetRectEnclosingPoints:计算包含所有整型点的最小包围矩形
- SDL_GetRectEnclosingPointsFloat:计算包含所有浮点型点的最小包围矩形
- SDL_GetRectIntersection:计算两个整型矩形的交集(返回交集矩形)
- SDL_GetRectIntersectionFloat:计算两个浮点型矩形的交集(返回交集矩形)
- SDL_GetRectUnion:计算两个整型矩形的并集(返回覆盖两个矩形的最小矩形)
- SDL_GetRectUnionFloat:计算两个浮点型矩形的并集(返回覆盖两个矩形的最小矩形)
- SDL_HasRectIntersection:判断两个整型矩形是否相交(返回布尔值)
- SDL_HasRectIntersectionFloat:判断两个浮点型矩形是否相交(返回布尔值)
- SDL_PointInRect:判断整型点是否在整型矩形内(包含边界)
- SDL_PointInRectFloat:判断浮点型点是否在浮点型矩形内(包含边界)
- SDL_RectEmpty:判断整型矩形是否为空(宽/高≤0 则为空)
- SDL_RectEmptyFloat:判断浮点型矩形是否为空(宽/高≤0 则为空)
- SDL_RectsEqual:判断两个整型矩形是否完全相等
- SDL_RectsEqualEpsilon:判断两个浮点型矩形是否近似相等(指定误差阈值)
- SDL_RectsEqualFloat:判断两个浮点型矩形是否完全相等
- SDL_RectToFRect:将整型 SDL_Rect 转换为浮点型 SDL_FRect
数据类型
- (无)
结构体
- SDL_FPoint:浮点型 2D 点结构体(x、y 为单精度浮点)
- SDL_FRect:浮点型矩形结构体(x、y 为左上角坐标,w、h 为宽高,均为单精度浮点)
- SDL_Point:整型 2D 点结构体(x、y 为 32 位整型)
- SDL_Rect:整型矩形结构体(x、y 为左上角坐标,w、h 为宽高,均为 32 位整型)
枚举
- (无)
宏
- (无)
FreeBASIC 示例代码
' 引入 SDL 相关声明(需确保 FreeBASIC 已链接 SDL 库)
#Include "SDL.bi"
' 主程序示例
Sub PrintRectInfo(rect As SDL_Rect, name As String)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "%s:x=%d, y=%d, w=%d, h=%d", _
name, rect.x, rect.y, rect.w, rect.h)
End Sub
Sub PrintFRectInfo(frect As SDL_FRect, name As String)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "%s:x=%.2f, y=%.2f, w=%.2f, h=%.2f", _
name, frect.x, frect.y, frect.w, frect.h)
End Sub
' 主函数
Dim As SDL_Rect rect1, rect2, intersectRect, unionRect
Dim As SDL_FRect frect1, frect2, fIntersectRect
Dim As SDL_Point point1, point2(0 To 2)
Dim As SDL_FPoint fpoint1
Dim As Integer hasIntersect, isPointInRect
' 1. 整型矩形运算示例
rect1 = Type<SDL_Rect>(100, 100, 200, 200) ' 矩形1:(100,100) 宽200 高200
rect2 = Type<SDL_Rect>(150, 150, 200, 200) ' 矩形2:(150,150) 宽200 高200
PrintRectInfo(rect1, "矩形1")
PrintRectInfo(rect2, "矩形2")
' 判断矩形是否相交
hasIntersect = SDL_HasRectIntersection(@rect1, @rect2)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "矩形1与矩形2是否相交:%s", IIf(hasIntersect, "是", "否"))
' 计算交集
If (SDL_GetRectIntersection(@rect1, @rect2, @intersectRect)) Then
PrintRectInfo(intersectRect, "矩形交集")
End If
' 计算并集
SDL_GetRectUnion(@rect1, @rect2, @unionRect)
PrintRectInfo(unionRect, "矩形并集")
' 判断点是否在矩形内
point1 = Type<SDL_Point>(120, 120) ' 点1:(120,120)
isPointInRect = SDL_PointInRect(@point1, @rect1)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "点(%d,%d)是否在矩形1内:%s", _
point1.x, point1.y, IIf(isPointInRect, "是", "否"))
' 计算包围点集的最小矩形
point2(0) = Type<SDL_Point>(50, 50)
point2(1) = Type<SDL_Point>(250, 150)
point2(2) = Type<SDL_Point>(150, 250)
SDL_GetRectEnclosingPoints(@point2(0), 3, @rect1) ' 计算包含3个点的最小矩形
PrintRectInfo(rect1, "包围3个点的最小矩形")
' 2. 浮点型矩形运算示例
frect1 = Type<SDL_FRect>(100.5, 100.5, 200.0, 200.0)
frect2 = Type<SDL_FRect>(150.5, 150.5, 200.0, 200.0)
PrintFRectInfo(frect1, "浮点矩形1")
PrintFRectInfo(frect2, "浮点矩形2")
' 计算浮点矩形交集
If (SDL_GetRectIntersectionFloat(@frect1, @frect2, @fIntersectRect)) Then
PrintFRectInfo(fIntersectRect, "浮点矩形交集")
End If
' 判断浮点点是否在浮点矩形内
fpoint1 = Type<SDL_FPoint>(120.5, 120.5)
isPointInRect = SDL_PointInRectFloat(@fpoint1, @frect1)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "浮点点(%.2f,%.2f)是否在浮点矩形1内:%s", _
fpoint1.x, fpoint1.y, IIf(isPointInRect, "是", "否"))
' 3. 整型矩形转浮点矩形
Dim As SDL_FRect convFRect
SDL_RectToFRect(@rect1, @convFRect)
PrintFRectInfo(convFRect, "整型矩形1转换为浮点矩形")
' 4. 判断矩形是否为空
Dim As SDL_Rect emptyRect = Type<SDL_Rect>(0, 0, -100, 100)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "空矩形判断:%s", IIf(SDL_RectEmpty(@emptyRect), "是空矩形", "非空矩形"))
End 0
总结
- SDL 矩形子系统核心是
SDL_Rect(整型)和SDL_FRect(浮点型)两类结构体,配套函数覆盖相交、包含、合并等所有常用几何运算; - FreeBASIC 中使用时,需注意函数参数为结构体指针,
SDL_HasRectIntersection/SDL_PointInRect是最常用的判断类函数,SDL_GetRectIntersection/SDL_GetRectUnion是核心计算类函数; - 浮点型函数(后缀 Float)适用于高精度几何运算,整型函数性能更高,可根据场景选择,
SDL_RectToFRect可快速完成整型到浮点型的转换。
评论一下?