Dimension
概述
Dimension
类表示包含宽度和高度的 2D 尺寸结构。它用于 Matrix OS 框架内的布局操作、大小计算和空间操作。
Dimension 类实现位于 Applications/Python/PikaPython/MatrixOS_Dimension.py,类型提示位于 Applications/Python/PikaPython/_MatrixOS_Dimension.pyi。
Dimension(*val)
class Dimension:
def __init__(self, *val) -> None
使用各种输入格式创建尺寸:
- 0 个参数:零尺寸 (0, 0)
- 1 个参数:从原始字节
- 2 个参数:宽度和高度
参数:
*val
:根据所需构造函数的可变参数
示例:
# 创建零尺寸
zero_dim = Dimension()
# 从宽度和高度创建尺寸
size = Dimension(8, 8) # 8x8 尺寸
# 从原始字节创建(高级用法)
raw_dim = Dimension(0x00080008) # 打包的宽度/高度
Getter Methods
X
def X(self) -> int
Gets the X component (width) of the dimension.
Returns:
int
: The width value
Example:
dim = Dimension(8, 6)
width = dim.X() # Returns 8
Y
def Y(self) -> int
Gets the Y component (height) of the dimension.
Returns:
int
: The height value
Example:
dim = Dimension(8, 6)
height = dim.Y() # Returns 6
Setter Methods
SetX
def SetX(self, x: int) -> None
Sets the X component (width) of the dimension.
Parameters:
x
(int
): New width value
Example:
dim = Dimension(8, 6)
dim.SetX(10) # Dimension is now (10, 6)
SetY
def SetY(self, y: int) -> None
Sets the Y component (height) of the dimension.
Parameters:
y
(int
): New height value
Example:
dim = Dimension(8, 6)
dim.SetY(4) # Dimension is now (8, 4)
Methods
Contains
def Contains(self, point: Point) -> bool
Checks if a point is contained within this dimension (from origin).
Parameters:
point
(Point
): Point to check
Returns:
bool
: True if point is within dimension bounds
Example:
dim = Dimension(8, 8)
point1 = Point(3, 4) # Inside
point2 = Point(10, 2) # Outside
if dim.Contains(point1):
print("Point is within dimension")
Area
def Area(self) -> int
Calculates the area of the dimension.
Returns:
int
: Area (width × height)
Example:
dim = Dimension(4, 6)
area = dim.Area() # Returns 24
Operators
__add__
def __add__(self, other: Dimension) -> Dimension
Adds two dimensions component-wise.
Parameters:
other
(Dimension
): Dimension to add
Returns:
Dimension
: New dimension with added components
Example:
dim1 = Dimension(3, 4)
dim2 = Dimension(2, 1)
result = dim1 + dim2 # Dimension(5, 5)
__eq__
def __eq__(self, other: Dimension) -> bool
Checks if two dimensions are equal.
Parameters:
other
(Dimension
): Dimension to compare
Returns:
bool
: True if dimensions are equal
Example:
dim1 = Dimension(8, 8)
dim2 = Dimension(8, 8)
if dim1 == dim2:
print("Dimensions are equal")
__bool__
def __bool__(self) -> bool
Checks if dimension is non-zero (truthy).
Returns:
bool
: True if dimension has non-zero area
Example:
dim1 = Dimension(0, 0)
dim2 = Dimension(4, 4)
if not dim1:
print("Zero dimension")
if dim2:
print("Non-zero dimension")
Usage Examples
Basic Dimension Operations
# Create dimensions
grid_size = Dimension(8, 8)
button_size = Dimension(2, 2)
zero_size = Dimension()
# Get components
width = grid_size.X()
height = grid_size.Y()
print(f"Grid size: {width}x{height}")
# Calculate area
total_area = grid_size.Area()
button_area = button_size.Area()
print(f"Grid has {total_area} pixels, button has {button_area}")
# Check containment
center_point = Point(4, 4)
edge_point = Point(7, 7)
outside_point = Point(10, 10)
print(f"Center point in grid: {grid_size.Contains(center_point)}")
print(f"Edge point in grid: {grid_size.Contains(edge_point)}")
print(f"Outside point in grid: {grid_size.Contains(outside_point)}")
Layout Calculations
def fits_in_grid(item_size, grid_size):
"""Check if item fits in grid"""
return (item_size.X() <= grid_size.X() and
item_size.Y() <= grid_size.Y())
def calculate_max_items(item_size, grid_size):
"""Calculate maximum items that fit in grid"""
items_x = grid_size.X() // item_size.X()
items_y = grid_size.Y() // item_size.Y()
return items_x * items_y
def get_centered_position(item_size, grid_size):
"""Get position to center item in grid"""
x = (grid_size.X() - item_size.X()) // 2
y = (grid_size.Y() - item_size.Y()) // 2
return Point(x, y)
# Usage examples
grid = Dimension(8, 8)
button = Dimension(2, 2)
if fits_in_grid(button, grid):
max_buttons = calculate_max_items(button, grid)
center_pos = get_centered_position(button, grid)
print(f"Can fit {max_buttons} buttons")
print(f"Centered button at ({center_pos.X()}, {center_pos.Y()})")
Dimension Arithmetic
# Combine dimensions
total_size = Dimension(4, 4) + Dimension(2, 2) # Results in (6, 6)
# Create different sized areas
small_area = Dimension(2, 2)
medium_area = Dimension(4, 4)
large_area = Dimension(6, 6)
areas = [small_area, medium_area, large_area]
for i, area in enumerate(areas):
print(f"Area {i+1}: {area.X()}x{area.Y()} = {area.Area()} pixels")
# Check if dimensions are meaningful
empty_dim = Dimension(0, 0)
valid_dim = Dimension(4, 4)
print(f"Empty dimension is truthy: {bool(empty_dim)}")
print(f"Valid dimension is truthy: {bool(valid_dim)}")
Boundary Checking
def check_all_corners(dimension):
"""Check if all corner points are contained"""
corners = [
Point(0, 0), # Top-left
Point(dimension.X()-1, 0), # Top-right
Point(0, dimension.Y()-1), # Bottom-left
Point(dimension.X()-1, dimension.Y()-1) # Bottom-right
]
for i, corner in enumerate(corners):
contained = dimension.Contains(corner)
print(f"Corner {i+1} ({corner.X()}, {corner.Y()}): {contained}")
def get_valid_points(dimension):
"""Get all valid points within dimension"""
points = []
for y in range(dimension.Y()):
for x in range(dimension.X()):
point = Point(x, y)
if dimension.Contains(point):
points.append(point)
return points
# Test with 8x8 grid
grid_dim = Dimension(8, 8)
check_all_corners(grid_dim)
# Get all valid points (useful for iteration)
valid_points = get_valid_points(Dimension(3, 3))
print(f"3x3 dimension has {len(valid_points)} valid points")
Common Patterns
Grid Size Constants
# Standard grid sizes
MATRIX_8X8 = Dimension(8, 8)
MATRIX_4X4 = Dimension(4, 4)
MATRIX_2X2 = Dimension(2, 2)
# UI component sizes
BUTTON_SMALL = Dimension(1, 1)
BUTTON_MEDIUM = Dimension(2, 1)
BUTTON_LARGE = Dimension(3, 2)
# Layout areas
FULL_GRID = Dimension(8, 8)
HALF_GRID = Dimension(4, 8)
QUARTER_GRID = Dimension(4, 4)
Size Validation
def is_valid_dimension(dim, max_dim=Dimension(8, 8)):
"""Validate dimension against maximum size"""
return (dim.X() > 0 and dim.Y() > 0 and
dim.X() <= max_dim.X() and dim.Y() <= max_dim.Y())
def clamp_dimension(dim, max_dim=Dimension(8, 8)):
"""Clamp dimension to valid range"""
x = max(1, min(max_dim.X(), dim.X()))
y = max(1, min(max_dim.Y(), dim.Y()))
return Dimension(x, y)
# Example usage
test_dim = Dimension(10, 12)
if not is_valid_dimension(test_dim):
clamped = clamp_dimension(test_dim)
print(f"Clamped {test_dim.X()}x{test_dim.Y()} to {clamped.X()}x{clamped.Y()}")
Comments