1
<html>
2
<head>
3
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
4
<title>untitled canvas</title>
5
<script>
6
console.log( "=============== script ==============" );
7
8
9
10
11
12
13
14
15
16
17
18
19
function $( id ) { return document.getElementById( id ); }
20
var HereDocument = /\/\*\s*([^]*?)\s*\*\//;
21
var canvasEL, canvas;
22
23
function onloadx() {
24
canvasEL = $( "canvasELID" );
25
canvas = canvasEL.getContext( '2d' );
26
screenW = canvasEL.width;
27
screenH = canvasEL.height;
28
29
30
31
32
masters = new Object();
33
masters.cube = new Object();
34
35
36
masters.cube.tens = [
37
{ x : -1, y : -1, z : -1 },
38
{ x : +1, y : -1, z : -1 },
39
{ x : +1, y : +1, z : -1 },
40
{ x : -1, y : +1, z : -1 },
41
42
{ x : -1, y : -1, z : +1 },
43
{ x : +1, y : -1, z : +1 },
44
{ x : +1, y : +1, z : +1 },
45
{ x : -1, y : +1, z : +1 },
46
];
47
48
masters.cube.mens = [
49
[ 3, 2, 1, 0 ],
50
[ 1, 2, 6, 5 ],
51
[ 0, 4, 7, 3 ],
52
[ 7, 6, 2, 3 ],
53
[ 0, 1, 5, 4 ],
54
[ 5, 6, 7, 4 ],
55
];
56
57
58
masters.cube.scale = 10;
59
60
61
masters.cube.posX = 0;
62
masters.cube.posY = 0;
63
masters.cube.posZ = 80;
64
65
66
masters.cube.kaitenH = 3.14 / 8;
67
masters.cube.kaitenV = 0;
68
69
70
masters.cube.baseColor = { r : 196, g : 196, b : 0 };
71
72
73
models = new Array();
74
var makeLink = function( master ) {
75
var model = new Object();
76
model.tens = master.tens;
77
model.mens = master.mens;
78
model.scale = master.scale;
79
model.posX = master.posX;
80
model.posY = master.posY;
81
model.posZ = master.posZ;
82
model.kaitenH = master.kaitenH;
83
model.kaitenV = master.kaitenV;
84
model.baseColor = objCpy( master.baseColor );
85
return model;
86
};
87
88
89
var model = makeLink( masters.cube );
90
model.posX = -15;
91
model.posZ -= 1;
92
model.baseColor = { r : 196, g : 48, b : 48 };
93
models.push( model );
94
95
96
var model = makeLink( masters.cube );
97
model.scale *= 1.2;
98
model.posX = 9;
99
model.posY = -models[ 0 ].scale + model.scale;
100
model.posZ += 5;
101
model.baseColor = { r : 48, g : 196, b : 48 };
102
models.push( model );
103
104
105
var model = makeLink( masters.cube );
106
model.scale *= 0.3;
107
model.posX = 1;
108
model.posY = -models[ 0 ].scale + model.scale;
109
model.posZ = 62;
110
model.kaitenH = 0.02;
111
model.baseColor = { r : 48, g : 48, b : 196 };
112
models.push( model );
113
114
cam = new Object();
115
116
117
cam.s = 50;
118
119
120
cam.kaitenH = 0;
121
cam.kaitenV = 0;
122
123
124
cam.posX = 0;
125
cam.posY = 0;
126
cam.posZ = 0;
127
128
129
var center = new Object();
130
center.x = models[ 2 ].posX;
131
center.y = models[ 2 ].posY;
132
center.z = models[ 2 ].posZ;
133
doTarget( cam, center );
134
var kaitenH = -3.14 / 4;
135
var kaitenV = -3.14 / 16 * 5;
136
camDomeKaiten( cam, center, kaitenH, kaitenV );
137
draw();
138
}
139
140
function draw() {
141
142
143
for( var m = 0; m < models.length; m++ ) {
144
var model = models[ m ];
145
model.tensC = new Array();
146
147
148
for( var i = 0; i < model.tens.length; i++ ) {
149
var x = model.tens[ i ].x;
150
var y = model.tens[ i ].y;
151
var z = model.tens[ i ].z;
152
153
154
x *= model.scale;
155
y *= model.scale;
156
z *= model.scale;
157
158
159
var res = kaiten( x, z, model.kaitenH );
160
x = res.X;
161
z = res.Y;
162
163
var res = kaiten( z, y, model.kaitenV );
164
z = res.X;
165
y = res.Y;
166
167
168
x += model.posX;
169
y += model.posY;
170
z += model.posZ;
171
172
173
x += -cam.posX;
174
y += -cam.posY;
175
z += -cam.posZ;
176
177
178
179
var res = kaiten( x, z, -cam.kaitenH );
180
x = res.X;
181
z = res.Y;
182
183
var res = kaiten( z, y, -cam.kaitenV );
184
z = res.X;
185
y = res.Y;
186
187
188
189
var h = x * ( cam.s / z );
190
var v = -y * ( cam.s / z );
191
192
193
h *= 14.25;
194
v *= 14.25;
195
196
197
model.tensC[ i ] = new Object();
198
model.tensC[ i ].x = x;
199
model.tensC[ i ].y = y;
200
model.tensC[ i ].z = z;
201
model.tensC[ i ].h = h;
202
model.tensC[ i ].v = v;
203
204
}
205
}
206
207
208
209
210
var allmens = new Array();
211
212
213
for( var m = 0; m < models.length; m++ ) {
214
var model = models[ m ];
215
216
for( var j = 0; j < model.mens.length; j++ ) {
217
var men = model.mens[ j ];
218
219
220
var tmpTens = new Array();
221
for( var i = 0; i < men.length; i++ )
222
tmpTens.push( model.tensC[ men[ i ] ] );
223
224
if( ! checkVisibility( tmpTens ) ) continue;
225
226
227
var sumZ = 0;
228
for( var k = 0; k < men.length; k++ ) {
229
var tenIDX = men[ k ];
230
var ten = model.tensC[ tenIDX ];
231
sumZ += ten.z;
232
}
233
234
235
var theMen = new Object();
236
theMen.men = men;
237
theMen.avgZ = sumZ / men.length;
238
theMen.model = model;
239
allmens.push( theMen );
240
241
}
242
}
243
244
245
246
247
allmens.sort( function( a, b ) {
248
if( a.avgZ > b.avgZ ) return -1;
249
else if( a.avgZ < b.avgZ ) return 1;
250
else return 0;
251
} );
252
253
254
255
for( var i = 0; i < allmens.length; i++ ) {
256
var men = allmens[ i ].men;
257
var model = allmens[ i ].model;
258
259
260
canvas.beginPath();
261
for( var j = 0; j < men.length; j++ ) {
262
var tenIDX = men[ j ];
263
var ten = model.tensC[ tenIDX ];
264
265
var h = ten.h;
266
var v = ten.v;
267
268
269
if( j == 0 ) {
270
canvas.moveTo( screenW / 2 + h, screenH / 2 + v );
271
} else {
272
canvas.lineTo( screenW / 2 + h, screenH / 2 + v );
273
}
274
}
275
canvas.closePath();
276
277
278
canvas.fillStyle = rgb2str( model.baseColor );
279
canvas.fill();
280
281
282
canvas.strokeStyle = "black";
283
canvas.stroke();
284
}
285
}
286
287
288
289
function checkVisibility( p ) {
290
var x1 = p[ 0 ].x, y1 = p[ 0 ].y, z1 = p[ 0 ].z;
291
var x2 = p[ 1 ].x, y2 = p[ 1 ].y, z2 = p[ 1 ].z;
292
var x3 = p[ 2 ].x, y3 = p[ 2 ].y, z3 = p[ 2 ].z;
293
294
295
var hx = (y2-y1)*(z3-z2)-(z2-z1)*(y3-y2);
296
var hy = (z2-z1)*(x3-x2)-(x2-x1)*(z3-z2);
297
var hz = (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2);
298
299
300
var ex = 0, ey = 0, ez = 0;
301
302
for( var i = 0; i < p.length; i++ ) {
303
ex += p[ i ].x;
304
ey += p[ i ].y;
305
ez += p[ i ].z;
306
}
307
ex /= -p.length;
308
ey /= -p.length;
309
ez /= -p.length;
310
311
312
var a = ex * hx + ey * hy + ez * hz;
313
314
return a > 0;
315
}
316
317
function kaiten( x, y, theta2 ) {
318
319
320
321
322
var theta1 = Math.atan2( y, x );
323
var hankei = Math.sqrt( x * x + y * y );
324
var kaitenX = Math.cos( theta1 + theta2 ) * hankei;
325
var kaitenY = Math.sin( theta1 + theta2 ) * hankei;
326
return { X : kaitenX, Y : kaitenY };
327
}
328
329
function rgb2str( rgb ) {
330
331
332
333
console.log( "RGB(" + rgb.r + "," + rgb.g + "," + rgb.b + ")" );
334
return "RGB(" + rgb.r + "," + rgb.g + "," + rgb.b + ")";
335
}
336
337
function objCpy( obj ) {
338
339
340
341
var res = new Object();
342
for( var name in obj ) {
343
res[ name ] = obj[ name ];
344
}
345
return res;
346
}
347
348
function doTarget( cam, targetP ) {
349
350
351
352
353
354
var tx = targetP.x - cam.posX;
355
var ty = targetP.y - cam.posY;
356
var tz = targetP.z - cam.posZ;
357
358
359
var kakudoTH = Math.atan2( tz, tx );
360
var kakudoTV = Math.atan2( ty, tz );
361
362
363
cam.kaitenH = kakudoTH - 1.57;
364
cam.kaitenV = kakudoTV;
365
}
366
367
function camDomeKaiten( cam, center, theta2H, theta2V ) {
368
369
370
371
372
373
if( theta2H != 0 ) {
374
375
var res = kaiten2( center.x, center.z, cam.posX, cam.posZ, theta2H );
376
cam.posX = res.X;
377
cam.posZ = res.Y;
378
cam.kaitenH += theta2H;
379
}
380
381
382
if( theta2V != 0 ) {
383
384
385
386
387
388
389
var v = Math.abs( Math.floor( ( cam.kaitenV + theta2V ) * 100 ) / 100 );
390
if( v >= 3.14 / 2 ) {
391
theta2V = 3.14 / 2 * ( theta2V > 0 ? 1 : -1 ) - cam.kaitenV;
392
393
if( theta2V == 0 ) return;
394
}
395
396
397
var kaitenHbak = cam.kaitenH;
398
399
var res = kaiten2( center.x, center.z, cam.posX, cam.posZ, -cam.kaitenH );
400
cam.posX = res.X;
401
cam.posZ = res.Y;
402
cam.kaitenH = 0;
403
404
405
var res = kaiten2( center.z, center.y, cam.posZ, cam.posY, theta2V );
406
cam.posZ = res.X;
407
cam.posY = res.Y;
408
cam.kaitenV += theta2V;
409
410
411
var res = kaiten2( center.x, center.z, cam.posX, cam.posZ, kaitenHbak );
412
cam.posX = res.X;
413
cam.posZ = res.Y;
414
cam.kaitenH = kaitenHbak;
415
416
}
417
}
418
419
function kaiten2( centerX, centerY, x, y, theta2 ) {
420
421
422
423
424
x -= centerX;
425
y -= centerY;
426
var theta1 = Math.atan2( y, x );
427
var hankei = Math.sqrt( x * x + y * y );
428
var kaitenX = Math.cos( theta1 + theta2 ) * hankei;
429
var kaitenY = Math.sin( theta1 + theta2 ) * hankei;
430
kaitenX += centerX;
431
kaitenY += centerY;
432
return { X : kaitenX, Y : kaitenY };
433
}
434
435
</script>
436
<style>
437
</style>
438
</head>
439
<body onload="onloadx();" style="
440
background-color : lightgray;
441
height : 100%;
442
margin : 0;
443
">
444
<canvas id="canvasELID" width="512" height="448" style="
445
display : block;
446
margin : auto;
447
background-color : white;
448
border : solid 1px black;
449
">There is no canvas.</canvas>
450
</body>
451
</html>