view source
JavaScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 document.title =
'線形グラデーションの極座標変換'
;
var
style = document.createElement(
'style'
);
style.innerText =
'html,body{overflow:hidden;cursor:none;}'
;
document.getElementsByTagName(
'head'
).item(0).appendChild(style);
var
canvas = document.createElement(
'canvas'
);
var
w = document.body.clientWidth;
var
h = document.body.clientHeight;
var
min = Math.min(w,h);
canvas.setAttribute(
'width'
,w);
canvas.setAttribute(
'height'
,h);
let demo = document.getElementById(
'demo'
);
demo.appendChild(canvas);
let search = location.search.slice(1);
console.log(search);
let params =
new
URLSearchParams(search);
let q = params.get(
'q'
);
console.log(q);
if
(q){
let img = document.createElement(
'img'
);
img.src = q;
demo.appendChild(img);
let styleImg = document.createElement(
'style'
);
styleImg.innerText =
'#demo img{position:absolute;top:0;left:0;height:100vh;cursor:none;}'
;
document.getElementsByTagName(
'head'
).item(0).appendChild(styleImg);
}
var
ctx = canvas.getContext(
'2d'
);
var
cx = w/2;
var
cy = h/2;
var
t = 0;
var
y=0;
var
iw = min/20;
var
i1 = 0;
var
rgbAry = [
[255,255,255],
[0,0,0],
[122,122,255],
[0,255,255],
[0,255,0],
[255,255,0],
[255,0,0],
[255,0,255],
[0,0,255],
[0,255,255],
[0,255,0],
[255,255,0],
[255,0,0],
[255,0,255],
];
var
w = min;
var
h = min;
var
w2 = min / 2;
var
h2 = min / 2;
var
r = Math.sqrt(w2 * w2 + h2 * h2);
var
lut = [];
var
pos = 0;
function
toPolar(){
for
(
var
y = 0; y < h; y++){
for
(
var
x = 0; x < w; x++){
var
sx = Math.atan2(y - h2, x - w2) * w2 / Math.PI + w2;
var
sy = Math.sqrt((x - h2) * (x - w2) + (y - h2) * (y - h2));
sy = (r - sy) / r;
sy = h - sy * sy * h - 1;
if
(sx < 0) sx = 0;
if
(w - 1 < sx) sx = w - 1;
if
(sy < 0) sy = 0;
if
(h - 1 < sy) sy = h - 1;
sx = Math.round(sx);
sy = Math.round(sy);
lut[pos++] = (sy * w + sx) * 4 + 0;
lut[pos++] = (sy * w + sx) * 4 + 1;
lut[pos++] = (sy * w + sx) * 4 + 2;
lut[pos++] = (sy * w + sx) * 4 + 3;
}
}
}
function
iToRGB(i) {
return
'rgb('
+ rgbAry[i].join(
','
) +
')'
;
}
//h:0-180
function
iToHSL(h,s,l) {
return
'hsl('
+ h +
', '
+s+
'%, '
+l+
'%)'
;
}
function
iToC(i) {
var
c;
if
(i === 0){
c = iToHSL(90,100,30);
}
else
if
(i===1){
c = iToHSL(90,100,90);
}
else
{
c = iToHSL(90,100,50);
}
return
c;
}
function
draw() {
var
grad = ctx.createLinearGradient(0, 0, w, 0);
grad.addColorStop(0/8, iToC(3));
grad.addColorStop(1/8, iToC(0));
grad.addColorStop(2/8, iToC(3));
grad.addColorStop(3/8, iToC(1));
grad.addColorStop(4/8, iToC(3));
grad.addColorStop(5/8, iToC(0));
grad.addColorStop(6/8, iToC(3));
grad.addColorStop(7/8, iToC(1));
grad.addColorStop(1, iToC(3));
ctx.fillStyle = grad;
ctx.fillRect(0,0,min,min);
var
output = ctx.getImageData(0,0,w,h);
var
imageData = ctx.getImageData(0,0,w,h);
var
src = imageData.data;
var
dst = output.data;
for
(
var
n = 0; n < h * w * 4; n++){
dst[n] = src[lut[n]];
}
ctx.putImageData(output, 0, 0);
var
newImage = ctx.getImageData(0,0,min,min);
var
img =
new
Image();
img.src = canvas.toDataURL();
img.onload =
function
() {
ctx.clearRect(0, 0, min, min)
rot = 45 * Math.PI / 180;
drawPanel(img);
}
}
function
drawPanel(img){
var
w = document.body.clientWidth;
var
h = document.body.clientHeight;
for
(i=0;i*iw<w;i++){
for
(j=0;j*iw<h;j++){
ctx.drawImage(img, 0, 0, min, min, i*iw, j*iw, min/20,min/20);
}
}
}
toPolar();
draw();
setInterval(
function
(){
//draw();
}, 60/120);
document.oncontextmenu =
function
() {
return
false
;}
function
resize() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
console.table({w:canvas.width, h:canvas.height});
w = document.body.clientWidth;
h = document.body.clientHeight;
cx = w/2;
cy = h/2;
w2 = w/2;
h2 = h/2;
}
window.onresize = resize;
window.addEventListener(
'click'
,
function
(ev) {
//resize();
//document.body.requestFullscreen();
//draw();
},
false
);
window.addEventListener(
'dblclick'
,
function
(ev) {
//draw();
},
false
);
document.addEventListener(
'fullscreenchange'
,
function
(e){
resize();
});
CSS
1
HTML
ページのソースを表示 : Ctrl+U , DevTools : F12
view-source:https://hi0a.com/demo/-js/js-canvas-polar/
ABOUT
hi0a.com 「ひまアプリ」は無料で遊べるミニゲームや便利ツールを公開しています。
プログラミング言語の動作デモやWEBデザイン、ソースコード、フロントエンド等の開発者のための技術を公開しています。
必要な機能の関数をコピペ利用したり勉強に活用できます。
プログラムの動作サンプル結果は画面上部に出力表示されています。
環境:最新のブラウザ GoogleChrome / Windows / Android / iPhone 等の端末で動作確認しています。
画像素材や音素材は半分自作でフリー素材配布サイトも利用しています。LINK参照。
動く便利なものが好きなだけで技術自体に興味はないのでコードは汚いです。
途中放置や実験状態、仕様変更、API廃止等で動かないページもあります。
view source
JavaScript
CSS
HTML
ABOUT
hi0a.com 「ひまアプリ」は無料で遊べるミニゲームや便利ツールを公開しています。
プログラミング言語の動作デモやWEBデザイン、ソースコード、フロントエンド等の開発者のための技術を公開しています。
必要な機能の関数をコピペ利用したり勉強に活用できます。
プログラムの動作サンプル結果は画面上部に出力表示されています。
環境:最新のブラウザ GoogleChrome / Windows / Android / iPhone 等の端末で動作確認しています。
画像素材や音素材は半分自作でフリー素材配布サイトも利用しています。LINK参照。
動く便利なものが好きなだけで技術自体に興味はないのでコードは汚いです。
途中放置や実験状態、仕様変更、API廃止等で動かないページもあります。