-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPacker.js
More file actions
131 lines (90 loc) · 2.59 KB
/
Packer.js
File metadata and controls
131 lines (90 loc) · 2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
function DeckCreator() {
this.matrixSubArr = 0;
this.symbols = [];
this.symbolOffsetSize = 60;
this.symbolW = 100;
this.broken = false;
this.createCard = function () {
background(220);
let packedCard = this.packCard();
this.matrixSubArr++;
return packedCard;
}
this.packCard = function () {
this.fitSymbols();
return this.symbols
}
this.saveCard = function () {
saveCanvas(dobbleDeckName + this.matrixSubArr.toString(), "jpg");
}
this.fitSymbols = function () {
this.symbols = []
let fitSymbolsTries = 0;
let fitSymbolsMaxTries = 500000;
let cardIdx = 0;
while (this.symbols.length < n + 1) {
let currentSymbol = this.createSymbol();
this.broken = false;
currentSymbol = this.packSymbols(currentSymbol);
if (!this.broken) {
currentSymbol.symbolNum = matrix[this.matrixSubArr][cardIdx]
this.symbols.push(currentSymbol)
cardIdx++
}
fitSymbolsTries++
if (fitSymbolsTries > fitSymbolsMaxTries) {
break;
}
}
}
this.createSymbol = function () {
let rX = random(width);
let rY = random(height);
let s = {
symbolNum: 0,
pos: createVector(rX, rY),
w: this.symbolW,
rotation: random(0, 2 * PI),
overlapping: false, outOfBounds: false,
vel: createVector(0, 0),
acc: createVector(0, 0),
separationForce: createVector(0, 0)
}
return s
}
this.packSymbols = function (c) {
let packingTries = 0;
let maxPackingTries = 1000;
while (this.symbolIsOutOfBounds(c) || this.symbolsOverlappingDuringPacking(c, this.symbols)) {
let rX = random(width)
let rY = random(height)
c.x = rX;
c.y = rY;
c.w = random(this.symbolW - this.symbolOffsetSize, this.symbolW + this.symbolOffsetSize)
packingTries++
if (packingTries > maxPackingTries) {
this.broken = true;
break
}
}
return c;
}
this.symbolsOverlappingDuringPacking = function (currentSymbol, symbolArr) {
//overlapping for packing function
for (let j = 0; j < symbolArr.length; j++) {
let d = dist(currentSymbol.pos.x, currentSymbol.pos.y, symbolArr[j].pos.x, symbolArr[j].pos.y)
if (d < ((currentSymbol.w / 2 * 1.414) + (symbolArr[j].w / 2 * 1.414))) {
return true
}
}
return false;
}
this.symbolIsOutOfBounds = function (symbol) {
let d = dist(width / 2, height / 2, symbol.pos.x, symbol.pos.y);
if (d > (width / 2) - (symbol.w / 2 * 1.414)) {
return true
} else {
return false;
}
}
}