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 实用教程 之 调用系统窗口选择文件或路径增加了让用户浏览文件的功能,点击输入框旁边的+就可以找到文件并加载进来: 貌似调整位置再计 ...
随机推荐
- xp sp3安装.Net 4.0提示严重错误,0x80070643,解决办法2017版
客户电脑上要装金税开票软件,需要.net 4.0.30319.1,电脑环境是xp sp3,已经安装了.net 2, .net 3.5sp1,安装.net 4.0的时候提示错误0x80070643 因为 ...
- Java常用容器对比
ArrayList与Vector ArrayList和Vector内部都是由数组实现的,数组实现的优点就是支持元素的随机访问(O(1)),但是在对元素进行插入和删除操作时,需要向后或向前移动数组,这样 ...
- 使用 win10 的库来组织自己的同类文件
库相当于虚拟目录,可以把不同的文件夹包含起来. 找起东西来不用东奔西跑了...
- 【NXP开发板应用—智能插排】1.如何使用scp传输文件
首先感谢深圳市米尔科技有限公司举办的这次活动并予以本人参加这次活动的机会,以往接触过嵌入式,但那都是皮毛,最多刷个系统之类的,可以说对于嵌入式系统开发这件事情是相当非常陌生的,这次活动为我提供了一个非 ...
- day 4 飞机大战-面向对象
1.飞机类 #-*- coding:utf-8 -*- import pygame import time from pygame.locals import * class HeroPlane(ob ...
- LeetCode: 31. Next Permutation (Medium)
1. 原题链接 https://leetcode.com/problems/next-permutation/description/ 2. 题目要求 给出一个整型数组,让我们给出下一个排序情况.注意 ...
- MyBatis-MBG(MyBatis Generator)
1.添加jar包 <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>m ...
- 围绕DOM元素节点的增删改查
HTML 文档中的所有内容都是节点: 整个文档是一个文档节点 document 每个 HTML 元素是元素节点 element HTML 元素内的文本是文本节点 每个 HTML 属性是属性节点 注释是 ...
- 程序迭代时测试操作的要点(后端&前端)
今晚直播课内容简介,视频可点击链接免费听 <程序迭代时测试操作的要点(后端&前端)> ===== 1:迭代时后台涉及的操作有哪些?如何进行 a.更新war包:用于访问web\app ...
- Git 新建文件并提交
1.创建一个readme.txt. cd /home/cyp/learngit touch readme.txt vim readme.txt 编写内容, wq 保存推出 2.提交步骤 2.1 gi ...