上一节我们帮唐*刚大哥做了个随机贴图的插件。 大哥给我们科普了四色定理的概念, 表示想要随机贴图的同时, 能得到符合四色定理的材质分布效果。 这周末, 我们的技术小可爱们也是很给力地完成了突破。
随机贴图2.0-四色原理▼
我们来回顾一下什么是四色原理/四色猜想: 同一个二次平面内, 只需要四种颜色就可以区分开不同的板块。
随机贴图的思路见上一节:
在原先的基础上, 我们只需在给当前面贴图的时候, 保证当前面的材质和相邻面的颜色不一样即可。
思路分析- 如何获取当前面的相邻面
- 收集到的材质中剔除相邻面的材质
1、获取当前面的相邻面▼ 如上图: 面A的相邻面是:A1、A2、A3、A4 面B的相邻面是:B1、B2、B3 面C的相邻面是:C1、C2
先获取当前面的四条边, 再获取四条边共边的面。 演示代码: model = Sketchup.active_model
sel = model.selection
sel.each do |e|
next unless e.is_a? Sketchup::Face
# 获取当前面的边
face_edges = e.edges
# 存储当前面周边的面
connectes_faces = []
face_edges.each do |i|
# 获取当前边面
connectes_faces += i.faces
# 删去掉当前面
connectes_faces.delete(e)
end
# 演示一下把相邻面选中
sel.add connectes_faces
end
2、收集相邻面的材质▼ 回忆一下随机贴图插件获取材质的逻辑, 对应代码: model = Sketchup.active_model
# 获取有材质属性的对象
entities = model.selection.select { |e| e.respond_to?(:material) }
# 获取有材质的属性的对象的材质
materials = entities.map(&:material).uniq.compact
收集相邻面的材质, 并在将要给当前面随机抽取的材质库中剔除当前相邻面的材质。 对应代码: # 获取材质逻辑
# ......
entities.each do |e|
# 拷贝一份材质,不影响最初的材质库
copy_materials = materials.dup
# 获取相邻面逻辑
#......
# 获取周边面的材质
connected_face_materials = []
connectes_faces.each do |j|
connected_face_materials << j.material if j.material
end
# 去
connected_face_materials = connected_face_materials.uniq.compact
# 剔除掉周边面的材质,保证不会有相邻面材质一致
copy_materials -= connected_face_materials
e.material = copy_materials.sample
end
总结本次的核心思路就是在给每一个面赋予材质的同时, 和相邻面的材质做对比,保证和相邻面不一样即可。 本次的难点是如何获取当前面的相邻面, 前面还尝试了face.all_connected 等方法去获取相邻面,都行不通。
所以接口文档还是要反复细读, 才会在短时间内想到多种实现思路。
公众号回复 四色定理 获取插件: SU自动化实战相关文章推荐: SU自动化探索相关文章推荐:
SU插件开发相关文章推荐:
|