各ピースの凹凸のはめあいが整って、しかも、できるだけ同じピースが生じないようにピースのパターンを作成します。
参考にしたのは画像処理ソフトのGIMPのジグソーパターン作成フィルターです。GIMPで作成したパターンはそれらしく見えるものですが、6種類しかないので同じ形状のピースがたくさんあります。GIMP内部での処理は分かりませんが、単純にランダムに凹凸を配置しているようです。
市販のジグソーパズルはほとんど同じ形のピースは含まれていないらしいので、このプログラムでは1辺について凹が-6~-1、凸が1~6の合計12種類のパターンから割り当ててピースの種類を飛躍的に増やしたいと思います。
今回作るのはピースの配置を設計するプログラム、すなわち、1個1個のピース図形を描くための仕様書を作成するプログラムです。
プログラムはProcessingで作りました。Processingは図形描画が得意で、pdfに出力する機能があるということなのでレーザーカッターの切断図形をつくることができそうです。
int [][] h_up;
int [][] h_right;
int [][] h_down;
int [][] h_left;
int size_row=3;
int size_column=4;
void setup() {
h_up= new int[size_column+1][size_row+1];
h_right= new int[size_column+1][size_row+1];
h_down= new int[size_column+1][size_row+1];
h_left= new int[size_column+1][size_row+1];
for (int y =0; y < size_row +1; y++){
for (int x =0; x < size_column +1; x++){
h_up[x][y]= 0;
h_right[x][y]= 0;
h_down[x][y]= 0;
h_left[x][y]= 0;
}
}
noLoop(); // Run once and stop
}
void draw(){
for (int y =1; y < size_row +1; y++){
for (int x =1; x < size_column +1; x++){
if(h_down[x][y-1]== 0){
h_up[x][y]= random_head();
}
else{
h_up[x][y]= -1 * h_down[x][y-1];
}
if(h_right[x-1][y]== 0){
h_left[x][y]= random_head();
}
else{
h_left[x][y]= -1 * h_right[x-1][y];
}
h_right[x][y]= random_head();
h_down[x][y]= random_head();
println (h_up[x][y],h_right[x][y],h_down[x][y],h_left[x][y]);
}
}
}
int random_head(){
//int head;
int head = floor(random(0,12));
if(head==12){
head=11;
}
if(head<=5){
head = head-6;
}
else{
head = head -5;
}
return head;
}
参考にしたのは画像処理ソフトのGIMPのジグソーパターン作成フィルターです。GIMPで作成したパターンはそれらしく見えるものですが、6種類しかないので同じ形状のピースがたくさんあります。GIMP内部での処理は分かりませんが、単純にランダムに凹凸を配置しているようです。
市販のジグソーパズルはほとんど同じ形のピースは含まれていないらしいので、このプログラムでは1辺について凹が-6~-1、凸が1~6の合計12種類のパターンから割り当ててピースの種類を飛躍的に増やしたいと思います。
今回作るのはピースの配置を設計するプログラム、すなわち、1個1個のピース図形を描くための仕様書を作成するプログラムです。
プログラムはProcessingで作りました。Processingは図形描画が得意で、pdfに出力する機能があるということなのでレーザーカッターの切断図形をつくることができそうです。
int [][] h_up;
int [][] h_right;
int [][] h_down;
int [][] h_left;
int size_row=3;
int size_column=4;
void setup() {
h_up= new int[size_column+1][size_row+1];
h_right= new int[size_column+1][size_row+1];
h_down= new int[size_column+1][size_row+1];
h_left= new int[size_column+1][size_row+1];
for (int y =0; y < size_row +1; y++){
for (int x =0; x < size_column +1; x++){
h_up[x][y]= 0;
h_right[x][y]= 0;
h_down[x][y]= 0;
h_left[x][y]= 0;
}
}
noLoop(); // Run once and stop
}
void draw(){
for (int y =1; y < size_row +1; y++){
for (int x =1; x < size_column +1; x++){
if(h_down[x][y-1]== 0){
h_up[x][y]= random_head();
}
else{
h_up[x][y]= -1 * h_down[x][y-1];
}
if(h_right[x-1][y]== 0){
h_left[x][y]= random_head();
}
else{
h_left[x][y]= -1 * h_right[x-1][y];
}
h_right[x][y]= random_head();
h_down[x][y]= random_head();
println (h_up[x][y],h_right[x][y],h_down[x][y],h_left[x][y]);
}
}
}
int random_head(){
//int head;
int head = floor(random(0,12));
if(head==12){
head=11;
}
if(head<=5){
head = head-6;
}
else{
head = head -5;
}
return head;
}
#
by ogal_lab
| 2015-11-26 21:28
| レーザーカッター