团队项目:核心算法实现

本游戏中最为核心的算法在于绘制轨道曲线的算法,实现如下:

每帧获取屏幕上的鼠标的位置设置为终点vt,之前上一帧设置的起点为v0,则这一帧所生成的轨道就是从v0到vt。在轨道生成完成后,将v0设置为vt,以便于下一帧继续进行轨道的生成。

流程图:

图1 核心算法流程图

伪代码:

1.检测是否按住鼠标左键,是则进入2,否则进入8。

2.获取鼠标在屏幕上的当前位置并转换为世界坐标temp_pos。

3.如果是第一次按下(first为true),将当前temp_pos赋给begin_pos,将first设为false。

4.如果当前的temp_pos到begin_pos的距离在最小限度以外,且线条总长totalLength在总长限制maxLength内则进入5,否则进入8。

5.将temp_pos赋给end_pos,若当前totalLength加上begin_pos和end_pos之间的距离tempLength超过了maxLength则对线段[begin_pos,end_pos]截取,改变end_pos的位置,使totalLength加上tempLength等于maxLength。将totalLength+tempLength赋给totalLength。

6.在线段[begin_pos,end_pos]的终点new_pos的位置创建一个轨道元素,并调整其角度和缩放值,使其从begin_pos连接到end_pos。

7.将end_pos赋给begin_pos。

8.检测是否放开鼠标左键,是则进入9,否则进入10。

9.将first设置为true,将totalLength设置为maxLength(即松开左键后不得继续创建轨道元素;clear()函数可将totalLength清零,之后可以继续画线)。

10.回到1。

详细代码:

if (Input.GetMouseButton(0)){//如果按住左键
            temp_pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);//屏幕坐标转世界坐标
            temp_pos.z = 0;//调整世界坐标z轴
            if (first == true){//如果是第一次按左键
                begin_pos = temp_pos;//当前位置作为开始位置
                first = false;//设置第一次标志为假
            }
           //当前位置和开始位置有一定间隔&&未超出长度限制
            else if ((Vector3.Magnitude(temp_pos - begin_pos) >= 0.1) && (totalLength < maxLength)){
                end_pos = temp_pos;//当前位置作为结束为止
                float tempLength = Vector3.Magnitude(end_pos - begin_pos);//记录当前长度
                if (totalLength + tempLength > maxLength) {//若在本次超出长度限制
                 //调整end_pos并且进行截取
                    end_pos = begin_pos + (end_pos - begin_pos) * (maxLength - totalLength) / tempLength;
                    totalLength = maxLength;//总长度等于最大长度
                }
                else{//本次未超出长度限制
                    totalLength += tempLength;//总长度加上当前长度
                }
              //新的轨道物体的位置为开始位置和结束位置连线的中点
                Vector3 new_pos = (begin_pos + end_pos) / 2;
              //新的轨道物体的x方向的缩放因子为开始位置和结束位置之间的线段长度
              //(因为轨道物体的x方向长度为1)
                Vector3 new_scale = new Vector3(Vector3.Magnitude(end_pos - begin_pos), 1, 1);
                //新的轨道物体的旋转角度
              float new_degree = 0;
                if (begin_pos.y > end_pos.y){//终点在起点下方
                 //旋转角度为向量Vector3.right和end_pos-begin_pos的夹角的相反数
                    new_degree = -Vector3.Angle(Vector3.right, end_pos - begin_pos);
                 //因为Angle方法只能返回0到180度的角
                }
                else{//终点在起点上方
                 //旋转角度为向量Vector3.right和end_pos-begin_pos的夹角
                    new_degree = Vector3.Angle(Vector3.right, end_pos - begin_pos);
                 //因为Angle方法只能返回0到180度的角
                }
              //实例化track_element物体
                track_element_new=(GameObject)Instantiate(track_element, new_pos, Quaternion.identity);
              //更改其缩放因子
                track_element_new.transform.localScale = new_scale;
              //更改其旋转角度(绕z轴正方向旋转new_degree度)
                track_element_new.transform.Rotate(Vector3.forward, new_degree);
              //更新下一次的开始位置为这一次的结束位置
                begin_pos = end_pos;
            }
        }
        if (Input.GetMouseButtonUp(0)){//如果放开鼠标左键
            totalLength = maxLength;//将当前总长度设为最大,即松开左键就不可再画(一笔画)
            first = true;//设置first标志为真
        }
时间: 2024-10-12 08:54:44

团队项目:核心算法实现的相关文章

团队项目选题讨论

我们小组的成员有:张帆.张雨帆.崔巍.王奈.汪天米.孙宇辰. 下面分别是我们初次讨论的意见.(持续更新) 张帆:由于我们团队有6个人,所以我觉得在做团队项目时,可以有1~2个人负责前端的部分,实现良好的用户接口.然后有2~3个人负责后端的算法.实现等.最后有1~2个人负责程序的测试工作,以保证代码的高效性以及有效性.测试人员虽然不参与实际书写代码的过程,但仍要对两个模块的实现方法要非常熟悉,我认为测试人员甚至要参与到项目的设计过程中. 张雨帆: 崔巍:类似北航7组合力完成的“学霸”网站就挺好,其

团队项目推荐:自动化卡通人脸生成——by Feng Nie

