3dContactPointAnnotationTool开发日志(十五)
有时候拖动一个窗口的时候可能直接拖出去了那就再也拖不回来只能reset重新来过:

于是开了个类成员变量在start里记录了一下panel的位置:
var lp = panel.GetComponent<RectTransform>().localPosition;
localPosition = new Vector2(lp.x,lp.y);
在OnClick中将其复原:
panel.GetComponent<RectTransform>().localPosition = localPosition;
这样再点击对应的按钮就能复原panel的位置了!
那个坐标轴我都放到原点了为啥还要放到相机里当儿子,为自己感到智商捉急。

也许使用者不想看见这个丑陋的坐标轴,于是我又添加了按钮A来控制它是否显示。

换了一种计算接触点的方法,枚举选中物体和未选中物体的三角面片,各自生成与x、y、z轴平行的包围盒然后算包围盒的相交部分,再生成x、y、z缩放比例与相交部分对应的不规则球,复杂度是三角面片数量的平方的,效果如下:

很明显的缺陷就是如果三角形太大并且不平行坐标轴就会导致较大误差,就像这样:

如果接触点过多会导致异常的卡,上图有1w多个接触点,就很卡了。
想让结果更精确就得将三角形划分得更细致,于是又得弄个slider让用户能控制一个物体三角面片的数量。
划分三角形的时候我每次都找最长边最长的三角形进行划分,在最长边上取个中点然后和该边所对顶点一连线就成了两个小三角形。本来想用堆来维护的,但是发现捉急的c#没有优先队列这个玩意,难不成还得手写一个?
网上搜了搜,发现一个叫作sortedList的东西貌似可以用用。
写完之后运行才发现这货不能有重复键的点,被坑了。。

魔高一尺道高一丈,网上还是有解决不能有重复键的方法,那就是自定一个类,顺便学会了c#如何比较自定义的类的两个实例的大小,具体请看C# SortedList 可重复键的排序键/值对集合。
然而用了这个方法GetByIndex方法就消失了,真是神奇得可怕,搞得我只能让它从大到小排序然后用GetEnumerator方法来访问第一个元素,再用removeAt(0)删除第一个元素了。
然后发现sortedlist插入移除复杂度竟然是O(n)的,真是****....不过人家的名字都带list了你还以为它效率能高到哪里去?真是太天真了。
貌似sortedDictionary是个不错的替代品。唉,当初自己手写队列早就弄完了,还会用这些渣渣封装数据结构?不过我竟然会对这些鬼东西感兴趣,所以还是了解一下吧。各集合类型的性能分析请看C#集合类型总结和性能分析
当然为了用到sortedDictionary的Remove函数,比较类要写成这样:
public class CostComparer:IComparer<Cost>
{
public int Compare(Cost x,Cost y)
{
if (x.cost == y.cost && x.id == y.id)
return 0;
if (x.cost < y.cost||(x.cost==y.cost&&x.id<y.id))
return 1;
else
return -1;
}
}
之前少了第一个if导致一直remove失败,现在终于好了!
还有就是要取到第一个元素得这么写,不要少了moveNext,否则取到的啥都没有:
var e = sd.GetEnumerator();
e.MoveNext();
var ec = e.Current;
int[] triangle = ec.Value;//取最长边最长的三角形进行划分
终于过编译了,来看看效果。先是1倍三角形:

接下来就是见证奇迹的时刻:

