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 实用教程 之 调用系统窗口选择文件或路径增加了让用户浏览文件的功能,点击输入框旁边的+就可以找到文件并加载进来: 貌似调整位置再计 ...
随机推荐
- Django时间时区问题
在django1.4以后,存在两个概念 naive time 与 active time. 简单点讲,naive time就是不带时区的时间,Active time就是带时区的时间. 举例来说,使用d ...
- (数据科学学习手札44)在Keras中训练多层感知机
一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...
- C++中引用的本质分析
引用的意义 引用作为变量别名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 swap函数的实现对比: void swap(int* a, int* b) { int t ...
- Sql Server char、varchar、nchar、nvarchar的区别
(1) 定义: char: 固定长度,存储ANSI字符,不足的补英文半角空格. nchar: 固定长度,存储Unicode字符,不足的补英文半角空格 varchar: 可变长度,存储ANSI字符,根据 ...
- mac, start sublime from terminal
1.where is sublime CLI /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl 2. run sublime ...
- 【转载】COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM
原文:COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM 原文:http://www.codeproject.com/Articles/633/Introduction-to-CO ...
- Spring源码分析——JdbcTemplate执行批量insert操作
最近用到一个方法: @Override public int[] batchUpdate(String sql, final BatchPreparedStatementSetter pss) thr ...
- Android7.0 应用内升级
Android7.0应用内升级 最近线上项目在7.0机器上出现应用内升级失败,原来是由于Android7.0权限问题导致. 如果项目的 targetSdkVersion>=24 在处理应用内升级 ...
- 关于BLOB/TEXT字段存储设计及性能的简单研究
简单研究了一下BLOB/TEXT字段对数据库性能的影响,得到一个大概的结论:(未验证) 无论MySQL还是MSSQL,都可以通过把BLOB/TEXT数据存储在行外的方式提高性能 把BLOB/TEXT字 ...
- 「日常训练」 Longest Run on a Snowboard (UVA-10285)
题意 其实就是一条二维的LIS,但是还是做的一愣一愣的,多努力. 考虑$dp[i][j]$为从(i,j)出发的二维LIS的最大值,那么$dp[i][j]=max\{dp[i−di[k]][j−dj[k ...