欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~

作者:Rusu

导语

相信大家跟我一样,偶尔会疑惑:曾经年少的时候学习过的那么多的复杂的数学函数,牛逼的化学方程式,各种物理原理、公式,到底有什么用?但事实是,我们所学习过的东西,虽然很多不能够准确地记得全部,但已经潜移默化地影响到我们的思维模式,很多时候给我们解决一些工作、甚至是生活中的问题,提供了建模的方案,比如,在实现某个需求的时候需要做动画衰减,可能就能够通过匀减速运动公式去实现,再比如,本文所要介绍这个案例,整个实现过程其实并没有多么难多么复杂,但从实际问题到模型建立的思维推导过程,笔者认为还是很有意思也很有意义的,所以,也希望能够分享给大家。

一、 背景问题

有个需求是要将每日消费数据以柱状图形式呈现,我们有追求的设计师希望柱子高度在超过某个限额(设为valueNormal)时不再正比增长,而是越来越缓慢地增长,目的是使柱子高度不会出现有些特别高,有些特别矮的情况,那么,要怎么才能够实现这个需求呢?下面将介绍对于这个问题的思路梳理及实现过程。

二、 思路梳理

1. 模型建立:

首先,回到最初目标:使柱子在超过valueNormal之后,高度增长速度越来越慢。也就是说,在消费金额小于等于valueNormal时,柱子高度成正比增长;大于valueNormal时,大于valueNormal的部分,所占高度随着值的增加增长速度越来越慢。其次,整个柱状图的高度是一定的(设为heightMax),毋庸置疑,最大的消费金额值(设为valueMax)的柱子高度就是heightMax。然后我们对于valueNormal值的柱子的高度设定为heightNormal。这样,这个问题最终就转换成这样的模型:

其中rat就是超过valueNormal的部分的高度在heightMax – heightNormal中所占的比例,要求(1)rat值随消费金额值的增加而增加;(2)增加速度逐渐趋缓;(3)rat值的变化区间是0~1;

那么,根据这个模型,我们需要确定的有以下三个值:(1)valueNormal值如何取;(2)heightNormal值如何取;(3)rat值的计算方法如何确定。这里valueNormal和heightNormal值可能需要根据业务不同要求等来具体确定,并且在整个程序的生命周期内,不会发生变化,我们下面主要讨论rat值的计算方法。

2. rat值的函数设计:

根据1中的模型对rat值的要求,最先想到了渐进函数,最简单的渐进函数y = 1/x, 函数图如下:

在x>0时,y值随x值增加而越来越小,并且减小速度逐渐趋缓,最后无限趋近于0

y = -1/x:

在x>0时,y值随x增加而越来越大,并且增长速度逐渐趋缓,最后无限趋近于0。这个函数变化趋势已经跟我们所要的效果很像了,区别在于:我们要求从0开始逐渐趋近于1,继续改造:

y = 1 – 1/x:

y = 1 – 1/(x+1):

当x>0时,y从0开始逐渐增加,并且增长速度逐渐趋缓,最终趋近于1,这就是我们要的效果了。

3. 应用于实际场景:

2中所得函数式运用于1中模型,x就是value-valueNormal,y就是rat,那么,也就是说当value-valueNormal=1是,rat = 1/2; value-valueNormal=2时,rat = 2/3。那么在实际该消费数据的场景下,相当于高于valueNormal值1块的消费金额就占了heightMax-heightNormal部分的一半高度,之后随着value值继续增加,其高度的增加范围只是heightMax-heightNormal部分的一半,显然是不合理的,因此这里函数式要进一步加参数调整,调整为:y = 1- 1/(x/a + 1) = x/(x+a),这样,当value-valueNormal = a时,value的高度就是heightNormal + (heightMax-heightNormal)*1/2。

到这里1中模型就变为:

接着,就剩下确定valueNormal, heightNormal, a的取值如何确定的问题了,通过实验,最终选用了valueNormal是某个月份的消费日均值(设为Average),heightNormal是整个柱状图高度的1/2,a是Average的一半。这样,这个模型就具体化为:

化解为:

将一个实际例子套用到该模型中,9月份总消费金额是121669元,该月日均消费金额是4055.63元,假定HeightMax = 5000,整体函数示意图如下所示:

可以看出这是完全符合我们最初设计要求的:在消费金额小于等于日均消费金额值时,柱子高度随金额值增加成正比增长;之后,随着消费金额值的增加,柱子高度仍然不断增长,但增高幅度越来越缓慢,最终无限趋近于柱状图总高度。

三、 实现效果:

最终实现效果如下:

完美!

相关阅读

