根据标签出现的频次渲染不同大小的圆和文字,圆随机摆放且相互之间不重叠

这篇具有很好参考价值的文章主要介绍了根据标签出现的频次渲染不同大小的圆和文字,圆随机摆放且相互之间不重叠。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果图:
根据标签出现的频次渲染不同大小的圆和文字,圆随机摆放且相互之间不重叠,前端,javascript,开发语言

按每个标签出现的频次大小渲染出不同比例大小的圆,渲染的圆的宽度区间为 [40, 160] ,其中的文字的大小区间为 [12, 30] ,圆的位置随机摆放且不重叠

根据已知条件可得出,标签中频次最高的对应圆的宽度(直径)为160px、字号为30px,频次最低的圆的宽度(直径)为40px、字号为12px,那么最终问题的关键就是如何计算出其他标签频次对应的圆的大小

假设标签频次中的最大值为max,最小值为min。可画出如下图:
根据标签出现的频次渲染不同大小的圆和文字,圆随机摆放且相互之间不重叠,前端,javascript,开发语言
那么想要计算出current对应的宽度和字号,需要先计算出橙色这段线占整段线的比例,再根据比例计算这段线代表的宽度大小和字号大小。计算过程如下:
1、求比例:percent = (current-min) / (max-min)
2、根据比例求该段线对应的宽度大小,percent * (160-40)
3、同理求对应的字体大小,percent * (30-12)
4、那么current对应的字体和宽度为12 + percent * (30-12)30 + percent * (160-40)

根据上述计算过程可以写出如下函数:

const getSize = (cur: number, min: number, max: number, minFontSize: number, maxFontSize: number, minWidth: number, maxWidth: number) => {
	const countRange = max - min
	const curRange = cur - min
	const fontSizeRange = maxFontSize - minFontSize 
	const widthRange = maxWidth - minWidth
	
	// 考虑min,max相同的情况
	return {
		fontSize: countRange > 0 ? minFontSize + curRange / countRange * fontSizeRange : maxFontSize,
		width: countRange > 0 ? minWidth + curRange / countRange * widthRange : maxWidth
	}
}

接下来思考:如何将圆随机摆放在矩形中,且保证圆不重叠,已知矩形的rectangleWidth和rectangleHeight,圆的直径width。
1、采用相对/绝对定位来放置圆,只需计算圆在矩形中的left, top值。
2、圆的位置随机,但是圆要保证在矩形区域内,那么left值的取值范围可以为[0, rectangleWidth],同时考虑圆的大小,区间最终为[0, rectangleWidth - width]
3、top值的取值范围可以为[0, rectangleHeight],同时考虑圆的大小,区间最终为[0, rectangleHeight - height]

// width, fontSize 可根据上述的getSize计算得出
interface Label {
	count: number; 
	label: string;
	width: number;
	fontSize: number;
	left: number;
	top: number;
}
const labelData: Array<Label> = []
// 设置圆的left和top值
const setPosition = () => {
	labelData.forEach((v) => {
		v.left = Math.random() * (rectangleWidth - v.width)
		v.top = Math.random() * (rectangleHeight - v.width)
	})
}

考虑圆不重叠的情况优化上述代码,圆重叠即圆出现相交的情况,如何判断圆是否相交,根据数学公式: ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 < r 1 + r 2 \sqrt{(x1-x2)^ 2 + (y1-y2)^2} \quad < r1 + r2 (x1x2)2+(y1y2)2 <r1+r2该公式成立则两圆相交,其中(x1,y1)为圆1的中心坐标,(x2,y2)为圆2的中心坐标,r1、r2分别为两个圆的半径。那么我们需要记录每次画的圆的中心坐标和半径,绘制圆之前先找出之前绘画的圆有没有与之相交的,如果有,则重新获取left、top的值

const circles: Array<{x: number, y: number, radius: number}> = []
const setPosition = () => {
	labelData.forEach((v) => {
		const radius = v.width / 2
		let left: number, top: number, x: number, y: number;
		// do while 判断之前会先do一次,如果找到相交圆,则继续执行do
		do {
			left = Math.random() * (rectangleWidth - v.width)
			top = Math.random() * (rectangleHeight - v.width)
			x = left + radius
			y = top + radius
		} while (
			circles.some(circle => Math.sqrt(Math.pow(circle.x - x, 2) + Math.pow(circle.y - y, 2)) < radius + circle.radius)
		)
		
		v.left = left
		v.top = top
		circles.push({x, y, radius})
	})
}

