Android Matrix深度解析:变换与应用

需积分: 50 1 下载量 178 浏览量 更新于2024-09-15 收藏 449KB PDF 举报
"Android Matrix基础+详解" Android中的`Matrix`类是用于处理2D图形变换的重要工具,它基于线性代数中的矩阵概念,可以实现对图像或几何形状的平移、旋转、缩放和倾斜等多种操作。在Android的图形处理中,`Matrix`的应用非常广泛,特别是在自定义View或者进行图像处理时。 ### 基础知识 1. **矩阵基础**:在数学中,矩阵是一个矩形阵列,包含了一组按行和列排列的数值。在2D图形变换中,通常使用3x3的矩阵,因为这足够描述一个平面上的几何变换。矩阵的每个元素都有其特定的意义,比如平移、旋转、缩放等。 2. **平移**:平移可以通过修改矩阵的右下角两个元素来实现。例如,如果要将一个点(x0, y0)沿x轴移动Δx,沿y轴移动Δy,则矩阵的右下角元素变为(1, Δx)和(Δy, 1),其他元素保持不变。 3. **缩放**:缩放可以通过改变矩阵的主对角线元素来实现。如果要沿x轴放大a倍,沿y轴放大b倍,矩阵的对应元素变为(a, 0)和(0, b)。 4. **旋转**:旋转涉及到更复杂的矩阵运算。若要将点P0(x0, y0)绕原点旋转θ角度,对应的矩阵元素会涉及到正弦和余弦函数。Android中,`Matrix`类提供了`setRotate()`方法来设置旋转角度。 5. **旋转中心点**:如果旋转不是围绕原点,而是围绕任意点(a, b),需要先将图像平移到旋转中心,再进行旋转,最后再平移回原来的位置。这是通过矩阵相乘实现的,可以确保变换前后点(a, b)的位置不变。 ### 如何使用`Matrix` 在Android的`Matrix`类中,我们可以直接调用相应的函数来执行变换: 1. **平移**:使用`postTranslate()`或`preTranslate()`方法,这两个方法分别表示在现有变换基础上添加平移,或者在平移后应用现有变换。 2. **缩放**:使用`postScale()`或`preScale()`方法,它们与平移方法类似,可以指定缩放中心点。 3. **旋转**:使用`setRotate()`方法设置旋转角度,它默认绕原点旋转,也可以通过`postRotate()`或`preRotate()`指定旋转中心。 4. **组合变换**:可以连续调用这些方法,矩阵变换会按调用顺序累积。例如,先缩放后旋转,可以先调用`postScale()`,再调用`postRotate()`。 5. **查看矩阵状态**:`Matrix`对象的`toString()`方法可以输出当前矩阵的值,这对于调试和理解变换过程很有帮助。 6. **应用变换**:`Matrix`变换通常应用于`Canvas`,如`canvas.concat(matrix)`将矩阵应用到画布上,使得后续的绘制操作都会受到矩阵的影响。 在实际开发中,理解和熟练运用`Matrix`进行图形变换,可以极大地增强Android应用的视觉效果和交互性。通过不断实践和探索,开发者可以创造出更加生动和个性化的界面。
132 浏览量

优化这段代码:def calTravelCost(route_list,model): timetable_list=[] distance_of_routes=0 time_of_routes=0 obj=0 for route in route_list: timetable=[] vehicle=model.vehicle_dict[route[0]] travel_distance=0 travel_time=0 v_type = route[0] free_speed=vehicle.free_speed fixed_cost=vehicle.fixed_cost variable_cost=vehicle.variable_cost for i in range(len(route)): if i == 0: next_node_id=route[i+1] travel_time_between_nodes=model.distance_matrix[v_type,next_node_id]/free_speed departure=max(0,model.demand_dict[next_node_id].start_time-travel_time_between_nodes) timetable.append((int(departure),int(departure))) elif 1<= i <= len(route)-2: last_node_id=route[i-1] current_node_id=route[i] current_node = model.demand_dict[current_node_id] travel_time_between_nodes=model.distance_matrix[last_node_id,current_node_id]/free_speed arrival=max(timetable[-1][1]+travel_time_between_nodes,current_node.start_time) departure=arrival+current_node.service_time timetable.append((int(arrival),int(departure))) travel_distance += model.distance_matrix[last_node_id, current_node_id] travel_time += model.distance_matrix[last_node_id, current_node_id]/free_speed+\ + max(current_node.start_time - arrival, 0) else: last_node_id = route[i - 1] travel_time_between_nodes = model.distance_matrix[last_node_id,v_type]/free_speed departure = timetable[-1][1]+travel_time_between_nodes timetable.append((int(departure),int(departure))) travel_distance += model.distance_matrix[last_node_id,v_type] travel_time += model.distance_matrix[last_node_id,v_type]/free_speed distance_of_routes+=travel_distance time_of_routes+=travel_time if model.opt_type==0: obj+=fixed_cost+travel_distance*variable_cost else: obj += fixed_cost + travel_time *variable_cost timetable_list.append(timetable) return timetable_list,time_of_routes,distance_of_routes,obj

2023-06-11 上传