需要涉及到的问题
1. 通过两个点获取到包含在两点之间的所有节点(框选)
2. 整体拖拽(框选后的整体拖拽)
3. 只允许节点在限定范围内拖拽(不让被框选的节点拖出限定范围外)
通过两点获取包含在两点之间的节点:
首先得到Canvas(简称ca)的两个点坐标即beginPoint,endPoint。通过节点(简称n)的x,y能够获取到该节点的中心点,即centerX,centerY。
代码:
public function setSelectionNodes(beginPoint:Point, endPoint:Point):void
{
for each (var n:GBaseNode in _allNodes)
{
if (beginPoint.x < endPoint.x && beginPoint.y < endPoint.y)
{
if (n.centerX > beginPoint.x && n.centerY > beginPoint.y && n.centerX < endPoint.x && n.centerY < endPoint.y)
{
n.select();
selectedNodes.push(n);
}
}
if (beginPoint.x > endPoint.x && beginPoint.y > endPoint.y)
{
if (n.centerX > endPoint.x && n.centerY > endPoint.y && n.centerX < beginPoint.x && n.centerY < beginPoint.y)
{
n.select();
selectedNodes.push(n);
}
}
if (beginPoint.x < endPoint.x && beginPoint.y > endPoint.y)
{
if (n.centerX > beginPoint.x && n.centerY < beginPoint.y && n.centerX < endPoint.x && n.centerY > endPoint.y)
{
n.select();
selectedNodes.push(n);
}
}
if (beginPoint.x > endPoint.x && beginPoint.y < endPoint.y)
{
if (n.centerX < beginPoint.x && n.centerY > beginPoint.y && n.centerY < endPoint.y && n.centerX > endPoint.x)
{
n.select();
selectedNodes.push(n);
}
}
}
}
代码中分别处理的四种情况,即由
左上角向右下角拖拽、
右下角向左上角拖拽、
左下角向右上角拖拽、
右上角向左下角拖拽。
整拖
每个节点都有两个属性用于判定当前坐标,即selectionXOffset和selectionYOffset,在选中节点后,点击一个被选中的节点,将此节点放入到一个新的变量_firstSelectedItem,通过此变量来判定其他节点的x,y坐标
var xOffset:Number=node.x;
var yOffset:Number=node.y;
for each (var baseNode:GBaseNode in this.selectedNodes)
{
if (baseNode == node)
{
continue;
}
else
{
baseNode.selectionXOffset=xOffset - baseNode.x;
baseNode.selectionYOffset=yOffset - baseNode.y;
}
}
view.addEventListener(Event.ENTER_FRAME, dragAllHandler);
在dragAllHandler中的处理函数如下:
private function dragAllHandler(e:Event):void
{
for each (var n:GBaseNode in this._selectedNodes)
{
if (n != _firstSelectedItem)
{
n.move(_firstSelectedItem.x - n.selectionXOffset, _firstSelectedItem.y - n.selectionYOffset);
}
}
}
限定范围内的拖拽,不仅仅是当选的节点的范围,还要考虑到整拖的时候不让其他节点也拖拽到边界外面去,因此,需要获得上下左右四个节点如图所示:
中间的节点是鼠标按下去的拖动节点,其他周边四个节点的移动则是参考了中间节点的坐标而移动的,为了不让节点在整体拖拽的时候被拖出工作区外,需要限定中间那个节点的拖拽范围。
if (view.isSelection && node.isSelected)
{
_firstSelectedItem=node;
//找到最左上角的节点
var leftNode:GBaseNode = findLeftNode();
trace("最左边的节点ID是:"+leftNode.itemId);
var topNode:GBaseNode = findTopNode();
trace("最上边的节点ID是:"+topNode.itemId);
var bottomNode:GBaseNode = findBottomNode();
trace("最下面的节点ID是:"+bottomNode.itemId);
var rightNode:GBaseNode = findRightNode();
trace("最右边的节点ID是:"+rightNode.itemId);
var lx:Number = node.x - leftNode.x;
var ly:Number = node.y - topNode.y;
var w:Number;
trace(_firstSelectedItem.itemId);
if(rightNode == _firstSelectedItem){
trace("1")
w = view.width - _firstSelectedItem.width - lx;
trace(_firstSelectedItem.itemId);
}else{
w = leftNode.x + (view.width - rightNode.x-rightNode.width);
}
var h:Number;
if(bottomNode == _firstSelectedItem){
trace("2");
h = view.height - _firstSelectedItem.height-ly;
}else{
h = topNode.y + (view.height - bottomNode.y - bottomNode.height);
}
trace(w,h);
node.startDrag(false, new Rectangle(lx,ly, w,h));
node.isDraging=true;
var xOffset:Number=node.x;
var yOffset:Number=node.y;
for each (var baseNode:GBaseNode in this.selectedNodes)
{
if (baseNode == node)
{
continue;
}
else
{
baseNode.selectionXOffset=xOffset - baseNode.x;
baseNode.selectionYOffset=yOffset - baseNode.y;
}
}
view.addEventListener(Event.ENTER_FRAME, dragAllHandler);
return;
}
其中findTopNode等类似函数,如下所示:
private function findTopNode():GBaseNode
{
var topNode:GBaseNode;
for each(var n:GBaseNode in _selectedNodes){
if(n == _firstSelectedItem){
continue;
}
var len:Number = _firstSelectedItem.y - n.y;
if(len >= 0)
{
if(topNode != null)
{
var len2:Number = _firstSelectedItem.y - topNode.y;
if(len2 >= 0)
{
if(len > len2)
{
topNode = n;
}
}
}else{
topNode = n;
}
}
}
if(topNode == null){
return _firstSelectedItem;
}
return topNode;
}
此处只是给出解决问题的方法,并没有指望您能看懂我写的代码,只希望你能看懂我的思路即可。也许你有更好的解决方案或者算法,还望赐教。

