-
Notifications
You must be signed in to change notification settings - Fork 0
/
face.js
147 lines (126 loc) · 3.85 KB
/
face.js
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// TODO - make face object cleaner to work with and update
// TODO - use lodash more
var randomItem = function (inputArray) {
return inputArray[Math.floor(Math.random() * inputArray.length)];
}
var width = 200;
var height = 200;
var faceRadius = width / 4;
var faceCenterX = width / 2;
var faceCenterY = height / 2;
var eyeRadius = faceRadius / 4;
var eyeHeight = height / 2 - faceRadius / 4;
var eyePd = faceRadius;
var pupilRadius = eyeRadius / 4;
var eyeNoise = width / 15;
var bgColors = ['#111', '#333', '#555', '#777', '#999', '#aaa', '#ccc'];
var faceColors = ['hotpink', '#0f0', 'cyan', 'magenta', 'yellow', 'red', 'blue'];
var smileAngles = [1.6, 1.8, 2, 2.2, 2.4, 2.6, 2.8];
bgColor = randomItem(bgColors);
faceColor = randomItem(faceColors);
smileAngle = randomItem(smileAngles);
console.log(faceRadius);
console.log(eyeRadius);
console.log('erx2 ' + eyeRadius * 2);
console.log(eyeHeight);
console.log(eyePd);
// main svg div
var svg = d3.select("#person")
.append("svg")
.attr("width", width)
.attr("height", height)
.on('mousemove', function () {
var rightRadius = d3.mouse(this)[0] / width * eyeRadius;
d3.select('#rightEye').attr('r', rightRadius);
var leftRadius = d3.mouse(this)[1] / height * eyeRadius;
d3.select('#leftEye').attr('r', leftRadius);
})
.on('click', function () {
console.log('clicked');
d3.select('#personBackground').attr('fill', randomItem(bgColors));
d3.select('#smile').attr('d', smileArc(randomItem(smileAngles)));
d3.select('#personFace').attr('fill', randomItem(faceColors));
rightEyeCenter = rightEyeCoords();
leftEyeCenter = leftEyeCoords();
d3.select('#rightEye')
.attr('cx', rightEyeCenter.cx)
.attr('cy', rightEyeCenter.cy)
;
d3.select('#rightPupil')
.attr('cx', rightEyeCenter.cx)
.attr('cy', rightEyeCenter.cy)
;
d3.select('#leftEye')
.attr('cx', leftEyeCenter.cx)
.attr('cy', leftEyeCenter.cy)
;
d3.select('#leftPupil')
.attr('cx', leftEyeCenter.cx)
.attr('cy', leftEyeCenter.cy)
;
});
// append a full rectangle with a background color
svg.append('rect')
.attr('id', 'personBackground')
.attr('width', width)
.attr('height', height)
.attr("fill", bgColor);
// face
svg.append('circle')
.attr('id', 'personFace')
.attr('cx', faceCenterX)
.attr('cy', faceCenterY)
.attr('r', faceRadius)
.attr('fill', faceColor);
// eyes
var leftEyeCoords = function() {
return {
cx: faceCenterX - eyePd/2 + randomItem(_.range(0-eyeNoise, eyeNoise)),
cy: eyeHeight + randomItem(_.range(0-eyeNoise, eyeNoise)),
}
}
var rightEyeCoords = function() {
return {
cx: faceCenterX + eyePd/2 + randomItem(_.range(0-eyeNoise, eyeNoise)),
cy: eyeHeight + randomItem(_.range(0-eyeNoise, eyeNoise)),
}
}
leftCenter = leftEyeCoords();
rightCenter = rightEyeCoords();
svg.append('circle')
.attr('id', 'leftEye')
.attr('cx', leftCenter.cx)
.attr('cy', leftCenter.cy)
.attr('r', eyeRadius)
.attr('fill', 'white');
svg.append('circle')
.attr('id', 'leftPupil')
.attr('cx', leftCenter.cx)
.attr('cy', leftCenter.cy)
.attr('r', pupilRadius)
.attr('fill', 'black');
svg.append('circle')
.attr('id', 'rightEye')
.attr('cx', rightCenter.cx)
.attr('cy', rightCenter.cy)
.attr('r', eyeRadius)
.attr('fill', 'white');
svg.append('circle')
.attr('id', 'rightPupil')
.attr('cx', rightCenter.cx)
.attr('cy', rightCenter.cy)
.attr('r', eyeRadius / 4)
.attr('fill', 'black');
var smileArc = function (rads) {
return d3.arc() // starts at North, deg in rads
.innerRadius(0.8 * faceRadius)
.outerRadius(0.80 * faceRadius + 5)
.startAngle(rads)
.endAngle(Math.PI * 2 - rads);
}
svg.append("path")
.attr('id', 'smile')
.attr('transform', 'translate(' + faceCenterX + ',' + faceCenterY + ')')
.attr("class", "arc")
.attr("d", smileArc(smileAngle))
.attr("fill", "black");