多线程(start-point & end-point)

本文探讨了在批量线程任务管理中CountDownLatch与CyclicBarrier的应用场景及作用。CountDownLatch用于等待所有子任务完成后再继续执行后续操作,而CyclicBarrier则用于多个线程到达指定点后同时继续执行。
why
  • 最近项目是中使用到了CountDownLatch, 小憩时间对Doug Lea在JUC包提供的这两个类做了一些思考,这里不提供具体的使用方法,只是写一些对这两个类的理解; 如有偏颇, 请斧正
场景
  • 当有批处理任务或者类map数据清洗等任务中,基本都需要使用多线程(无论是从时间效率和资源利用率方面考虑,多线程(多任务)都是必须的),在这个多线程任务的前提下, 我们往往需要对多线程(多任务)进行管理,批量线程的简单管理模式就是, 让这些线程在某个点(时间, 事件…)运行或者在所有任务都运行完成后,执行某些操作。
  • 相对批量线程的运行状态管理而言在它们开始点和结束点作管理更容易,而且使用范围也会更广泛。所以JDK juc包 提供了CountDownLatch/CyclicBarrier
    • CyclicBarrier(start point)
    • CountDownLatch (end point)
<think>我们想要将起点和终点从点标记更改为矩形区域。在3D图中,矩形区域可以用一个平面矩形表示,但通常我们使用patch函数来绘制多边形(例如矩形)。 思路: 1. 起点和终点不再是一个点,而是一个矩形区域。假设矩形在XY平面上,高度(Z值)与起点/终点相同,矩形的大小由我们指定。 2. 我们可以定义矩形的四个角点,然后使用patch函数绘制一个矩形。 3. 为了表示起点和终点,我们可以用不同的颜色填充这两个矩形。 具体步骤: 假设矩形的宽度和高度(在XY平面上的尺寸)为rect_size(例如100米)。那么起点矩形的四个角点为: start_rect = [start_point(1)-rect_size/2, start_point(2)-rect_size/2, start_point(3); start_point(1)+rect_size/2, start_point(2)-rect_size/2, start_point(3); start_point(1)+rect_size/2, start_point(2)+rect_size/2, start_point(3); start_point(1)-rect_size/2, start_point(2)+rect_size/2, start_point(3)]; 同样定义终点的矩形。 注意:这里假设矩形是水平放置(平行于XY平面)。如果希望矩形垂直于地面(比如在XZ或YZ平面),则需要调整。 然后使用patch函数绘制: patch(ax, start_rect(:,1), start_rect(:,2), start_rect(:,3), 'g', 'FaceAlpha', 0.5); 这里设置面颜色为绿色,并设置透明度0.5。 同时,我们可能还想保留文字标注,但需要调整位置,因为现在起点和终点是一个区域,我们可以将文字标注在区域中心的上方。 修改代码: 将原来的plot3和text替换为patch和新的text。 注意:如果矩形区域绘制后覆盖了轨迹线,我们可以调整绘制顺序,先绘制轨迹再绘制矩形,或者调整Z轴高度使矩形稍微高于轨迹(例如加一个小的偏移量)。 示例代码: 假设rect_size = 200; % 矩形区域的边长(单位与坐标一致) 起点矩形: rect_size = 200; start_rect = [start_point(1)-rect_size/2, start_point(2)-rect_size/2, start_point(3); start_point(1)+rect_size/2, start_point(2)-rect_size/2, start_point(3); start_point(1)+rect_size/2, start_point(2)+rect_size/2, start_point(3); start_point(1)-rect_size/2, start_point(2)+rect_size/2, start_point(3)]; % 绘制起点矩形 patch(ax, 'XData', start_rect(:,1), 'YData', start_rect(:,2), 'ZData', start_rect(:,3), ... 'FaceColor', 'g', 'FaceAlpha', 0.5, 'EdgeColor', 'g'); % 在起点矩形上方添加文字 text(ax, start_point(1), start_point(2), start_point(3)+300, 'Start', 'Color', 'g', 'FontSize', 12); 同样绘制终点矩形(颜色为红色)。 但要注意:矩形的四个点必须按照顺序连接,形成一个四边形。这里我们定义的是逆时针顺序,patch会自动连接。 另一种方法是使用fill3函数,但fill3在3D坐标中也是绘制一个平面多边形,用法类似。 考虑到轨迹是3D的,但矩形是水平放置,如果轨迹在高度上有变化,这样绘制是合理的。 如果希望矩形垂直于轨迹方向,需要计算轨迹在起点处的切线方向,然后使矩形垂直于该切线,这会更复杂。当前需求是矩形区域,我们假设水平放置。 因此,修改代码如下: </think>### 解决方案:将起点和终点标记更改为矩形区域 #### 问题分析 当前代码将起点和终点绘制为单个点标记(圆形)。要改为矩形区域,需要: 1. 使用`patch`函数绘制矩形而非`plot3`绘制点 2. 定义矩形的四个角点坐标 3. 设置填充颜色和透明度 4. 调整文字标注位置使其位于矩形上方 #### 完整实现代码 ```matlab % 定义矩形尺寸(单位与坐标一致) rect_width = 500; % 矩形宽度 rect_depth = 500; % 矩形深度 height_offset = 50; % 矩形高度偏移(避免与轨迹重叠) % 绘制起点矩形区域 start_rect = [ start_point(1) - rect_width/2, start_point(2) - rect_depth/2, start_point(3); start_point(1) + rect_width/2, start_point(2) - rect_depth/2, start_point(3); start_point(1) + rect_width/2, start_point(2) + rect_depth/2, start_point(3); start_point(1) - rect_width/2, start_point(2) + rect_depth/2, start_point(3); ]; % 四个角点坐标 patch(ax, ... 'XData', start_rect(:,1), ... 'YData', start_rect(:,2), ... 'ZData', start_rect(:,3) + height_offset, ... 'FaceColor', 'g', ... 'FaceAlpha', 0.5, ... 'EdgeColor', 'k', ... 'LineWidth', 1.5); % 绘制终点矩形区域 end_rect = [ end_point(1) - rect_width/2, end_point(2) - rect_depth/2, end_point(3); end_point(1) + rect_width/2, end_point(2) - rect_depth/2, end_point(3); end_point(1) + rect_width/2, end_point(2) + rect_depth/2, end_point(3); end_point(1) - rect_width/2, end_point(2) + rect_depth/2, end_point(3); ]; patch(ax, ... 'XData', end_rect(:,1), ... 'YData', end_rect(:,2), ... 'ZData', end_rect(:,3) + height_offset, ... 'FaceColor', 'r', ... 'FaceAlpha', 0.5, ... 'EdgeColor', 'k', ... 'LineWidth', 1.5); % 添加文字标注(位于矩形中心上方) text(ax, ... start_point(1), start_point(2), start_point(3) + rect_width/2 + 200, ... 'Start Zone', ... 'Color', 'g', ... 'FontSize', 12, ... 'FontWeight', 'bold', ... 'HorizontalAlignment', 'center'); text(ax, ... end_point(1), end_point(2), end_point(3) + rect_width/2 + 200, ... 'End Zone', ... 'Color', 'r', ... 'FontSize', 12, ... 'FontWeight', 'bold', ... 'HorizontalAlignment', 'center'); ``` ### 关键改进说明 1. **矩形定义**: - 通过计算四个角点坐标定义矩形区域 - 使用`rect_width`和`rect_depth`控制矩形尺寸 - `height_offset`防止矩形与轨迹重叠 2. **三维矩形绘制**: ```matlab patch('XData', X, 'YData', Y, 'ZData', Z, ...) ``` - `patch`函数支持三维空间中的多边形绘制 - `FaceAlpha`设置透明度使下方轨迹可见 - `EdgeColor`和`LineWidth`增强边界可视性 3. **文字标注优化**: - 位置计算:`start_point(3) + rect_width/2 + 200` - 居中显示:`'HorizontalAlignment', 'center'` - 加粗字体:`'FontWeight', 'bold'`增强可读性 4. **动态调整技巧**: ```matlab % 根据视图自动调整矩形尺寸 view_range = diff(ax.ZLim); rect_size = view_range * 0.05; % 占视图范围的5% ``` 可根据当前坐标轴范围自动计算合适的矩形尺寸 ### 高级应用:旋转矩形 如果希望矩形与轨迹方向对齐: ```matlab % 计算起点处的轨迹方向向量 dir_vec = sim_path(:,2) - sim_path(:,1); dir_vec = dir_vec / norm(dir_vec); % 单位化 % 计算垂直方向 perp_vec = cross(dir_vec, [0; 0; 1]); perp_vec = perp_vec / norm(perp_vec); % 构建旋转后的矩形 rotated_rect = start_point + [ -dir_vec*rect_width/2 - perp_vec*rect_depth/2 dir_vec*rect_width/2 - perp_vec*rect_depth/2 dir_vec*rect_width/2 + perp_vec*rect_depth/2 -dir_vec*rect_width/2 + perp_vec*rect_depth/2 ]; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值