- 大小: 37.8 KB
分享到:
相关推荐
在ActinScript编程环境中,`fscommand`是一个关键的命令,它允许ActionScript与外部应用程序进行交互,特别是在处理Flash(SWF)文件时。在标题和描述中提到的"在ActinScript中fscommand的实现全屏和退出以及关闭...
在AS3中,可以使用各种算法来实现这一点,例如轴对齐边界框(AABB)或分离轴定理(SAT)。有效的碰撞检测对于确保游戏逻辑的正确性至关重要,如角色移动、物体交互和得分计算。 三角函数在游戏开发中扮演着重要角色...
员工晋升管理制度.doc
内容概要:本文详细探讨了将阶梯式碳交易机制和电制氢技术应用于综合能源系统的热电优化方法。首先介绍了阶梯式碳交易的建模方式,通过分段线性化处理碳排放成本,使模型能够更好地反映现实中的碳市场价格波动。接着讨论了电制氢技术的应用,包括电解槽、甲烷反应器和氢燃料电池的具体实现及其在系统中的角色。此外,还提出了热电联产(CHP)系统中热电比动态调整的方法,提高了系统的灵活性和经济效益。文中提供了详细的MATLAB和CPLEX代码示例,展示了如何将这些复杂的技术和政策机制融入优化模型中。 适合人群:从事综合能源系统优化的研究人员、工程师以及对低碳技术和能源管理感兴趣的学者。 使用场景及目标:适用于需要进行低碳转型的企业和机构,旨在通过引入先进的碳交易机制和氢能技术,降低碳排放并提高能源利用效率。目标是在满足能源需求的同时,减少环境影响并降低成本。 其他说明:文中提到的优化模型不仅关注技术实现,还强调了经济性和环保效益之间的平衡。通过合理的参数设置和求解器配置,可以在不影响系统性能的前提下显著提升优化效果。
内容概要:本文详细介绍了7电平模块化多电平换流器(MMC)的闭环控制系统仿真,重点探讨了外环和内环控制、电容电压平衡、二倍频环流抑制以及载波移相调制等关键技术。作者通过MATLAB、Python和Verilog等多种编程语言实现了各个控制模块的具体算法,并分享了调试过程中遇到的问题及解决方案。实验结果显示,该系统能够将直流电压纹波控制在0.8%以内,环流幅值降至额定电流的3%以下,具有较强的鲁棒性和稳定性。 适合人群:电力电子工程师、高校师生及相关研究人员,特别是对MMC仿真感兴趣的初学者和技术爱好者。 使用场景及目标:适用于研究和开发高效稳定的MMC系统,特别是在高压直流输电领域的应用。主要目标是提高系统的稳定性和效率,减少电容电压失衡和环流震荡等问题。 其他说明:文中提供了详细的代码实现和调试技巧,有助于读者深入理解和掌握MMC闭环控制的关键技术和实践经验。同时,作者还提出了一些优化方向,如加入模糊控制器进一步提升系统性能。
2. 亚马逊【官方选品方法论】《五三选品法》.pdf
员工职业生涯规划表、能力开发需求表
内容概要:本文详细介绍了利用MATLAB实现的小波阈值降噪技术,涵盖三种主要方法:自定义阈值、智能推荐阈值以及分层精细处理。首先,通过生成带噪信号作为实验对象,展示了如何使用硬阈值和软阈值进行去噪。接着,探讨了智能推荐阈值的方法,如贝叶斯估计法,能够自动确定最优阈值。最后,深入讲解了分层处理的技术,通过对不同层次的细节系数分别设定阈值,达到更好的降噪效果。文中还提供了大量MATLAB代码实例,帮助读者理解和实践。 适合人群:具有一定MATLAB基础并希望深入了解小波变换理论及应用的研究人员和技术人员。 使用场景及目标:适用于各种含有噪声的数据处理任务,特别是机械振动信号、音频信号等领域。目标是提高信号质量,增强后续数据分析的有效性和准确性。 其他说明:文中强调了参数选择的重要性,如小波基的选择、分解层数的设定等,并给出了具体的调试建议。此外,还提到了一些常见的错误及解决办法,便于初学者快速上手。
集团关怀活动方案.doc
辞退面谈与赔偿金计算P23.pptx
月度招聘报表.xlsx
内容概要:本文详细介绍了基于容积卡尔曼滤波(CKF)和滑膜控制(SMC)的永磁同步电机(PMSM)无传感器控制技术。首先阐述了CKF的工作原理及其在状态估计中的优势,包括状态预测、量测更新和状态后验分布的计算。接着讨论了滑膜控制的设计思路和实现方法,强调其在快速响应和鲁棒性方面的特点。文中还提供了Python和Matlab的代码示例,展示了这两种控制方法的具体实现。通过仿真和实验结果表明,该方法在转速估计和控制精度方面表现出色,具有广泛的应用前景。 适合人群:从事电机控制系统设计的研究人员和技术人员,尤其是关注高精度、高动态性能的无传感器控制方案的专业人士。 使用场景及目标:适用于需要高精度、高动态响应的电机应用场景,如工业自动化、航空航天等领域。主要目标是提高电机控制系统的精度和鲁棒性,降低系统成本和复杂度。 其他说明:文中提到的CKF和SMC方法不仅限于理论探讨,还包括了详细的代码实现和实验数据支持,有助于读者深入理解和实际应用。此外,文中还提到了一些优化技巧,如启动阶段误差补偿和高级CKF版本的选择,进一步提升了系统的性能。
解聘职员申请表-模板.doc
内容概要:本文详细介绍了如何使用MATLAB对并联机器人进行仿真实现,涵盖了运动学建模、动力学分析和轨迹跟踪控制三大方面。首先,通过定义关键参数和几何法求解逆运动学,建立了Delta并联机器人的运动学模型。接着,利用牛顿-欧拉法推导动力学方程,考虑了惯性力、重力等因素的影响。最后,采用PD+前馈控制方法实现轨迹跟踪,并通过仿真验证了控制效果。文中还提供了具体的MATLAB代码示例,帮助读者更好地理解和应用相关理论。 适合人群:对机器人技术感兴趣的科研人员、高校学生及工程技术人员。 使用场景及目标:适用于研究并联机器人的运动特性、优化控制系统性能、验证新算法的有效性等场景。目标是掌握并联机器人的建模与控制方法,提高仿真能力。 其他说明:文章强调了仿真过程中需要注意的问题,如奇异位形、数值稳定性等,并给出了相应的解决方案。同时,鼓励读者动手实践,通过调整参数和改进算法来深入探索并联机器人的行为特征。
新员工入职引导及融入管理办法
内容概要:本文详细介绍了光伏系统中最大功率点跟踪(MPPT)技术的一种常见实现方式——扰动观察法及其仿真模型的构建。文章首先阐述了扰动观察法的基本原理,即通过不断改变光伏电池的工作点并观察功率变化来逐步逼近最大功率点。接着,提供了具体的Python和MATLAB代码实现,展示了如何在MATLAB的Simulink环境中搭建光伏系统仿真模型,包括使用内置或自建光伏电池模型。文中强调了自建光伏电池模型的优势,如可根据实际情况调整参数,使仿真结果更为精确。此外,还讨论了仿真过程中可能出现的问题及解决方案,如电压振荡、误判和响应速度等,并通过视频解释进一步增强了理解和实用性。 适合人群:对光伏发电技术和MPPT算法感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解光伏系统工作原理、掌握MPPT算法实现方法的研究人员;希望通过仿真验证和优化光伏系统性能的工程师;以及对光伏技术感兴趣的学习者。 其他说明:文章不仅提供了详细的理论讲解和技术实现步骤,还包括了实际案例分析和视频教程链接,便于读者更好地理解和实践。
内容概要:本文详细介绍了对称修正梯形加速度规律插补算法的推导与仿真实现。传统梯形加速度模型在加减速转换时会产生冲击,而对称修正梯形加速度通过引入过渡段使加速度变化更加平滑。文中首先推导了算法的基本原理,包括加速和减速阶段的分段处理方法,并给出了Python代码示例用于模拟加速阶段的速度变化。接着,利用MATLAB进行了仿真验证,展示了速度曲线的平滑过渡特性。此外,还讨论了实际应用场景中的参数选择和注意事项,如伺服电机的扭矩限制以及高阶多项式的使用风险。通过对机械臂的实际测试表明,该算法能够显著降低末端振动幅度,提高运动控制的精度和平稳性。 适合人群:从事运动控制、数控加工等相关领域的工程师和技术人员,尤其是希望深入了解加速度规律插补算法及其优化的人群。 使用场景及目标:适用于需要优化运动控制系统的场合,特别是那些对平稳性和精度有较高要求的应用,如机器人、数控机床等。目标是减少机械冲击,提升设备运行的稳定性和可靠性。 其他说明:文中提供了详细的数学推导和代码实现,帮助读者更好地理解和应用这一算法。同时提醒读者在实际应用中应注意参数的选择和硬件限制,确保算法的有效性和安全性。
基于51单片机protues仿真的番茄计时器(仿真图、源代码、AD原理图、流程图、视频) 设计一个番茄计时器。使用番茄工作法(番茄工作法是一种时间管理方法),选择一个待完成的任务,将番茄时间设为45分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响起,然后进行短暂休息一下(5分钟),然后再开始下一个番茄。每4个番茄时段再多休息5分钟。 按键1:单击设置45分钟倒计时,双击设置5分钟休息倒计时。 按键2:单击音乐播放,双击暂停。按键3:复位按键。 所需硬件:3个按键,1个动态数码管,1个蜂鸣器。 仿真图、源代码、AD原理图、流程图、视频
内容概要:本文详细介绍了利用CST进行可重构超表面的设计与仿真方法,涵盖材料建模(如二氧化钒和石墨烯)、相位调控(如涡旋相位阵列)以及联合仿真技巧。文章提供了多个MATLAB和CST脚本实例,帮助解决仿真过程中常见的难题,如材料参数调整、相位纯度计算、联合仿真中的索引顺序问题等。此外,还分享了一些实用的仿真优化技巧,如参数扫描、场分布配色方案等。 适合人群:从事超表面研究的科研人员和技术开发者,尤其是有一定CST和MATLAB使用经验的研究者。 使用场景及目标:适用于希望深入了解并掌握超表面建模与仿真的研究人员,目标是提高仿真效率和准确性,特别是在可重构超表面的设计和优化方面。 其他说明:文中提供的代码片段和技巧可以直接应用于实际项目中,有助于加速实验进程并获得更精确的仿真结果。同时,文章强调了仿真过程中需要注意的关键细节,避免常见错误。
内容概要:本文详细介绍了利用COMSOL软件研究相控阵聚焦声压分布的技术方法。首先探讨了压力声学-频域模块的作用及其在构建几何模型中的应用,接着深入讲解了相位差设置对声波叠加效果的影响。文中还展示了不同频率和聚焦深度下声压分布的变化情况,并提供了具体的代码示例用于理解和实施。此外,文章强调了网格划分、边界条件设置以及优化求解过程的重要性,旨在提高仿真效率和准确性。 适合人群:从事声学研究、超声成像、无损检测等领域科研工作者和技术人员。 使用场景及目标:①掌握COMSOL中压力声学-频域模块的基本操作;②学会根据不同应用场景调整相位差以达到理想的声压分布;③理解频率和聚焦深度对声压分布的具体影响;④提升仿真模型的精度和计算效率。 其他说明:文章不仅提供了理论知识,还包括大量实用的操作技巧和注意事项,如相位差公式的正确使用、网格划分策略、边界条件设置等,有助于读者快速上手并在实践中不断改进。