SDL3_API分类参考_矩形与点运算(CategoryRect)

2026-3-6 / 0 评论 / 4 阅读

矩形与点运算子系统(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

总结

  1. SDL 矩形子系统核心是 SDL_Rect(整型)和 SDL_FRect(浮点型)两类结构体,配套函数覆盖相交、包含、合并等所有常用几何运算;
  2. FreeBASIC 中使用时,需注意函数参数为结构体指针,SDL_HasRectIntersection/SDL_PointInRect 是最常用的判断类函数,SDL_GetRectIntersection/SDL_GetRectUnion 是核心计算类函数;
  3. 浮点型函数(后缀 Float)适用于高精度几何运算,整型函数性能更高,可根据场景选择,SDL_RectToFRect 可快速完成整型到浮点型的转换。

评论一下?

OωO
取消