一站式满足电商节云计算需求的秘诀

腾讯爆款游戏收割机的背后,MTA 4 年内覆盖 150 万 APP

Bloom Filter 的基本原理和实现

此文已由作者授权腾讯云技术社区发布,转载请注明文章出处

原文链接:https://cloud.tencent.com/community/article/272925

海量技术实践经验,尽在腾讯云社区

海量技术实践经验,尽在腾讯云社区! https://cloud.tencent.com/community

数学之美?编程之美?数学 + 编程= unbelievable 美!的更多相关文章

  1. Qt编程之mapx组件编程

    今天利用组件打包程序写了一些小例子,给大家贴出来,顺便提高一下记忆. 上一篇介绍了直接使用控件和使用控件打包程序对控件进行编程的方法.个人感觉后者编程更方便.不说废话了: 头文件中所需要的类型指针对象 ...

  2. windows编程之Windows Shell 编程

    参考书<VC++ Windows Shell Programming>   这里仅仅是记录下该资源,推荐到下文列出的连接进行查看   用VC++ 进行Windows Shell 扩展编成 ...

  3. 网络编程之Socket异步编程

    看了上篇socket入门,相信你已经对socket有一定的了解了http://www.cnblogs.com/nsky/p/4501782.html 现在来回顾一下.上篇在循环接收客户端连接和循环接收 ...

  4. Python—网络通信编程之udp通信编程

    服务端代码 import socket # 1.创建实例,即数据报套接字 server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2.绑 ...

  5. Python—网络通信编程之tcp通信编程

    服务端代码 import socket # 1.创建流式套接字实例 # server = socket.socket() server = socket.socket(socket.AF_INET, ...

  6. 编程之美2014挑战赛 复赛 Codehunt平台试题答案

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  7. 编程之美2.5:寻找最大的K个数

    编程之美2.5:寻找最大的K个数 引申:寻找第k大的数: 方法一: // 选择第k大的数(通过改进快速排序来实现) public static void SelectShort(int[] array ...

  8. 24点C++程序实现 编程之美1.16

    解法1,对于任意输入的四个数字,给出一个24点的解法,若无解,则没有输出. 原理参照下图(编程之美原书) 代码如下,仅供参考 // 1.16.cpp : Defines the entry point ...

  9. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软“编程之美”挑战赛在选手的火热比拼中圆满落下帷幕.“编程之美”挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起,微软每年都在革新比赛命题.紧跟时代潮流, ...

随机推荐

  1. 使用js获取数组中最大、最小的数字

    1.查询最大值 var maxValue=Math.max.apply(Math,array); 2.查询最小值 var minValue=Math.min.apply(Math,array);

  2. JQ图片文件上传之前预览功能

    1.先准备一个div onchange触发事件 <input  type="file" onchange="preview(this)" >< ...

  3. 《Linux命令行与shell脚本编程大全》 第七章理解Linux文件权限

    Linux沿用了Unix文件权限的方法,允许用户和组根据每个文件和目录的安全性设置来访问文件. 用户权限通过创建用户时分配的用户ID(UID)来跟踪的.每个用户有唯一的ID,但是登录时用的不是UID, ...

  4. 100000个嵌入式学习者遇到的PING不通问题,我们使用这一个视频就解决了,牛!

    在10多年的售后答疑历程中,我们每天都会遇到开发板.windows,ubuntu三者之间的PING通问题,常常中断手头中的工作去解决这类问题,甚至跟客户远程协助,颇耗时间与精力,在热心网友.答疑助手们 ...

  5. Winform界面中主从表编辑界面的快速处理

    在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示.编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随 ...

  6. java如何声明一个数组用来存储随机生成的字母并且保证不重复

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px ...

  7. MySQL .msi 安装失败改用.zip安装步骤

    一开始官网下载.msi安装包,安装到配置server时无法启动,长时间卡在这里,无法继续下去.上网看了一下解决办法,发现用.zip安装包进行安装比较简单可靠. 一.利用.msi安装包安装失败后的处理 ...

  8. 学习makefile的一个工程示例

    前言 makefile推荐资料为陈皓的跟我一起写makefile,需要pdf资源的可以私我 正文 工程目录结构 ---include(放置头文件.h) ------student.h(Student类 ...

  9. 51Nod--1049最大子段和

    1049 最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 N个整数组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a ...

  10. Centos7 下安装Docke

    为什么 要用centos7呢. 现在哪个企业用的是centos7呀.不都是老版本么. 对咱们是新技术.所以只有新系统才可以用.因为docker要求服务CentOS6以上,kernel 版本必须2.6. ...