NCF参数化建筑论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 51894|回复: 21
打印 上一主题 下一主题

[建模练习] 新开坑,关于OpenMesh基本算法

  [复制链接]
跳转到指定楼层
1m
发表于 2013-8-30 00:12:41 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
开大川最近写python教材。顺便也写点东西来烘托下气氛,拉点人气。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享分享
22m
发表于 2014-2-14 12:54:32 | 只看该作者
感谢楼主分享,赞!
21m
 楼主| 发表于 2013-9-1 03:24:09 | 只看该作者
20m
发表于 2013-9-1 01:24:15 | 只看该作者

学长 求带!
19m
发表于 2013-8-31 21:50:20 | 只看该作者
claudemit 发表于 2013-8-31 20:07
我们都等着念完小学呢~

同学 你好
18m
发表于 2013-8-31 20:07:07 | 只看该作者
wdc63 发表于 2013-8-30 15:57
哈哈,先学完我的教程再来看潘神的,我的是小学教程,潘神这个是研究生教材

我们都等着念完小学呢~
17m
发表于 2013-8-31 01:09:44 | 只看该作者
向楼猪学习~~~~~~~~~~~~~~~
16m
发表于 2013-8-30 19:24:30 | 只看该作者
果断顶起来学习啊
15m
 楼主| 发表于 2013-8-30 18:10:22 | 只看该作者
claudemit 发表于 2013-8-30 01:51
进来膜拜潘神
粘贴到网页,所有【i】都丢了。。。

选择性粘贴不行么?
14m
发表于 2013-8-30 15:57:47 | 只看该作者
zhiaixu2010 发表于 2013-8-30 14:55
潘神要不要这样啊,看看大川写得多通俗啊,直接这么阳春白雪,受不鸟啊...

哈哈,先学完我的教程再来看潘神的,我的是小学教程,潘神这个是研究生教材
13m
发表于 2013-8-30 15:20:24 | 只看该作者
说要来吐槽,我就来了。。。反正意思大概明白,代码一点不懂,大概就是这样啦,(没办法啦,机子水,人也水,只能过来路过一下啦~,手工穷举法的穷逼路过)
12m
发表于 2013-8-30 14:55:22 | 只看该作者
潘神要不要这样啊,看看大川写得多通俗啊,直接这么阳春白雪,受不鸟啊...
11m
发表于 2013-8-30 11:29:58 | 只看该作者
Open mesh 是啥?
10m
发表于 2013-8-30 09:15:16 | 只看该作者
哇哦
好神啊……程序就看不懂了……
9m
发表于 2013-8-30 08:52:44 | 只看该作者
最近学习氛围好浓
8m
发表于 2013-8-30 08:29:00 | 只看该作者
大神的语言果然看不太懂啊……
7m
发表于 2013-8-30 01:51:34 | 只看该作者
本帖最后由 claudemit 于 2013-8-30 02:27 编辑

进来膜拜潘神
粘贴到网页,所有【i】都丢了。。。
6m
发表于 2013-8-30 01:20:19 | 只看该作者
带点图啊喂看不懂啊
5m
 楼主| 发表于 2013-8-30 01:02:55 | 只看该作者
本帖最后由 panhao1 于 2013-8-30 01:08 编辑

RhinoC# Script案例
private void RunScript(Mesh x, double y, ref object A, ref object B)
{ try{
List<int> mapping = new List<int> ();
List<Point3d> ps = new List<Point3d>();
List<int> MapCount = new List<int> ();

ps.Add(x.Vertices[0]);mapping.Add(0);MapCount.Add(1);
for(int j = 1;j < x.Vertices.Count;j++) {
bool sign = true;
for(int i = 0;i < ps.Count;i++){
if(ps.DistanceTo((Point3d) x.Vertices[j]) < y){
sign = false;mapping.Add(i);
ps += (Point3d) x.Vertices[j];//这样直接加是错误的。应该是做个index备份。不然就会导致新的vertex失效

//添加 ps/=2;(懒人的修复方法)。
MapCount++;
break;}
}
if(sign){mapping.Add(ps.Count);ps.Add(x.Vertices[j]);MapCount.Add(1);}
}

for(int i = 0;i < ps.Count;i++){
ps /= MapCount;//注释掉(懒人修复方法)
}

Mesh mesh = new Mesh();
for(int i = 0;i < ps.Count;i++){
mesh.Vertices.Add(ps);
}


for(int i = 0;i < x.Faces.Count;i++){
if(x.Faces.IsQuad){
int p1 = mapping[x.Faces.A];
int p2 = mapping[x.Faces.B];
int p3 = mapping[x.Faces.C];
int p4 = mapping[x.Faces.D];
if( noRepeat(p1, p2, p3, p4)){
mesh.Faces.AddFace(p1, p2, p3, p4);
}
}
if(x.Faces.IsTriangle){
int p1 = mapping[x.Faces.A];
int p2 = mapping[x.Faces.B];
int p3 = mapping[x.Faces.C];
if( noRepeat(p1, p2, p3)){
mesh.Faces.AddFace(p1, p2, p3);
}
}
}
mesh.Normals.ComputeNormals();
mesh.Compact();
A = mesh;B = MapCount;
}catch(Exception ex){
Print(ex.ToString());

}
}

//<Custom additional code>
bool noRepeat(int a1, int a2, int a3, int a4){
if(a1 == a2)return false;
else if(a1 == a3)return false;
else if(a1 == a4)return false;
else if(a2 == a3)return false;
else if(a2 == a4)return false;
else if(a3 == a4)return false;
else return true;
}
bool noRepeat(int a1, int a2, int a3){
if(a1 == a2)return false;
else if(a1 == a3)return false;
else if(a2 == a3)return false;
else return true;
}

4m
 楼主| 发表于 2013-8-30 01:01:15 | 只看该作者
ps
1关于如何剔除重复点 。最简单的就是两次循环匹配了 (<O2复杂度).
2 每次如果一个新vertex被>2次匹配的话需要刷新一下位置。新位置换算为被此vertex索引的全部vertices的平均位置。当然其实不做换算直接忽视新加vertex的位置也是可行的(一直用第一个vertex的位置,最后一起来做平均)。因为tolerance一般是破洞半径的10倍以上。如果实时换算vertex的位置的话,就可以省了第6步。

小黑屋|手机版|NCF参数化建筑论坛 ( 浙ICP备2020044100号-2 )    辽公网安备21021102000973号

GMT+8, 2024-11-26 02:39 , Processed in 0.086362 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表