optigami_ / lib /patterns.ts
sissississi's picture
Deploy full Next.js origami simulator to HF Space
b40f1ec
export type CreaseType = 'mountain' | 'valley' | 'flat';
export interface CreaseDef {
edge: [number, number];
type: CreaseType;
}
export interface Pattern {
id: string;
name: string;
vertices: [number, number][];
faces: [number, number, number][];
creases: CreaseDef[];
}
export const patterns: Pattern[] = [
{
id: 'simple',
name: 'Simple Valley Fold',
vertices: [
[-1, 1], [1, 1],
[-1, 0], [1, 0],
[-1, -1], [1, -1]
],
faces: [
[0, 2, 3], [0, 3, 1],
[2, 4, 5], [2, 5, 3]
],
creases: [
{ edge: [2, 3], type: 'valley' }
]
},
{
id: 'accordion',
name: 'Accordion Fold',
vertices: [
[-1, 1], [-0.5, 1], [0, 1], [0.5, 1], [1, 1],
[-1, -1], [-0.5, -1], [0, -1], [0.5, -1], [1, -1]
],
faces: [
[0, 1, 6], [0, 6, 5],
[1, 2, 7], [1, 7, 6],
[2, 3, 8], [2, 8, 7],
[3, 4, 9], [3, 9, 8]
],
creases: [
{ edge: [1, 6], type: 'valley' },
{ edge: [2, 7], type: 'mountain' },
{ edge: [3, 8], type: 'valley' }
]
},
{
id: 'waterbomb',
name: 'Waterbomb Base',
vertices: [
[-1, 1], [0, 1], [1, 1],
[-1, 0], [0, 0], [1, 0],
[-1, -1], [0, -1], [1, -1]
],
faces: [
[0, 1, 4], [1, 2, 4],
[2, 5, 4], [5, 8, 4],
[8, 7, 4], [7, 6, 4],
[6, 3, 4], [3, 0, 4]
],
creases: [
{ edge: [0, 4], type: 'valley' },
{ edge: [2, 4], type: 'valley' },
{ edge: [6, 4], type: 'valley' },
{ edge: [8, 4], type: 'valley' },
{ edge: [1, 4], type: 'mountain' },
{ edge: [3, 4], type: 'mountain' },
{ edge: [5, 4], type: 'mountain' },
{ edge: [7, 4], type: 'mountain' }
]
},
{
id: 'preliminary',
name: 'Preliminary Fold (Square Base)',
vertices: [
[-1, 1], [0, 1], [1, 1],
[-1, 0], [0, 0], [1, 0],
[-1, -1], [0, -1], [1, -1]
],
faces: [
[0, 1, 4], [1, 2, 4],
[2, 5, 4], [5, 8, 4],
[8, 7, 4], [7, 6, 4],
[6, 3, 4], [3, 0, 4]
],
creases: [
{ edge: [0, 4], type: 'mountain' },
{ edge: [2, 4], type: 'mountain' },
{ edge: [6, 4], type: 'mountain' },
{ edge: [8, 4], type: 'mountain' },
{ edge: [1, 4], type: 'valley' },
{ edge: [3, 4], type: 'valley' },
{ edge: [5, 4], type: 'valley' },
{ edge: [7, 4], type: 'valley' }
]
},
{
id: 'miura',
name: 'Miura-ori (2x2)',
vertices: [
[-1, 1], [0, 1.2], [1, 1],
[-1, 0], [0, 0.2], [1, 0],
[-1, -1], [0, -0.8], [1, -1]
],
faces: [
[0, 1, 4], [0, 4, 3],
[1, 2, 5], [1, 5, 4],
[3, 4, 7], [3, 7, 6],
[4, 5, 8], [4, 8, 7]
],
creases: [
{ edge: [1, 4], type: 'mountain' },
{ edge: [4, 7], type: 'mountain' },
{ edge: [3, 4], type: 'valley' },
{ edge: [4, 5], type: 'mountain' }
]
},
{
id: 'bird_base',
name: 'Bird Base',
vertices: [
[-1, 1], [0, 1], [1, 1],
[-1, 0], [0, 0], [1, 0],
[-1, -1], [0, -1], [1, -1],
[-0.5, 0.5], [0.5, 0.5], [-0.5, -0.5], [0.5, -0.5]
],
faces: [
[0, 9, 3], [0, 1, 9], [1, 4, 9], [3, 9, 4],
[1, 10, 4], [1, 2, 10], [2, 5, 10], [4, 10, 5],
[3, 4, 11], [3, 11, 6], [6, 11, 7], [4, 7, 11],
[4, 5, 12], [5, 8, 12], [8, 7, 12], [4, 12, 7]
],
creases: [
{ edge: [1, 4], type: 'mountain' },
{ edge: [3, 4], type: 'mountain' },
{ edge: [5, 4], type: 'mountain' },
{ edge: [7, 4], type: 'mountain' },
{ edge: [0, 9], type: 'valley' },
{ edge: [9, 4], type: 'valley' },
{ edge: [2, 10], type: 'valley' },
{ edge: [10, 4], type: 'valley' },
{ edge: [6, 11], type: 'valley' },
{ edge: [11, 4], type: 'valley' },
{ edge: [8, 12], type: 'valley' },
{ edge: [12, 4], type: 'valley' },
{ edge: [1, 9], type: 'mountain' },
{ edge: [3, 9], type: 'mountain' },
{ edge: [1, 10], type: 'mountain' },
{ edge: [5, 10], type: 'mountain' },
{ edge: [3, 11], type: 'mountain' },
{ edge: [7, 11], type: 'mountain' },
{ edge: [5, 12], type: 'mountain' },
{ edge: [7, 12], type: 'mountain' }
]
},
{
id: 'hypar',
name: 'Hyperbolic Paraboloid',
vertices: [
[-1, 1], [-0.5, 1], [0, 1], [0.5, 1], [1, 1],
[-1, 0.5], [-0.5, 0.5], [0, 0.5], [0.5, 0.5], [1, 0.5],
[-1, 0], [-0.5, 0], [0, 0], [0.5, 0], [1, 0],
[-1, -0.5], [-0.5, -0.5], [0, -0.5], [0.5, -0.5], [1, -0.5],
[-1, -1], [-0.5, -1], [0, -1], [0.5, -1], [1, -1]
],
faces: [
[0, 1, 6], [0, 6, 5], [1, 2, 7], [1, 7, 6], [2, 3, 8], [2, 8, 7], [3, 4, 9], [3, 9, 8],
[5, 6, 11], [5, 11, 10], [6, 7, 12], [6, 12, 11], [7, 8, 13], [7, 13, 12], [8, 9, 14], [8, 14, 13],
[10, 11, 16], [10, 16, 15], [11, 12, 17], [11, 17, 16], [12, 13, 18], [12, 18, 17], [13, 14, 19], [13, 19, 18],
[15, 16, 21], [15, 21, 20], [16, 17, 22], [16, 22, 21], [17, 18, 23], [17, 23, 22], [18, 19, 24], [18, 24, 23]
],
creases: [
{ edge: [1, 6], type: 'mountain' }, { edge: [6, 11], type: 'mountain' }, { edge: [11, 16], type: 'mountain' }, { edge: [16, 21], type: 'mountain' },
{ edge: [2, 7], type: 'valley' }, { edge: [7, 12], type: 'valley' }, { edge: [12, 17], type: 'valley' }, { edge: [17, 22], type: 'valley' },
{ edge: [3, 8], type: 'mountain' }, { edge: [8, 13], type: 'mountain' }, { edge: [13, 18], type: 'mountain' }, { edge: [18, 23], type: 'mountain' },
{ edge: [5, 6], type: 'valley' }, { edge: [6, 7], type: 'valley' }, { edge: [7, 8], type: 'valley' }, { edge: [8, 9], type: 'valley' },
{ edge: [10, 11], type: 'mountain' }, { edge: [11, 12], type: 'mountain' }, { edge: [12, 13], type: 'mountain' }, { edge: [13, 14], type: 'mountain' },
{ edge: [15, 16], type: 'valley' }, { edge: [16, 17], type: 'valley' }, { edge: [17, 18], type: 'valley' }, { edge: [18, 19], type: 'valley' }
]
}
];