繁体   English   中英

如何根据鼠标位置更改背景颜色(特定颜色)

[英]How to change the color of the background based on mouse position (specific colors)

这是代码:

var $win = $(window),
    w = 0,h = 0,
    rgb = [],
    getWidth = function() {
        w = $win.width();
        h = $win.height();
    };

$win.resize(getWidth).mousemove(function(e) {

    rgb = [
        Math.round(e.pageX/w * 255),
        Math.round(e.pageY/h * 255),
        150
    ];

    $(document.body).css('background','rgb('+rgb.join(',')+')');
    //top center: rgb(85, 209, 79)
    //right middle: rgb(104, 129, 197)
    //bottom center: rgb(40,129,255)
    //left middle: rgb(255, 184, 0)
    //very center: rgb(15, 175, 168)
}).resize();

我想根据鼠标位置更改背景颜色,但是我不知道如何指定5个点(顶部,右侧,底部,左侧,中心)的颜色。

###################
#        O        #
#                 #
#                 #
# O      O      O #
#                 #
#                 #
#        O        #
###################

所以这五个点是我有颜色的地方,当我在这些点之间移动鼠标时,我想将其从一个更改为另一个。 http://jsfiddle.net/710r4gaj/

您必须使用插值方法。 双线性插值非常流行。

我要做的是在感兴趣的点(顶部,左侧,右侧,底部和中心)指定颜色。 然后,通过定义最接近的颜色的平均值来定义角落中的颜色(这并不是很好,最好也指定它们)。

完成后,给定屏幕上的一个点,我将计算该点在哪个子正方形中,并计算该正方形的顶点之间的双线性插值(如图所示)

在此处输入图片说明

这是一个小提琴:

 var $win = $(window), w = 0, h = 0, rgb = [], getWidth = function() { w = $win.width(); h = $win.height(); }; var average = function(a, b) { return [0.5 * (a[0] + b[0]), 0.5 * (a[1] + b[1]), 0.5 * (a[1] + b[1])]; } var center = [255, 255, 255]; // white var topMiddle = [0, 0, 0]; // black var leftMiddle = [255, 0, 0]; // red var rightMiddle = [0, 255, 0]; // green; var bottomMiddle = [0, 0, 255]; // blue; var topLeft = average(leftMiddle, topMiddle); var topRight = average(topMiddle, rightMiddle); var bottomLeft = average(leftMiddle, bottomMiddle); var bottomRight = average(bottomMiddle, rightMiddle); var interpolate2D = function(x00, x01, x10, x11, x, y) { return x00 * (1 - x) * (1 - y) + x10 * x * (1 - y) + x01 * (1 - x) * y + x11 * x * y; } var interpolateArray = function(x00, x01, x10, x11, x, y) { var result = [0, 0, 0]; for (var i = 0; i < 3; ++i) { result[i] = Math.floor(interpolate2D(x00[i], x01[i], x10[i], x11[i], x, y)); } return result; } $win.resize(getWidth).mousemove(function(e) { var positionX = e.pageX / w; var positionY = e.pageY / h; var x00, x01, x11, x10; if (positionX > 0.5 && positionY > 0.5) { x00 = center; x01 = bottomMiddle; x10 = rightMiddle; x11 = bottomRight; positionX = 2.0 * (positionX - 0.5); // scale position back to [0, 1] positionY = 2.0 * (positionY - 0.5); } else if (positionX > 0.5 && positionY <= 0.5) { x00 = topMiddle; x01 = center; x10 = topRight; x11 = rightMiddle; positionX = 2.0 * (positionX - 0.5); positionY = 2.0 * (positionY); } else if (positionX <= 0.5 && positionY <= 0.5) { x00 = topLeft; x01 = leftMiddle; x10 = topMiddle; x11 = center; positionX = 2.0 * (positionX); positionY = 2.0 * (positionY); } else if (positionX <= 0.5 && positionY > 0.5) { x00 = leftMiddle; x01 = bottomLeft; x10 = center; x11 = bottomMiddle; positionX = 2.0 * (positionX); positionY = 2.0 * (positionY - 0.5); } else { // can't happen } rgb = interpolateArray(x00, x01, x10, x11, positionX, positionY); $(document.body).css('background', 'rgb(' + rgb.join(',') + ')'); //top: rgb(85, 209, 79) //right: rgb(104, 129, 197) //bottom: rgb(40,129,255) //left: rgb(255, 184, 0) }).resize(); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM