`
jayce洪
  • 浏览: 23437 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

坐标轴范围及刻度的自适应算法

 
阅读更多

本文参考博客:http://blog.csdn.net/heyzol/article/details/22912389

由于我是固定了刻度数,美观的呈现图表,所以在原博主算法上进行了修改

 

var calculateRulerMark = function(arrMark, numMin, numMax, iHeight, iActualMarkNum)
{
	if(numMax <= numMin)
	{
		return; 
	}
	var iMinMark = numMin;
	var iMaxMark = numMax;
	var iSuggestMarkNum = parseInt(iHeight / 20) + 1;
	//传了实际的进来说明,实际的比建议的大
	iActualMarkNum = iActualMarkNum ? iActualMarkNum - 1 : iSuggestMarkNum;
	var iSuggestStep = (numMax - numMin) / iActualMarkNum;
	var iBase = Math.pow(10, parseInt(Math.log(iSuggestStep)/Math.log(10)));
	if(iBase != iSuggestStep)
	{
		iBase = 10 * iBase;
	}
	var iTempStep = (iSuggestStep / iBase).toFixed(6);
	// 常规步长 0.1, 0.2, 0.25, 0.5 , 1 
	if(iTempStep >= 0 && iTempStep <= 0.1)
	{
		iTempStep = 0.1;
	}
	else if(iTempStep >=0.100001 && iTempStep <= 0.2)
	{
		iTempStep = 0.2;
	}
	else if(iTempStep >= 0.200001 && iTempStep <= 0.25)
	{
		iTempStep = 0.25;
	}
	else if(iTempStep >= 0.250001 && iTempStep <= 0.5)
	{
		iTempStep = 0.5
	}
	else
	{
		iTempStep = 1;
	}
	iTempStep = iTempStep * iBase;
	//判断最小刻度是否需要+1
	if(parseInt(numMin / iTempStep) != numMin / iTempStep)
	{
		if(numMin < 0)
		{
			iMinMark = (-1) * Math.ceil(Math.abs(numMin/iTempStep))*iTempStep;
		}
		else
		{
			iMinMark = parseInt(Math.abs(numMin/iTempStep))*iTempStep;
		}
	}
	//判断最大刻度是否需要+1
	if(parseInt(numMax / iTempStep) != numMax / iTempStep)
	{
		if(numMax < 0)
		{
			iMaxMark = (-1) * Math.floor(Math.abs(numMax/iTempStep))*iTempStep;
		}
		else
		{
			iMaxMark = parseInt(numMax/iTempStep + 1)*iTempStep;
		}
	}
	var iTempMarkNum = (iMaxMark - iMinMark) / iTempStep + 1;
	if(iTempMarkNum > iSuggestMarkNum)
	{
		calculateRulerMark(arrMark, numMin, numMax, iHeight, iActualMarkNum)
	}
	else
	{
		iSuggestMarkNum = iTempMarkNum;
		for(var i = 0; i < iSuggestMarkNum; i++)
		{
			arrMark.push(iMinMark+ iTempStep * i);
		}
	}
}

 

分享到:
评论
1 楼 Lstoryc 2018-11-29  
大佬 能否写下入参说明 看的不是很明白

相关推荐

    坐标轴范围刻度确定算法,主要应用于自己开发绘图软件时,坐标刻度范围及标注的自适应计算,非常有用!

    本压缩包提供了一系列的坐标轴范围刻度确定算法,这些算法旨在帮助开发者自适应地计算和设置合适的坐标范围及刻度,确保图形的视觉效果最佳。 首先,我们要理解坐标轴的范围刻度是如何影响图形的。坐标轴的范围决定...

    GPS/DR组合测姿自适应算法研究.pdf

    【GPS/DR组合测姿自适应算法研究】 GPS(全球定位系统)与DR(Dead Reckoning,航位推测)的组合测姿是一种常见的导航技术,尤其在舰船导航领域中广泛应用。这种技术通过集成GPS的全球定位能力和DR的连续运动追踪...

    C++绘制坐标曲线源码

    在描述中提到的“动态调整坐标轴刻度”是一个关键功能,它允许用户根据数据的范围和复杂性自适应地改变坐标轴的分度。这在处理大量或者变化范围广泛的数据时特别有用,因为它能确保图形的可读性和清晰度。实现这一...

    测试过的C#画坐标曲线程序.rar

    “带自动调整刻度间距功能”这一特性表明,程序具有智能地根据数据范围和密度自适应地调整坐标轴刻度的功能。这对于创建清晰、易于理解的图表至关重要,因为它确保了刻度间的距离适当,不会过于拥挤或过于稀疏,从而...

    电力机房巡检机器人的指针式仪表识别算法.pdf

    在技术上,这项研究结合了机器学习和深度学习的先进方法,如利用Faster R-CNN进行目标检测,并结合自适应边缘检测算法和改进的刻度修复算法,为电力机房巡检机器人的智能化识别与读数提供了一条新的途径。...

    基于MATLAB与hough变换的表盘刻度识别系统设计与实现

    在实现过程中,可能还需要考虑其他因素,比如表盘的旋转、光照变化、刻度线的宽度不一致等,这些问题可以通过图像校正、自适应阈值选择或者边缘检测的改进方法来解决。最终,通过优化算法和参数设置,我们可以得到一...

    计算机视觉百分表自动检定算法研究.pdf

    图像预处理采用改进的图像差影方法和自适应阈值分割算法,以减小噪声、增强表盘图像的对比度,使指针和刻度线更加清晰。其中,自适应阈值分割算法能够根据图像局部特性自动调整分割阈值,以适应不同光照和环境条件下...

    matlab开发-QuiverS

    4. **添加轴和标签**:使用`xlabel`, `ylabel`, 和 `title`函数来标识坐标轴和图例,以便解释图形内容。 5. **其他定制**:"QuiverS"可能提供了额外的选项,如自适应箭头大小、比例调整、刻度显示等,以适应不同场景...

    基于Java的高频疲劳试验机监测软件的设计.pdf

    由于采用了平移式曲线呈现方式,使得在数据量增大时,图形的坐标轴刻度可以动态调整,解决了坐标系刻度堆积显示的问题,确保了数据显示的准确性和清晰度。 文章提到,监测软件系统的整体结构包含多个模块,例如数据...

    虚拟仪表—风向表盘(实时显示风向)

    4. **算法与逻辑**:根据输入的风向数据,程序需要计算出指针或箭头的旋转角度。这涉及到角度转换和坐标系的理解,比如从北为0°的角度计算到对应表盘的位置。 5. **性能优化**:考虑到实时性,虚拟仪表必须有良好...

    【图像识别】基于Hough变换指针式仪表识别(倾斜矫正)matlab代码.zip

    这通常通过计算图像的透视变换矩阵实现,将图像校正至水平状态,确保指针与坐标轴平行,以便于后续的分析和识别。 4. **边缘检测**:在图像处理中,边缘检测是找出图像中不同亮度区域交界处的重要技术。Canny、...

    jiyu.rar_图像识别 表盘_表盘 图像_表盘识别_角度识别

    这可能需要运用到几何变换,例如极坐标转换,将直角坐标系下的指针位置转换成与表盘中心相关的角度。同时,考虑到动态环境中的指针可能会有晃动,可能需要使用到运动学模型来估计动态变化。 角度识别的过程中,可能...

    QT串口虚拟示波器

    在QT串口虚拟示波器中,开发者可能使用了某种算法来处理接收到的数据,将其转化为坐标系统中的点,然后利用QGrapicView的绘图功能将这些点连成线,形成波形图像。鼠标拖动功能允许用户在时间轴上移动,查看不同时间...

    ruler view.rar

    8. **设计模式**:为了保持代码的清晰和可维护性,可以采用设计模式,如策略模式来封装标尺的绘制算法,或者观察者模式来处理标尺状态的改变和通知。 总的来说,"ruler view.rar"中的源码可能涵盖了上述一系列技术...

Global site tag (gtag.js) - Google Analytics