来到亚研院的实习已经接近两个月,我们终于在8月底开始了培养我们工程知识和能力的ASE课程,而软件工程的核心是运用学习的思维不断巩固实战能力,因此团队项目是一次极好的提升机会.而作为一个团队项目,我觉得需要考虑到项目的可行性,完整性以及最大化的满足用户的需求.毫无疑问,近期的脸萌,美图的热潮,说明图像类的软件已经越来越流行,基于这点,我推荐“自动化卡通人脸生成”作为我们的题目. 如今,用户追求一些具有趣味性和个人结合的应用,并且已经有趋势偏向图片处理和视频类软件.随着社交网络的出现,越来越多的头像

团队项目课堂展示

团队项目课堂展示 成员简介/分工以及贡献 杨光海天:PM,尽力推进项目进行,统筹分配团队成员任务,参与Android前段开发.博客地址 郭剑南:主要负责核心算法中预处理的功能实现,并在每次团队会议中出谋划策.博客地址 赖志平:Android前端开发主力,协助其他前端成员开发,并且主要负责github上的代码整合.博客地址 吴伟根:参与数据库开发,本身作为数据库开发主力,开发数据库工作量稍大,功能未能实现,而后在团队其他成员帮助下,完成数据库的开发.博客地址 郑珍发:参与Android前端开发,主

第03组 团队项目-需求分析报告

一.组队后的团队项目的整体计划安排 项目阶段 阶段时间 主要阶段任务 完成情况 前期准备 9.22-10.11 确定选题及成员分工.完成基础学习及前期准备工作 已完成 10.12-10.18 进一步细化分工.设计项目logo.完成选题报告 已完成 10.19-10.25 通过别组提问改进项目功能计划.完成原型设计及界面设计初稿 已完成 团队编程 10.26-11.2 团队编程及前期准备工作 待完成 alpha冲刺 11.3-11.11 实现基础功能.改进界面.完成alpha冲刺前期准备 待完成

第3组 团队项目-需求分析报告

一.组队后的团队项目的整体计划安排 项目阶段 阶段时间 主要阶段任务 完成情况 前期准备 9.22-10.11 确定选题及成员分工.完成基础学习及前期准备工作 已完成 10.12-10.18 进一步细化分工.设计项目logo.完成选题报告 已完成 10.19-10.25 通过别组提问改进项目功能计划.完成原型设计及界面设计初稿 已完成 团队编程 10.26-11.2 团队编程及前期准备工作 待完成 alpha冲刺 11.3-11.11 实现基础功能.改进界面.完成alpha冲刺前期准备 待完成

软件工程团队项目总结

一学期软件工程课结束了,这学期我们共做了三个项目,分别为个人项目.结对项目.以及团队大项目.前两者主要是拿来练手,体会一下简单的软件工程方法论,而结对项目前后历时两个多月,可以说是一次系统的软件工程锻炼,下面对两个迭代过程做一个总结. M1: 我们完成了什么:一个社团平台,给同学提供一个浏览社团活动的活动广场,给社团提供一个管理社员报名和发送通知的集成服务. 我们怎样做到的:需求分析,设想我们的产品的用户场景,建立基本的ER图模型,学习WEB开发的基本知识,做了一些DEMO,学习怎样以基于aja

团队项目:开发模式及代码管理

本次团队项目我们有意无意地使用了主治医师模式,即由一到两个主程序员进行游戏风格,整体框架的设计,实现较为核心的内容,其他人的工作都围绕主程序员展开.说是有意无意是因为该项目利用Unity游戏引擎进行开发,而当时组里只有两人对Unity引擎较为熟悉,其他人在一边学习的同时先进行外围的工作,之后逐渐加入核心的实现. 比较遗憾的是目前我们的项目缺乏代码管理.由于采用Unity引擎开发,无法上传github进行托管,我们寻找了其他的管理工具但由于付费等原因效果不太理想.我们的代码都保存在每个人的电脑中,

用Java实现MVPtree——MVPtree核心算法代码的搭建

项目需要,需要把MVPtree这种冷门的数据结构写入Java,然网上没有成形的Java实现,虽说C++看惯了不过对C++实现复杂结构也是看得蒙蔽,幸好客户给了个github上job什么的人用Java写的VPtree,大体结构可以嵌入MVPtree. 对于MVPtree的其他信息请左转百度= =本文只讲述算法实现. 点查找树结构主要需解决的问题有2个:如何减少非必要点的搜索,以及如何减少距离计算次数.前者的解决方法比较容易想到,把点集分割为左右对称的两半长方形,或者脑洞大点的,通过距离切分(效率很

团队项目推荐:手机社交照片管理软件——by Zhaofan

我们来到微软亚洲研究院做实习已经超过一个半月的时间,逐渐熟悉了这里的环境和氛围,也终于逐渐开始了我们在这里的课程.作为高级软件工程(ASE)的重头戏,由一个小组同学共同完成的团队项目,无疑将会是我们接下来几个月学习与工作的重心.在上周二的ASE课中,我们了解了这个课程的安排与要求,并完成了组队.经过课后的思考与初步调研,我推荐“手机社交照片管理软件”作为我们团队项目的题目. 在社交媒体爆发式发展的今天,通过社交媒体分享自己的经历已经成为许多人日常生活的一部分.在众多的社交媒体的类别中,分享照片无