曲がったパーツを一定の幅を持った四角形に納まるように分割する

# はじめに
かんじさんのツイートのお題が面白そうなので Rhinocros + Grasshopperでチャレンジしてみた

https://twitter.com/kanjipon/status/1594931823582531587?s=20&t=pu4RPdqQWH3-u17t85xx6Q

# 前提の整理
対称となるパーツは基準となるカーブがあり左右に60mmオフセットした幅120mmの曲線材と考える。
そのパーツを分割して幅200の板から作成することを考える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/a8e05565-d3d7-eab3-310a-645068c53689.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/474ff1b0-7242-951c-b4ae-b24add186e92.png)
（画像はかんじさんの投稿から引用）

# まず２分割して必要な板幅を考える

Shatter で基準カーブから二つに分割する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/3d0b5d23-e9e8-0638-ae7f-9b0d4d56ae29.png)


取り出したカーブの始点・終点を結ぶ直線をX軸としたPlaneを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/41628539-4d47-4b92-dccf-3ca1adb21823.png)

取り出したカーブを左右に60mmオフセットする。そこに Divide Curve で適当な数（ここでは20個）の点を作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/7f8d6735-3666-b90a-e564-9352479277d9.png)

Plane Coordinates > Bounds > Number をつなげて必要な板長さと板幅を求める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/086a784d-f9dd-584c-5ad2-df2f023a656c.png)

Rectangle で四角形を書き Text Tag で寸法を表示した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b7d6f26b-ebdf-bb32-0fca-3f21319f6c01.png)

# Galapagosで最適化してみる
板幅の最大値を計算してGalapagosのFitnessをつなげる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/dfe9860b-cf49-239a-6b55-716b50bb8921.png)
Genomeは最初に作成したスライダーに接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/147bfd0f-16d4-2fab-5b94-f3517d7ce75e.png)

Galapagos Editor内のOptionタブでFitnessはMinimizeに設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b72a189b-7d99-768e-f166-a83a99346c1a.png)

SolversタブのStart Solverで最適化を始める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/d5ac3c7b-d2d6-46b5-a5e5-41218ec58527.png)
残念ながら２分割では板幅200mmには納まらなかった

# 分割数を増やしてみる
SliderではなくGene Poolをつないだ。Gene Count は2にするとカーブが３分割される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/c9e8f0db-c268-66b2-bd7e-766f455bd8d5.png)

GalapagosのGenomeの接続先をGene Poolに変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/45ac98c5-5091-4ad5-55fd-68fe0bfece4b.png)

最適化を実行。3分割でも板幅は200mmには納まらなかった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/aa43f552-459b-e916-62d8-dbb699c0bfde.png)

Gene Count を3にして4分割で最適化を実行。ぎりぎり板幅200mmに納まった！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/2ab864f1-ecb3-9c5c-cd41-ac70c5fcb6a9.png)

# 分割数を自動で決められないかを考えてみる
Gene PoolのGene Count を10に増やす。切断数というSliderとSplit List を追加してGene Poolの値をいくつ取り出すかを変えられるようにした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/70801d6d-4f81-4b43-ae42-201590e35405.png)
板幅の制限値を超えていないかという評価と切断数が少ないほど良いという評価を考慮した式をこんな感じに設定してみた。このあたりの式や係数を考えるのは試行錯誤が結構必要な感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b27b5e3b-aa9b-b7ba-c248-30a9772e4f52.png)

最適化を実行したら5分割になった。手動で分割数を決めたときは4分割だったので多くなっている。手間なく分割数を決められることを良しとするかギリギリまで攻めることを良しとするかで選べば良さそう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/4b921560-983e-4c5f-fc2d-56ff1ef0ab40.png)

# まとめ
作成したGrasshopperの全体像はこちら
かんじさん楽しいお題をありがとうございました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/fefcccde-73cc-cd01-6be8-ddf53d61d896.png)