🌓
搜索
 找回密码
 立即注册

SketchUp的自动化实战 (四)四色定理

朴璐美cn 2022-8-24 13:33:01 65710

上一节我们帮唐*刚大哥做了个随机贴图的插件。

大哥给我们科普了四色定理的概念,

表示想要随机贴图的同时,

能得到符合四色定理的材质分布效果。

这周末,

我们的技术小可爱们也是很给力地完成了突破。


随机贴图2.0-四色原理

Xb3zQKU3lDLR92Ru.jpg


我们来回顾一下什么是四色原理/四色猜想

同一个二次平面内,

只需要四种颜色就可以区分开不同的板块。


mSTM1wMsS6M910AG.jpg



随机贴图的思路见上一节:


在原先的基础上,

我们只需在给当前面贴图的时候,

保证当前面的材质和相邻面的颜色不一样即可。


思路分析

  • 如何获取当前面的相邻面
  • 收集到的材质中剔除相邻面的材质

1、获取当前面的相邻面

JbhxAh5qzS58g08b.jpg

如上图:
面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等方法去获取相邻面,都行不通。


所以接口文档还是要反复细读,

才会在短时间内想到多种实现思路。


公众号回复 四色定理 获取插件:

ClMLpfE7mL22IFkF.jpg
SU自动化实战相关文章推荐:
SU自动化探索相关文章推荐:


SU插件开发相关文章推荐:

扫一扫

0 回复

高级模式
游客
返回顶部