瞬间爆炸,不知道哪里写萎了,不过已经搞到晚上10点钟了,明天再接着找bug吧,因为欢乐时光就要开始了!
3dContactPointAnnotationTool开发日志(十五)的更多相关文章
- 3dContactPointAnnotationTool开发日志(五)
今天要做的第一件事就是把obj文件里不同的对象分割开来. 通过仔细观察发现obj文件中以"o "开头的行会跟着一个对象的名字.g代表对象所属组名,我这里只要用到对象名就行了 ...
- 仿酷狗音乐播放器开发日志十九——CTreeNodeUI的bug修复二(附源码)
转载请说明原出处,谢谢 今天本来打算把仿酷狗播放列表的子控件拖动插入功能做一下,但是仔细使用播放列表控件时发现了几个逻辑错误,由于我的播放 列表控件是基于CTreeViewUI和CTreeNodeUI ...
- 3dContactPointAnnotationTool开发日志(三十)
在vs2017里生成opencv时遇到了无法打开python27_d.lib的问题,具体解决请看这个,不过我用的是方法2,python37_d.lib找不到同理. Windows下可以用的op ...
- 3dContactPointAnnotationTool开发日志(二五)
记录一下当前进度:
- 3dContactPointAnnotationTool开发日志(二十)
为了使工具更人性化,我又在每个status的text上绑了个可以拖拽实现值改变的脚本,但是不知道为啥rotx那个值越过+-90范围后连续修改就会产生抖动的现象,试了很多方法也没能弄好,不过实际用起 ...
- 3dContactPointAnnotationTool开发日志(十九)
增加了输出接触点信息到文件功能.
- 3dContactPointAnnotationTool开发日志(十八)
今天实现了tab效果,按tab键可以在status面板的各个输入框内来回切换,参考Unity3D - UGUI实现Tab键切换输入框.按钮(按Tab键切换高亮显示的UI)
- 3dContactPointAnnotationTool开发日志(十六)
调了一上午才发现是把下面这个函数: private float DivideTriangle(int []triangle,out int []outTriangle,List<Vector ...
- 3dContactPointAnnotationTool开发日志(十四)
貌似每次让用户手动输入文件路径太不人道了,于是参考Unity 实用教程 之 调用系统窗口选择文件或路径增加了让用户浏览文件的功能,点击输入框旁边的+就可以找到文件并加载进来: 貌似调整位置再计 ...
随机推荐
- ubuntu16.04 64位安装tftp服务器
1.安装tftpd-hpa和xinetd sudo apt-get install tftpd-hpa xined2.针对64位操作系统安装openbsd-inetd apt-get install ...
- linux——制作本地yum源
1. 将windows系统中的linux镜像插入到linux系统的光驱中 2. 将光驱挂载到一个挂载点 3. 清缓存:yum clean all 4. 修改配置文件 /etc/yum.repos.d/ ...
- VMware中Linux的NAT相关配置
我这边使用的是CentOS7,因为搭建环境主要是为了后期做集群,所以会搭建三台机器master,slave1,slave2. 一.设置固定IP 1. 进入到/etc/sysconfig/network ...
- SQL 备忘录
都兼容 MySQL 查看表结构:DESC ${table_name} 查看建表语句:SHOW CREATE TABLE ${table_name} 表增加列:ALTER TABLE ${table_ ...
- 为 ItemsControl 类型的控件提供行号,mvvm模式 绑定集合
从网络上看到的两种方式,一种是,在 codebehind 里为 控件写事件,下面是将集合绑定到 DataGrid 控件: private void DataGridSoftware_LoadingRo ...
- PPAS下安装 pg_stat_statements过程记录
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL统计信息索引页 回到顶级页面:PostgreSQL索引页 PostgreSQL中,如何安装pg_stat_sta ...
- FreeRTOS的信号量和互斥量
1. 理解如下,言简意赅的说,信号量解决同步,互斥量解决竞争. 信号量用于同步,主要任务间和中断间同步:互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁. 互斥量具有优先级继承,信 ...
- 图片文件转换成Base64编码实现ajax提交图片
//上传头像图片 function uploadHead(imgPath) { console.log("imgPath = " + imgPath); var image = n ...
- ServletContext详解 以及用法
ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而servletContext,所 ...
- 根据wsdl生成服务端代码
场景描述 最近在和一家公司做业务接口对接,由他们那边回调我们这边,对方直接扔过来一个webservice的wsdl文件,让我们按照他们的规范来做webservice服务, 大多数的对接应该是我们创建完 ...