这里其实还需要考虑到适配的问题,如果矩形区域被缩放,那么文字和圆的大小也应该进行缩放,我这里采用的是scale的方式,计算当前屏幕相对于1920(我们开发的参考尺寸是1920*1080)的比例,然后将对应的maxFontSize * scale ,maxWidth * scale,最小的尺寸就不需要再考虑啦,已经很小啦,当然如果最大尺寸被缩放到比最小的都小的时候就直接取最小尺寸吧!!文章来源地址https://www.toymoban.com/news/detail-839046.html

到了这里,关于根据标签出现的频次渲染不同大小的圆和文字,圆随机摆放且相互之间不重叠的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 若依 vue前端 动态设置路由path不同参数 在页面容器里打开新页面(新路由),面包屑和标签页标题根据参数动态改变,面包屑多级标题,侧边栏对应菜单亮起

    因为是在vue源码的基础上进行修改,所以,就没有复制代码在文章上,采取的是截图对比源码和我修改的代码片段。要麻烦你们自己手敲了。 场景:在费用配置列表中,点击每一项的配置,都会在页面容器内部打开一个新页面,所以新页面的路径一样,根据传的参数不同,面

    2024年01月16日
    浏览(56)
  • 根据渲染数据长度动态渲染后缀图标

    在动态获取数据时,想要渲染后面的图标是根据数据的长度渲染图标位置,效果如下:  代码如下: 

    2024年02月13日
    浏览(73)
  • PyQt5:窗口大小根据屏幕大小自适应调整

     

    2024年02月12日
    浏览(53)
  • Android布局字体大小不根据用户设置字体大小变化而变化

    先获取用户设置字体配置 fontSize 正常是1 大的是1.2 小的是 0.9 不一定就是这个值 差不多就是这样的 然后设置字体大小,如果像设置16sp 即可

    2024年01月25日
    浏览(50)
  • 【python】python根据传入参数不同,调用不同的方法

    大家好,我是木头左。 今天介绍三种不同方法实现根据传入参数不同,调用不同的方法。 使用条件语句 在Python中,可以使用条件语句(如if-elif-else语句)来根据传入的参数调用不同的方法。以下是一个示例: 在上述示例中,我们定义了三个不同的方法(method1,method2和met

    2024年02月09日
    浏览(42)
  • 【unity】代码控制文本框根据字数实时调整大小

    最近想要实现游戏中对话文本框根据字数实时调整大小的功能,在网上没找到合适的教程,故自己简单地实现了一下,在这里分享一下自己的思路。 创建UI画布,设置为根据屏幕大小缩放。 添加一个面板(图中灰色部分),在面板中再添加一个文本框,调整他们的位置和大小

    2024年02月11日
    浏览(39)
  • react ant table 根据接口动态渲染表头

    使request获取list,renderFormItem回调里面第二个参数中就有request的返回值,根据这个去渲染就可以了

    2024年02月16日
    浏览(41)
  • git根据commitid创建tag标签

    1.首先,创建一个新的标签。你可以使用以下命令创建一个轻量级标签(lightweight tag): 针对当前标签而言 ,也就是你所在的当前分支而言 2.如果你想创建一个带注释的标签 针对当前标签而言 ,也就是你所在的当前分支而言 上面两个(1,2)是根据当前分支所创建的,下面这

    2024年02月05日
    浏览(72)
  • 数字1渲染和其他数字大小不一致

    一、场景 手机号都是11位,但是在小程序里面会体现出长度不一样,如下图: 经过仔细观察会发现,其他数字都是对齐的,只有数字1渲染和其他数字大小不一致 二、原因 系统默认使用的是非等宽的字体 三、方法 选用等宽字体即可。例如给对应的标签添加样式:

    2023年04月08日
    浏览(40)
  • 微信小程序 根据登录后的角色权限 渲染底部tabbar--自定义渲染tabbar

    微信小程序模拟登录后 根据不同角色权限 渲染底部tabbar (底部tabbar 用的是vant ui 提供的组件)  1.权限一: 拥有的底部栏如图 1.2 权限二: 拥有的底部栏 如图 1.3 定义全局属性用于存储底部的tabbar渲染 一:  首先在全局文件App.json 配置tabbar (最少2个 最多5个),并且配置页

    2024年02月02日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包