UNPKG

wsemi

Version:

A support package for web developer.

533 lines (468 loc) 51.7 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>estimateTicks.mjs - Documentation</title> <script src="scripts/prettify/prettify.js"></script> <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc.css"> <script src="scripts/nav.js" defer></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <input type="checkbox" id="nav-trigger" class="nav-trigger" /> <label for="nav-trigger" class="navicon-button x"> <div class="navicon"></div> </label> <label for="nav-trigger" class="overlay"></label> <nav > <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="wsemi.html">wsemi</a><ul class='methods'><li data-type='method'><a href="wsemi.html#.ab2blob">ab2blob</a></li><li data-type='method'><a href="wsemi.html#.ab2u8arr">ab2u8arr</a></li><li data-type='method'><a href="wsemi.html#.addExcelWorksheetFromData">addExcelWorksheetFromData</a></li><li data-type='method'><a href="wsemi.html#.addMonth">addMonth</a></li><li data-type='method'><a href="wsemi.html#.aes2str">aes2str</a></li><li data-type='method'><a href="wsemi.html#.alive">alive</a></li><li data-type='method'><a href="wsemi.html#.arr2dt">arr2dt</a></li><li data-type='method'><a href="wsemi.html#.arrAccum">arrAccum</a></li><li data-type='method'><a href="wsemi.html#.arrAdd">arrAdd</a></li><li data-type='method'><a href="wsemi.html#.arrAt">arrAt</a></li><li data-type='method'><a href="wsemi.html#.arrDiff">arrDiff</a></li><li data-type='method'><a href="wsemi.html#.arrFilterByKeywords">arrFilterByKeywords</a></li><li data-type='method'><a href="wsemi.html#.arrFilterByNum">arrFilterByNum</a></li><li data-type='method'><a href="wsemi.html#.arrFilterByPnum">arrFilterByPnum</a></li><li data-type='method'><a href="wsemi.html#.arrFilterByPnumAndToLog">arrFilterByPnumAndToLog</a></li><li data-type='method'><a href="wsemi.html#.arrFind">arrFind</a></li><li data-type='method'><a href="wsemi.html#.arrGroupByMaxmin">arrGroupByMaxmin</a></li><li data-type='method'><a href="wsemi.html#.arrHas">arrHas</a></li><li data-type='method'><a href="wsemi.html#.arrInsert">arrInsert</a></li><li data-type='method'><a href="wsemi.html#.arrLookupByMaxmin">arrLookupByMaxmin</a></li><li data-type='method'><a href="wsemi.html#.arrMax">arrMax</a></li><li data-type='method'><a href="wsemi.html#.arrMin">arrMin</a></li><li data-type='method'><a href="wsemi.html#.arrMulti">arrMulti</a></li><li data-type='method'><a href="wsemi.html#.arrNorm">arrNorm</a></li><li data-type='method'><a href="wsemi.html#.arrProduct">arrProduct</a></li><li data-type='method'><a href="wsemi.html#.arrPull">arrPull</a></li><li data-type='method'><a href="wsemi.html#.arrPullAt">arrPullAt</a></li><li data-type='method'><a href="wsemi.html#.arrReduce">arrReduce</a></li><li data-type='method'><a href="wsemi.html#.arrReverse">arrReverse</a></li><li data-type='method'><a href="wsemi.html#.arrSep">arrSep</a></li><li data-type='method'><a href="wsemi.html#.arrSort">arrSort</a></li><li data-type='method'><a href="wsemi.html#.asind">asind</a></li><li data-type='method'><a href="wsemi.html#.atan2d">atan2d</a></li><li data-type='method'><a href="wsemi.html#.atand">atand</a></li><li data-type='method'><a href="wsemi.html#.attstr">attstr</a></li><li data-type='method'><a href="wsemi.html#.b642obj">b642obj</a></li><li data-type='method'><a href="wsemi.html#.b642str">b642str</a></li><li data-type='method'><a href="wsemi.html#.b642u16arr">b642u16arr</a></li><li data-type='method'><a href="wsemi.html#.b642u8arr">b642u8arr</a></li><li data-type='method'><a href="wsemi.html#.binstr">binstr</a></li><li data-type='method'><a href="wsemi.html#.blob2ab">blob2ab</a></li><li data-type='method'><a href="wsemi.html#.blob2b64">blob2b64</a></li><li data-type='method'><a href="wsemi.html#.blob2str">blob2str</a></li><li data-type='method'><a href="wsemi.html#.blob2u8arr">blob2u8arr</a></li><li data-type='method'><a href="wsemi.html#.blobs2b64s">blobs2b64s</a></li><li data-type='method'><a href="wsemi.html#.blobs2u8arrs">blobs2u8arrs</a></li><li data-type='method'><a href="wsemi.html#.bodyLog">bodyLog</a></li><li data-type='method'><a href="wsemi.html#.browserView">browserView</a></li><li data-type='method'><a href="wsemi.html#.browserViewFromBlob">browserViewFromBlob</a></li><li data-type='method'><a href="wsemi.html#.browserViewFromText">browserViewFromText</a></li><li data-type='method'><a href="wsemi.html#.browserViewFromU8arr">browserViewFromU8arr</a></li><li data-type='method'><a href="wsemi.html#.bs2u8arr">bs2u8arr</a></li><li data-type='method'><a href="wsemi.html#.bufRead">bufRead</a></li><li data-type='method'><a href="wsemi.html#.bufReadDbl">bufReadDbl</a></li><li data-type='method'><a href="wsemi.html#.bufWrite">bufWrite</a></li><li data-type='method'><a href="wsemi.html#.bufWriteDbl">bufWriteDbl</a></li><li data-type='method'><a href="wsemi.html#.cache">cache</a></li><li data-type='method'><a href="wsemi.html#.cacheBd">cacheBd</a></li><li data-type='method'><a href="wsemi.html#.cbol">cbol</a></li><li data-type='method'><a href="wsemi.html#.cdbl">cdbl</a></li><li data-type='method'><a href="wsemi.html#.ceil">ceil</a></li><li data-type='method'><a href="wsemi.html#.cfilesize">cfilesize</a></li><li data-type='method'><a href="wsemi.html#.cfinancial">cfinancial</a></li><li data-type='method'><a href="wsemi.html#.cint">cint</a></li><li data-type='method'><a href="wsemi.html#.clearXSS">clearXSS</a></li><li data-type='method'><a href="wsemi.html#.clearXSSDyn">clearXSSDyn</a></li><li data-type='method'><a href="wsemi.html#.color">color</a></li><li data-type='method'><a href="wsemi.html#.composeToTree">composeToTree</a></li><li data-type='method'><a href="wsemi.html#.convertToTree">convertToTree</a></li><li data-type='method'><a href="wsemi.html#.copyStrToClipboard">copyStrToClipboard</a></li><li data-type='method'><a href="wsemi.html#.cosd">cosd</a></li><li data-type='method'><a href="wsemi.html#.cotd">cotd</a></li><li data-type='method'><a href="wsemi.html#.createExcelWorkbook">createExcelWorkbook</a></li><li data-type='method'><a href="wsemi.html#.cscd">cscd</a></li><li data-type='method'><a href="wsemi.html#.cstr">cstr</a></li><li data-type='method'><a href="wsemi.html#.day2cht">day2cht</a></li><li data-type='method'><a href="wsemi.html#.debounce">debounce</a></li><li data-type='method'><a href="wsemi.html#.delay">delay</a></li><li data-type='method'><a href="wsemi.html#.dig">dig</a></li><li data-type='method'><a href="wsemi.html#.digExp">digExp</a></li><li data-type='method'><a href="wsemi.html#.domAlert">domAlert</a></li><li data-type='method'><a href="wsemi.html#.domAppend">domAppend</a></li><li data-type='method'><a href="wsemi.html#.domCancelEvent">domCancelEvent</a></li><li data-type='method'><a href="wsemi.html#.domCompareText">domCompareText</a></li><li data-type='method'><a href="wsemi.html#.domCompareTextDyn">domCompareTextDyn</a></li><li data-type='method'><a href="wsemi.html#.domConvertToPic">domConvertToPic</a></li><li data-type='method'><a href="wsemi.html#.domConvertToPicDyn">domConvertToPicDyn</a></li><li data-type='method'><a href="wsemi.html#.domDetect">domDetect</a></li><li data-type='method'><a href="wsemi.html#.domDrag">domDrag</a></li><li data-type='method'><a href="wsemi.html#.domDragBarAndScroll">domDragBarAndScroll</a></li><li data-type='method'><a href="wsemi.html#.domDragPreview">domDragPreview</a></li><li data-type='method'><a href="wsemi.html#.domDropFiles">domDropFiles</a></li><li data-type='method'><a href="wsemi.html#.domElementsFromPoint">domElementsFromPoint</a></li><li data-type='method'><a href="wsemi.html#.domFadeIn">domFadeIn</a></li><li data-type='method'><a href="wsemi.html#.domFadeOut">domFadeOut</a></li><li data-type='method'><a href="wsemi.html#.domFind">domFind</a></li><li data-type='method'><a href="wsemi.html#.domFinds">domFinds</a></li><li data-type='method'><a href="wsemi.html#.domGetAttr">domGetAttr</a></li><li data-type='method'><a href="wsemi.html#.domGetBoudRect">domGetBoudRect</a></li><li data-type='method'><a href="wsemi.html#.domGetBoudRectRefSelf">domGetBoudRectRefSelf</a></li><li data-type='method'><a href="wsemi.html#.domGetFileAccept">domGetFileAccept</a></li><li data-type='method'><a href="wsemi.html#.domGetFiles">domGetFiles</a></li><li data-type='method'><a href="wsemi.html#.domGetParents">domGetParents</a></li><li data-type='method'><a href="wsemi.html#.domGetPointFromEvent">domGetPointFromEvent</a></li><li data-type='method'><a href="wsemi.html#.domGetScrollableParent">domGetScrollableParent</a></li><li data-type='method'><a href="wsemi.html#.domGetWindowSize">domGetWindowSize</a></li><li data-type='method'><a href="wsemi.html#.domIsClientXYIn">domIsClientXYIn</a></li><li data-type='method'><a href="wsemi.html#.domIsFocused">domIsFocused</a></li><li data-type='method'><a href="wsemi.html#.domIsVisible">domIsVisible</a></li><li data-type='method'><a href="wsemi.html#.domPrepend">domPrepend</a></li><li data-type='method'><a href="wsemi.html#.domRemove">domRemove</a></li><li data-type='method'><a href="wsemi.html#.domRenderMarkdownMind">domRenderMarkdownMind</a></li><li data-type='method'><a href="wsemi.html#.domRenderMarkdownMindDyn">domRenderMarkdownMindDyn</a></li><li data-type='method'><a href="wsemi.html#.domRipple">domRipple</a></li><li data-type='method'><a href="wsemi.html#.domScrollIntoView">domScrollIntoView</a></li><li data-type='method'><a href="wsemi.html#.domScrollTo">domScrollTo</a></li><li data-type='method'><a href="wsemi.html#.domShowImages">domShowImages</a></li><li data-type='method'><a href="wsemi.html#.domShowImagesDyn">domShowImagesDyn</a></li><li data-type='method'><a href="wsemi.html#.domShowInputAndGetFiles">domShowInputAndGetFiles</a></li><li data-type='method'><a href="wsemi.html#.domShowInputAndGetFilesU8Arrs">domShowInputAndGetFilesU8Arrs</a></li><li data-type='method'><a href="wsemi.html#.domShowInputDatatime">domShowInputDatatime</a></li><li data-type='method'><a href="wsemi.html#.domTooltip">domTooltip</a></li><li data-type='method'><a href="wsemi.html#.domTriggerEvent">domTriggerEvent</a></li><li data-type='method'><a href="wsemi.html#.domVirtualCreate">domVirtualCreate</a></li><li data-type='method'><a href="wsemi.html#.domVirtualCreateQueue">domVirtualCreateQueue</a></li><li data-type='method'><a href="wsemi.html#.downloadExcelFileFromData">downloadExcelFileFromData</a></li><li data-type='method'><a href="wsemi.html#.downloadExcelFileFromDataDyn">downloadExcelFileFromDataDyn</a></li><li data-type='method'><a href="wsemi.html#.downloadFileFromB64">downloadFileFromB64</a></li><li data-type='method'><a href="wsemi.html#.downloadFileFromBlob">downloadFileFromBlob</a></li><li data-type='method'><a href="wsemi.html#.downloadFileFromText">downloadFileFromText</a></li><li data-type='method'><a href="wsemi.html#.downloadFileFromU8Arr">downloadFileFromU8Arr</a></li><li data-type='method'><a href="wsemi.html#.dtmapping">dtmapping</a></li><li data-type='method'><a href="wsemi.html#.dtpick">dtpick</a></li><li data-type='method'><a href="wsemi.html#.estimateTicks">estimateTicks</a></li><li data-type='method'><a href="wsemi.html#.evem">evem</a></li><li data-type='method'><a href="wsemi.html#.execProcess">execProcess</a></li><li data-type='method'><a href="wsemi.html#.execProcessKillPid">execProcessKillPid</a></li><li data-type='method'><a href="wsemi.html#.execPyodide">execPyodide</a></li><li data-type='method'><a href="wsemi.html#.execPyodideDyn">execPyodideDyn</a></li><li data-type='method'><a href="wsemi.html#.f2c">f2c</a></li><li data-type='method'><a href="wsemi.html#.filepathToTree">filepathToTree</a></li><li data-type='method'><a href="wsemi.html#.files2data">files2data</a></li><li data-type='method'><a href="wsemi.html#.flattenToConn">flattenToConn</a></li><li data-type='method'><a href="wsemi.html#.flattenTree">flattenTree</a></li><li data-type='method'><a href="wsemi.html#.floor">floor</a></li><li data-type='method'><a href="wsemi.html#.fsBuildReadStreamText">fsBuildReadStreamText</a></li><li data-type='method'><a href="wsemi.html#.fsBuildWriteStreamText">fsBuildWriteStreamText</a></li><li data-type='method'><a href="wsemi.html#.fsCleanFolder">fsCleanFolder</a></li><li data-type='method'><a href="wsemi.html#.fsCleanFolderCore">fsCleanFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsCopyFile">fsCopyFile</a></li><li data-type='method'><a href="wsemi.html#.fsCopyFileCore">fsCopyFileCore</a></li><li data-type='method'><a href="wsemi.html#.fsCopyFolder">fsCopyFolder</a></li><li data-type='method'><a href="wsemi.html#.fsCopyFolderCore">fsCopyFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsCreateFile">fsCreateFile</a></li><li data-type='method'><a href="wsemi.html#.fsCreateFileCore">fsCreateFileCore</a></li><li data-type='method'><a href="wsemi.html#.fsCreateFolder">fsCreateFolder</a></li><li data-type='method'><a href="wsemi.html#.fsCreateFolderCore">fsCreateFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFile">fsDeleteFile</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFileCore">fsDeleteFileCore</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFileSafe">fsDeleteFileSafe</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFileSafeCore">fsDeleteFileSafeCore</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFolder">fsDeleteFolder</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFolderCore">fsDeleteFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFolderSafe">fsDeleteFolderSafe</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFolderSafeCore">fsDeleteFolderSafeCore</a></li><li data-type='method'><a href="wsemi.html#.fsDownloadFile">fsDownloadFile</a></li><li data-type='method'><a href="wsemi.html#.fsDownloadFileCore">fsDownloadFileCore</a></li><li data-type='method'><a href="wsemi.html#.fsEvem">fsEvem</a></li><li data-type='method'><a href="wsemi.html#.fsGetFileBasicHash">fsGetFileBasicHash</a></li><li data-type='method'><a href="wsemi.html#.fsGetFileBasicHashCore">fsGetFileBasicHashCore</a></li><li data-type='method'><a href="wsemi.html#.fsGetFileHash">fsGetFileHash</a></li><li data-type='method'><a href="wsemi.html#.fsGetFileHashCore">fsGetFileHashCore</a></li><li data-type='method'><a href="wsemi.html#.fsGetFileXxHash">fsGetFileXxHash</a></li><li data-type='method'><a href="wsemi.html#.fsGetFileXxHashCore">fsGetFileXxHashCore</a></li><li data-type='method'><a href="wsemi.html#.fsGetFilesInFolder">fsGetFilesInFolder</a></li><li data-type='method'><a href="wsemi.html#.fsGetFilesInFolderCore">fsGetFilesInFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsGetFilesWithHashInFolder">fsGetFilesWithHashInFolder</a></li><li data-type='method'><a href="wsemi.html#.fsGetFilesWithHashInFolderCore">fsGetFilesWithHashInFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsGetFoldersInFolder">fsGetFoldersInFolder</a></li><li data-type='method'><a href="wsemi.html#.fsGetFoldersInFolderCore">fsGetFoldersInFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsIsFile">fsIsFile</a></li><li data-type='method'><a href="wsemi.html#.fsIsFileCore">fsIsFileCore</a></li><li data-type='method'><a href="wsemi.html#.fsIsFolder">fsIsFolder</a></li><li data-type='method'><a href="wsemi.html#.fsIsFolderCore">fsIsFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsMergeFiles">fsMergeFiles</a></li><li data-type='method'><a href="wsemi.html#.fsMergeFilesCore">fsMergeFilesCore</a></li><li data-type='method'><a href="wsemi.html#.fsReadText">fsReadText</a></li><li data-type='method'><a href="wsemi.html#.fsReadTextCore">fsReadTextCore</a></li><li data-type='method'><a href="wsemi.html#.fsRenameFile">fsRenameFile</a></li><li data-type='method'><a href="wsemi.html#.fsRenameFileCore">fsRenameFileCore</a></li><li data-type='method'><a href="wsemi.html#.fsRenameFolder">fsRenameFolder</a></li><li data-type='method'><a href="wsemi.html#.fsRenameFolderCore">fsRenameFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsSrlog">fsSrlog</a></li><li data-type='method'><a href="wsemi.html#.fsTask">fsTask</a></li><li data-type='method'><a href="wsemi.html#.fsTreeFolder">fsTreeFolder</a></li><li data-type='method'><a href="wsemi.html#.fsTreeFolderCore">fsTreeFolderCore</a></li><li data-type='method'><a href="wsemi.html#.fsWatchFile">fsWatchFile</a></li><li data-type='method'><a href="wsemi.html#.fsWatchFolder">fsWatchFolder</a></li><li data-type='method'><a href="wsemi.html#.fsWriteText">fsWriteText</a></li><li data-type='method'><a href="wsemi.html#.fsWriteTextCore">fsWriteTextCore</a></li><li data-type='method'><a href="wsemi.html#.genGradientColor">genGradientColor</a></li><li data-type='method'><a href="wsemi.html#.genID">genID</a></li><li data-type='method'><a href="wsemi.html#.genIDSeq">genIDSeq</a></li><li data-type='method'><a href="wsemi.html#.genPm">genPm</a></li><li data-type='method'><a href="wsemi.html#.getBufferSize">getBufferSize</a></li><li data-type='method'><a href="wsemi.html#.getClearPathName">getClearPathName</a></li><li data-type='method'><a href="wsemi.html#.getCsvStrFromData">getCsvStrFromData</a></li><li data-type='method'><a href="wsemi.html#.getDataFromExcelFileU8Arr">getDataFromExcelFileU8Arr</a></li><li data-type='method'><a href="wsemi.html#.getDataFromExcelFileU8ArrDyn">getDataFromExcelFileU8ArrDyn</a></li><li data-type='method'><a href="wsemi.html#.getEnv">getEnv</a></li><li data-type='method'><a href="wsemi.html#.getExcelU8ArrFromData">getExcelU8ArrFromData</a></li><li data-type='method'><a href="wsemi.html#.getExcelU8ArrFromWorkbook">getExcelU8ArrFromWorkbook</a></li><li data-type='method'><a href="wsemi.html#.getExcelWorkbookFromData">getExcelWorkbookFromData</a></li><li data-type='method'><a href="wsemi.html#.getExcelWorkbookFromWorksheet">getExcelWorkbookFromWorksheet</a></li><li data-type='method'><a href="wsemi.html#.getExcelWorksheetFromData">getExcelWorksheetFromData</a></li><li data-type='method'><a href="wsemi.html#.getFileAccept">getFileAccept</a></li><li data-type='method'><a href="wsemi.html#.getFileBasicHash">getFileBasicHash</a></li><li data-type='method'><a href="wsemi.html#.getFileHash">getFileHash</a></li><li data-type='method'><a href="wsemi.html#.getFileName">getFileName</a></li><li data-type='method'><a href="wsemi.html#.getFileNameExt">getFileNameExt</a></li><li data-type='method'><a href="wsemi.html#.getFileTrueName">getFileTrueName</a></li><li data-type='method'><a href="wsemi.html#.getFileType">getFileType</a></li><li data-type='method'><a href="wsemi.html#.getFileXxHash">getFileXxHash</a></li><li data-type='method'><a href="wsemi.html#.getGlobal">getGlobal</a></li><li data-type='method'><a href="wsemi.html#.getObjSize">getObjSize</a></li><li data-type='method'><a href="wsemi.html#.getPathParent">getPathParent</a></li><li data-type='method'><a href="wsemi.html#.getTimeBetween">getTimeBetween</a></li><li data-type='method'><a href="wsemi.html#.getTimeFromUnit">getTimeFromUnit</a></li><li data-type='method'><a href="wsemi.html#.getTimeHp">getTimeHp</a></li><li data-type='method'><a href="wsemi.html#.getTimeObject">getTimeObject</a></li><li data-type='method'><a href="wsemi.html#.getTimeRange">getTimeRange</a></li><li data-type='method'><a href="wsemi.html#.getUserAgent">getUserAgent</a></li><li data-type='method'><a href="wsemi.html#.getUserAgentDyn">getUserAgentDyn</a></li><li data-type='method'><a href="wsemi.html#.getltdtkeys">getltdtkeys</a></li><li data-type='method'><a href="wsemi.html#.haskey">haskey</a></li><li data-type='method'><a href="wsemi.html#.html2pic">html2pic</a></li><li data-type='method'><a href="wsemi.html#.html2picDyn">html2picDyn</a></li><li data-type='method'><a href="wsemi.html#.html2str">html2str</a></li><li data-type='method'><a href="wsemi.html#.html2strDyn">html2strDyn</a></li><li data-type='method'><a href="wsemi.html#.htmlDecode">htmlDecode</a></li><li data-type='method'><a href="wsemi.html#.htmlEncode">htmlEncode</a></li><li data-type='method'><a href="wsemi.html#.importResources">importResources</a></li><li data-type='method'><a href="wsemi.html#.interp1">interp1</a></li><li data-type='method'><a href="wsemi.html#.isDate">isDate</a></li><li data-type='method'><a href="wsemi.html#.isDev">isDev</a></li><li data-type='method'><a href="wsemi.html#.isEle">isEle</a></li><li data-type='method'><a href="wsemi.html#.isEleExistByID">isEleExistByID</a></li><li data-type='method'><a href="wsemi.html#.isEmail">isEmail</a></li><li data-type='method'><a href="wsemi.html#.isErr">isErr</a></li><li data-type='method'><a href="wsemi.html#.isIE">isIE</a></li><li data-type='method'><a href="wsemi.html#.isNarrow">isNarrow</a></li><li data-type='method'><a href="wsemi.html#.isStrHasCapital">isStrHasCapital</a></li><li data-type='method'><a href="wsemi.html#.isStrHasLowerCase">isStrHasLowerCase</a></li><li data-type='method'><a href="wsemi.html#.isStrHasNumber">isStrHasNumber</a></li><li data-type='method'><a href="wsemi.html#.isUserIdentify">isUserIdentify</a></li><li data-type='method'><a href="wsemi.html#.isUserName">isUserName</a></li><li data-type='method'><a href="wsemi.html#.isUserPW">isUserPW</a></li><li data-type='method'><a href="wsemi.html#.isWindow">isWindow</a></li><li data-type='method'><a href="wsemi.html#.isab">isab</a></li><li data-type='method'><a href="wsemi.html#.isarr">isarr</a></li><li data-type='method'><a href="wsemi.html#.isarr0">isarr0</a></li><li data-type='method'><a href="wsemi.html#.isblob">isblob</a></li><li data-type='method'><a href="wsemi.html#.isbol">isbol</a></li><li data-type='method'><a href="wsemi.html#.isday">isday</a></li><li data-type='method'><a href="wsemi.html#.isearr">isearr</a></li><li data-type='method'><a href="wsemi.html#.iseobj">iseobj</a></li><li data-type='method'><a href="wsemi.html#.iser">iser</a></li><li data-type='method'><a href="wsemi.html#.isernot">isernot</a></li><li data-type='method'><a href="wsemi.html#.isestr">isestr</a></li><li data-type='method'><a href="wsemi.html#.isfile">isfile</a></li><li data-type='method'><a href="wsemi.html#.isfun">isfun</a></li><li data-type='method'><a href="wsemi.html#.isint">isint</a></li><li data-type='method'><a href="wsemi.html#.ismonth">ismonth</a></li><li data-type='method'><a href="wsemi.html#.isn0int">isn0int</a></li><li data-type='method'><a href="wsemi.html#.isn0num">isn0num</a></li><li data-type='method'><a href="wsemi.html#.isnan">isnan</a></li><li data-type='method'><a href="wsemi.html#.isnbr">isnbr</a></li><li data-type='method'><a href="wsemi.html#.isnint">isnint</a></li><li data-type='method'><a href="wsemi.html#.isnnum">isnnum</a></li><li data-type='method'><a href="wsemi.html#.isnull">isnull</a></li><li data-type='method'><a href="wsemi.html#.isnum">isnum</a></li><li data-type='method'><a href="wsemi.html#.isobj">isobj</a></li><li data-type='method'><a href="wsemi.html#.isobj0">isobj0</a></li><li data-type='method'><a href="wsemi.html#.isp0int">isp0int</a></li><li data-type='method'><a href="wsemi.html#.isp0num">isp0num</a></li><li data-type='method'><a href="wsemi.html#.ispint">ispint</a></li><li data-type='method'><a href="wsemi.html#.ispm">ispm</a></li><li data-type='method'><a href="wsemi.html#.ispnum">ispnum</a></li><li data-type='method'><a href="wsemi.html#.isstr">isstr</a></li><li data-type='method'><a href="wsemi.html#.isstr0">isstr0</a></li><li data-type='method'><a href="wsemi.html#.istime">istime</a></li><li data-type='method'><a href="wsemi.html#.istimeTZ">istimeTZ</a></li><li data-type='method'><a href="wsemi.html#.istimems">istimems</a></li><li data-type='method'><a href="wsemi.html#.istimemsTZ">istimemsTZ</a></li><li data-type='method'><a href="wsemi.html#.isu16arr">isu16arr</a></li><li data-type='method'><a href="wsemi.html#.isu8arr">isu8arr</a></li><li data-type='method'><a href="wsemi.html#.isundefined">isundefined</a></li><li data-type='method'><a href="wsemi.html#.j2o">j2o</a></li><li data-type='method'><a href="wsemi.html#.judge">judge</a></li><li data-type='method'><a href="wsemi.html#.keysmat2ltdt">keysmat2ltdt</a></li><li data-type='method'><a href="wsemi.html#.log">log</a></li><li data-type='method'><a href="wsemi.html#.ltdt2vrtsable">ltdt2vrtsable</a></li><li data-type='method'><a href="wsemi.html#.ltdtDiff">ltdtDiff</a></li><li data-type='method'><a href="wsemi.html#.ltdtDiffByKey">ltdtDiffByKey</a></li><li data-type='method'><a href="wsemi.html#.ltdtkeys2mat">ltdtkeys2mat</a></li><li data-type='method'><a href="wsemi.html#.ltdtkeysheads2mat">ltdtkeysheads2mat</a></li><li data-type='method'><a href="wsemi.html#.ltdtmapping">ltdtmapping</a></li><li data-type='method'><a href="wsemi.html#.ltdtmerge">ltdtmerge</a></li><li data-type='method'><a href="wsemi.html#.ltdtpick">ltdtpick</a></li><li data-type='method'><a href="wsemi.html#.ltdtpull">ltdtpull</a></li><li data-type='method'><a href="wsemi.html#.mat2ltdt">mat2ltdt</a></li><li data-type='method'><a href="wsemi.html#.matConcat">matConcat</a></li><li data-type='method'><a href="wsemi.html#.matDiff">matDiff</a></li><li data-type='method'><a href="wsemi.html#.matat">matat</a></li><li data-type='method'><a href="wsemi.html#.now2str">now2str</a></li><li data-type='method'><a href="wsemi.html#.now2strp">now2strp</a></li><li data-type='method'><a href="wsemi.html#.nowDay2str">nowDay2str</a></li><li data-type='method'><a href="wsemi.html#.nowms2str">nowms2str</a></li><li data-type='method'><a href="wsemi.html#.nowms2strp">nowms2strp</a></li><li data-type='method'><a href="wsemi.html#.o2j">o2j</a></li><li data-type='method'><a href="wsemi.html#.obj2b64">obj2b64</a></li><li data-type='method'><a href="wsemi.html#.obj2pb64">obj2pb64</a></li><li data-type='method'><a href="wsemi.html#.obj2str">obj2str</a></li><li data-type='method'><a href="wsemi.html#.obj2stru8arr">obj2stru8arr</a></li><li data-type='method'><a href="wsemi.html#.obj2u8arr">obj2u8arr</a></li><li data-type='method'><a href="wsemi.html#.objSortBy">objSortBy</a></li><li data-type='method'><a href="wsemi.html#.objSortByKeys">objSortByKeys</a></li><li data-type='method'><a href="wsemi.html#.ocr">ocr</a></li><li data-type='method'><a href="wsemi.html#.ocrDyn">ocrDyn</a></li><li data-type='method'><a href="wsemi.html#.oo">oo</a></li><li data-type='method'><a href="wsemi.html#.openLink">openLink</a></li><li data-type='method'><a href="wsemi.html#.pb642obj">pb642obj</a></li><li data-type='method'><a href="wsemi.html#.pmChain">pmChain</a></li><li data-type='method'><a href="wsemi.html#.pmConvertResolve">pmConvertResolve</a></li><li data-type='method'><a href="wsemi.html#.pmDebounce">pmDebounce</a></li><li data-type='method'><a href="wsemi.html#.pmHook">pmHook</a></li><li data-type='method'><a href="wsemi.html#.pmHookReject">pmHookReject</a></li><li data-type='method'><a href="wsemi.html#.pmIni">pmIni</a></li><li data-type='method'><a href="wsemi.html#.pmInvResolve">pmInvResolve</a></li><li data-type='method'><a href="wsemi.html#.pmMap">pmMap</a></li><li data-type='method'><a href="wsemi.html#.pmQueue">pmQueue</a></li><li data-type='method'><a href="wsemi.html#.pmSeries">pmSeries</a></li><li data-type='method'><a href="wsemi.html#.pmThrottle">pmThrottle</a></li><li data-type='method'><a href="wsemi.html#.preciseNum">preciseNum</a></li><li data-type='method'><a href="wsemi.html#.pseudoRandom">pseudoRandom</a></li><li data-type='method'><a href="wsemi.html#.pseudoRandomIntRange">pseudoRandomIntRange</a></li><li data-type='method'><a href="wsemi.html#.pseudoRandomIntsNdpRange">pseudoRandomIntsNdpRange</a></li><li data-type='method'><a href="wsemi.html#.pseudoRandomIntsRange">pseudoRandomIntsRange</a></li><li data-type='method'><a href="wsemi.html#.pseudoRandomRange">pseudoRandomRange</a></li><li data-type='method'><a href="wsemi.html#.pseudoRandomsRange">pseudoRandomsRange</a></li><li data-type='method'><a href="wsemi.html#.queue">queue</a></li><li data-type='method'><a href="wsemi.html#.random">random</a></li><li data-type='method'><a href="wsemi.html#.randomIntRange">randomIntRange</a></li><li data-type='method'><a href="wsemi.html#.randomIntsNdpRange">randomIntsNdpRange</a></li><li data-type='method'><a href="wsemi.html#.randomIntsRange">randomIntsRange</a></li><li data-type='method'><a href="wsemi.html#.randomRange">randomRange</a></li><li data-type='method'><a href="wsemi.html#.randomsRange">randomsRange</a></li><li data-type='method'><a href="wsemi.html#.rang">rang</a></li><li data-type='method'><a href="wsemi.html#.rep">rep</a></li><li data-type='method'><a href="wsemi.html#.repObj">repObj</a></li><li data-type='method'><a href="wsemi.html#.replace">replace</a></li><li data-type='method'><a href="wsemi.html#.replaceObj">replaceObj</a></li><li data-type='method'><a href="wsemi.html#.replacePlus">replacePlus</a></li><li data-type='method'><a href="wsemi.html#.round">round</a></li><li data-type='method'><a href="wsemi.html#.secd">secd</a></li><li data-type='method'><a href="wsemi.html#.sep">sep</a></li><li data-type='method'><a href="wsemi.html#.sepInt">sepInt</a></li><li data-type='method'><a href="wsemi.html#.setIntervalHp">setIntervalHp</a></li><li data-type='method'><a href="wsemi.html#.setTimeoutHp">setTimeoutHp</a></li><li data-type='method'><a href="wsemi.html#.sind">sind</a></li><li data-type='method'><a href="wsemi.html#.split">split</a></li><li data-type='method'><a href="wsemi.html#.str2aes">str2aes</a></li><li data-type='method'><a href="wsemi.html#.str2b64">str2b64</a></li><li data-type='method'><a href="wsemi.html#.str2hint">str2hint</a></li><li data-type='method'><a href="wsemi.html#.str2md5">str2md5</a></li><li data-type='method'><a href="wsemi.html#.str2obj">str2obj</a></li><li data-type='method'><a href="wsemi.html#.str2sha512">str2sha512</a></li><li data-type='method'><a href="wsemi.html#.str2u8arr">str2u8arr</a></li><li data-type='method'><a href="wsemi.html#.strCompare">strCompare</a></li><li data-type='method'><a href="wsemi.html#.strDiff">strDiff</a></li><li data-type='method'><a href="wsemi.html#.strFindFuzz">strFindFuzz</a></li><li data-type='method'><a href="wsemi.html#.strFindFuzzDyn">strFindFuzzDyn</a></li><li data-type='method'><a href="wsemi.html#.strFindSimilar">strFindSimilar</a></li><li data-type='method'><a href="wsemi.html#.strdelleft">strdelleft</a></li><li data-type='method'><a href="wsemi.html#.strdelright">strdelright</a></li><li data-type='method'><a href="wsemi.html#.strleft">strleft</a></li><li data-type='method'><a href="wsemi.html#.strmid">strmid</a></li><li data-type='method'><a href="wsemi.html#.strright">strright</a></li><li data-type='method'><a href="wsemi.html#.stru8arr2obj">stru8arr2obj</a></li><li data-type='method'><a href="wsemi.html#.tand">tand</a></li><li data-type='method'><a href="wsemi.html#.time2day">time2day</a></li><li data-type='method'><a href="wsemi.html#.time2hour">time2hour</a></li><li data-type='method'><a href="wsemi.html#.time2min">time2min</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2day">timeTZ2day</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2expire">timeTZ2expire</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2hour">timeTZ2hour</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2min">timeTZ2min</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2past">timeTZ2past</a></li><li data-type='method'><a href="wsemi.html#.timems2day">timems2day</a></li><li data-type='method'><a href="wsemi.html#.timems2hour">timems2hour</a></li><li data-type='method'><a href="wsemi.html#.timems2min">timems2min</a></li><li data-type='method'><a href="wsemi.html#.timems2time">timems2time</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2day">timemsTZ2day</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2expire">timemsTZ2expire</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2hour">timemsTZ2hour</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2min">timemsTZ2min</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2past">timemsTZ2past</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2time">timemsTZ2time</a></li><li data-type='method'><a href="wsemi.html#.treeObj">treeObj</a></li><li data-type='method'><a href="wsemi.html#.treeToFilepath">treeToFilepath</a></li><li data-type='method'><a href="wsemi.html#.trim">trim</a></li><li data-type='method'><a href="wsemi.html#.u16arr2b64">u16arr2b64</a></li><li data-type='method'><a href="wsemi.html#.u16arr2u8arr">u16arr2u8arr</a></li><li data-type='method'><a href="wsemi.html#.u8arr2ab">u8arr2ab</a></li><li data-type='method'><a href="wsemi.html#.u8arr2b64">u8arr2b64</a></li><li data-type='method'><a href="wsemi.html#.u8arr2blob">u8arr2blob</a></li><li data-type='method'><a href="wsemi.html#.u8arr2bs">u8arr2bs</a></li><li data-type='method'><a href="wsemi.html#.u8arr2obj">u8arr2obj</a></li><li data-type='method'><a href="wsemi.html#.u8arr2str">u8arr2str</a></li><li data-type='method'><a href="wsemi.html#.u8arr2u16arr">u8arr2u16arr</a></li><li data-type='method'><a href="wsemi.html#.urlParse">urlParse</a></li><li data-type='method'><a href="wsemi.html#.verifyValue">verifyValue</a></li><li data-type='method'><a href="wsemi.html#.waitFun">waitFun</a></li></ul></li></ul> </nav> <div id="main"> <h1 class="page-title">estimateTicks.mjs</h1> <section> <article> <pre class="prettyprint source linenums"><code>import get from 'lodash-es/get.js' import each from 'lodash-es/each.js' import range from 'lodash-es/range.js' import first from 'lodash-es/first.js' import last from 'lodash-es/last.js' import sortBy from 'lodash-es/sortBy.js' import filter from 'lodash-es/filter.js' import isnum from './isnum.mjs' import isearr from './isearr.mjs' import isint from './isint.mjs' import cdbl from './cdbl.mjs' import round from './round.mjs' import ceil from './ceil.mjs' import preciseNum from './preciseNum.mjs' let norm = (v) => { let b = 1 if (v &lt; 0) { b = -1 } v = Math.abs(v) let rr = null if (v &lt; 0.1) { for (let i = 1; i &lt; 16; i++) { let r = Math.pow(10, i) v *= r if (v &lt; 1) { rr = { r: 1 / r, //乘值恢復v v: b * v, } break } } } else if (v &lt; 1) { return { r: 1, //乘值恢復v v: b * v, } } else if (v >= 1) { for (let i = 1; i &lt; 16; i++) { let r = Math.pow(10, i) v /= r if (v &lt; 1) { rr = { r, //乘值恢復v v: b * v, } break } } } if (rr === null) { throw new Error(`can not normalize v[${v}]`) } return rr } /** * 給予最小與最大值,估計適合的繪圖刻度 * * Unit Test: {@link https://github.com/yuda-lyu/./blob/master/test/estimateTicks.test.mjs Github} * @memberOf wsemi * @param {Number|String} rmin 輸入數字或字串 * @param {Number|String} rmax 輸入數字或字串 * @param {Object} [opt={}] 輸入設定物件,預設{} * @param {Array} [opt.testTickNums=[3, 4, 5]] 輸入可供測試刻度數量陣列,預設[3, 4, 5] * @returns {Object} 回傳繪圖刻度物件,包含刻度數量tickNum、刻度間距tickInterval、刻度位置tickPositions * @example * * let rmin = null * let rmax = null * let r = null * * // -4.66~-3.11 * rmin = -4.66 * rmax = -3.11 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin -4.66 rmax -3.11 r { tickNum: 3, tickInterval: 0.8, tickPositions: [ -4.7, -3.9, -3.1 ], tickDig: 1 } * * // 0~0.9 * rmin = 0 * rmax = 0.9 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0 rmax 0.9 r { tickNum: 3, tickInterval: 0.5, tickPositions: [ 0, 0.5, 1 ], tickDig: 1 } * * // 0~1 * rmin = 0 * rmax = 1 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0 rmax 1 r { tickNum: 3, tickInterval: 0.5, tickPositions: [ 0, 0.5, 1 ], tickDig: 1 } * * // 0~99 * rmin = 0 * rmax = 99 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0 rmax 99 r { tickNum: 3, tickInterval: 50, tickPositions: [ 0, 50, 100 ], tickDig: 0 } * * // 0~100 * rmin = 0 * rmax = 100 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0 rmax 100 r { tickNum: 3, tickInterval: 50, tickPositions: [ 0, 50, 100 ], tickDig: 0 } * * // 0.1~0.9 * rmin = 0.1 * rmax = 0.9 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.1 rmax 0.9 r { tickNum: 3, tickInterval: 0.4, tickPositions: [ 0.1, 0.5, 0.9 ], tickDig: 1 } * * // 0.1~1 * rmin = 0.1 * rmax = 1 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.1 rmax 1 r { tickNum: 3, tickInterval: 0.5, tickPositions: [ 0, 0.5, 1 ], tickDig: 1 } * * // 0.1~99 * rmin = 0.1 * rmax = 99 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.1 rmax 99 r { tickNum: 3, tickInterval: 50, tickPositions: [ 0, 50, 100 ], tickDig: 0 } * * // 0.1~100 * rmin = 0.1 * rmax = 100 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.1 rmax 100 r { tickNum: 3, tickInterval: 50, tickPositions: [ 0, 50, 100 ], tickDig: 0 } * * // 0.1~100.1 * rmin = 0.1 * rmax = 100.1 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.1 rmax 100.1 r { tickNum: 4, tickInterval: 34, tickPositions: [ 0, 34, 68, 102 ], tickDig: 0 } * * // 0.89~0.9 * rmin = 0.89 * rmax = 0.9 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.89 rmax 0.9 r { tickNum: 3, tickInterval: 0.01, tickPositions: [ 0.88, 0.89, 0.9 ], tickDig: 1 } * * // 0.89~1 * rmin = 0.89 * rmax = 1 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.89 rmax 1 r { tickNum: 3, tickInterval: 0.1, tickPositions: [ 0.8, 0.9, 1 ], tickDig: 1 } * * // 0.89~99 * rmin = 0.89 * rmax = 99 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.89 rmax 99 r { tickNum: 3, tickInterval: 50, tickPositions: [ 0, 50, 100 ], tickDig: 0 } * * // 0.89~100 * rmin = 0.89 * rmax = 100 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.89 rmax 100 r { tickNum: 3, tickInterval: 50, tickPositions: [ 0, 50, 100 ], tickDig: 0 } * * // 0.89~100.89 * rmin = 0.89 * rmax = 100.89 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 0.89 rmax 100.89 r { tickNum: 4, tickInterval: 34, tickPositions: [ 0, 34, 68, 102 ], tickDig: 0 } * * // 50.89~99 * rmin = 50.89 * rmax = 99 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 50.89 rmax 99 r { tickNum: 3, tickInterval: 25, tickPositions: [ 50, 75, 100 ], tickDig: 0 } * * // 50.89~100 * rmin = 50.89 * rmax = 100 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 50.89 rmax 100 r { tickNum: 3, tickInterval: 25, tickPositions: [ 50, 75, 100 ], tickDig: 0 } * * // 90.89~99 * rmin = 90.89 * rmax = 99 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 90.89 rmax 99 r { tickNum: 4, tickInterval: 3, tickPositions: [ 90, 93, 96, 99 ], tickDig: 0 } * * // 90.89~100 * rmin = 90.89 * rmax = 100 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 90.89 rmax 100 r { tickNum: 3, tickInterval: 5, tickPositions: [ 90, 95, 100 ], tickDig: 0 } * * // 98.9~99 * rmin = 98.9 * rmax = 99 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 98.9 rmax 99 r { tickNum: 3, tickInterval: 1, tickPositions: [ 98, 99, 100 ], tickDig: 0 } * * // 98.9~100 * rmin = 98.9 * rmax = 100 * r = estimateTicks(rmin, rmax) * console.log('rmin', rmin, 'rmax', rmax, 'r', r) * // => rmin 98.9 rmax 100 r { tickNum: 3, tickInterval: 1, tickPositions: [ 98, 99, 100 ], tickDig: 0 } * */ function estimateTicks(rmin, rmax, opt = {}) { //check rmin if (!isnum(rmin)) { throw new Error(`rmin is not a number`) } rmin = cdbl(rmin) //check rmax if (!isnum(rmax)) { throw new Error(`rmax is not a number`) } rmax = cdbl(rmax) //check rmin=rmax if (rmin === rmax) { let tickInterval = null if (rmin === 0) { tickInterval = 1 } else { tickInterval = Math.abs(rmin / 10) } let tickDig = preciseNum(tickInterval, { returnDigit: true }) // console.log('tickDig', tickDig) tickInterval = round(tickInterval, tickDig) return { tickNum: 3, tickInterval, tickPositions: [rmin - tickInterval, rmin, rmin + tickInterval], tickDig, } } //check rmin>rmax if (rmin > rmax) { throw new Error(`rmin[${rmin}] > rmax[${rmax}]`) } //testTickNums let testTickNums = get(opt, 'testTickNums') if (!isearr(testTickNums)) { testTickNums = [3, 4, 5] } let vmin = rmin let vmax = rmax // console.log('vmin', vmin) // console.log('vmax', vmax) let nmMin = norm(vmin) let nmMax = norm(vmax) let rat = Math.max(nmMin.r, nmMax.r) let irat = Math.log10(rat) // console.log('rat', rat, 'irat', irat, 'nmMin.r', nmMin.r, 'nmMax.r', nmMax.r) let yMin = vmin / rat let yMax = vmax / rat // console.log('yMin', yMin) // console.log('yMax', yMax) let yCenter = (yMin + yMax) / 2 // console.log('yCenter', yCenter) let yRng = yMax - yMin // console.log('yRng', yRng) let tks = [] each(testTickNums, (tickNum) => { // console.log('tickNum', tickNum) let yIntrv = yRng / (tickNum - 1) // console.log('yIntrv', yIntrv) // let yIntrvStr = preciseNum(yIntrv) // console.log('yIntrvStr', yIntrvStr) let yIntrvIdg = preciseNum(yIntrv, { returnDigit: true }) // console.log('yIntrvIdg', yIntrvIdg) //限制yIntrvIdg, 因數據已正規化, 只選擇小數位2位以內去測試 yIntrvIdg = Math.min(yIntrvIdg, 2) //testIdgs let testIdgs = range(yIntrvIdg, -1, -1) // console.log('testIdgs', testIdgs) each(testIdgs, (idg) => { // console.log('idg', idg) //idgTrue let idgTrue = idg - irat idgTrue = Math.max(idgTrue, 0) // console.log('idgTrue', idgTrue) //間距取指定位數之大值 let testTickInterval = ceil(yIntrv, idg) // console.log('testTickInterval', testTickInterval) //testTickIntervalDown let testTickIntervalDown = testTickInterval - 1 / Math.pow(10, idg) testTickIntervalDown = round(testTickIntervalDown, idg) // console.log('testTickIntervalDown', testTickIntervalDown) //testTickIntervalUp let testTickIntervalUp = testTickInterval + 1 / Math.pow(10, idg) testTickIntervalUp = round(testTickIntervalUp, idg) // console.log('testTickIntervalUp', testTickIntervalUp) //testTickIntervals, 添加上下同小數位數之間距 let testTickIntervals = [ testTickIntervalDown, testTickInterval, testTickIntervalUp, ] testTickIntervals = filter(testTickIntervals, (v) => { return v > 0 }) // console.log('testTickIntervals', testTickIntervals) //重新指定數據中點 let testCenter = round(yCenter, idg) // console.log('testCenter', testCenter) //testCenterDown let testCenterDown = testCenter - 1 / Math.pow(10, idg) testCenterDown = round(testCenterDown, idg) // console.log('testCenterDown', testCenterDown) //testCenterUp let testCenterUp = testCenter + 1 / Math.pow(10, idg) testCenterUp = round(testCenterUp, idg) // console.log('testCenterUp', testCenterUp) //testCenters, 添加上下同小數位數之數據中點 let testCenters = [ testCenterDown, testCenter, testCenterUp, ] // console.log('testCenters', testCenters) each(testTickIntervals, (tickInterval) => { //tickIntervalTrue let tickIntervalTrue = rat * tickInterval tickIntervalTrue = round(tickIntervalTrue, idgTrue) // console.log('tickIntervalTrue', tickIntervalTrue) each(testCenters, (rngCenter) => { //tickPositions, tickPositionsTrue let tickPositions = [] let tickPositionsTrue = [] if (true) { let tickNumHalf = (tickNum - 1) / 2 let tMin = rngCenter - tickNumHalf * tickInterval for (let i = 0; i &lt; tickNum; i++) { let v = tMin + i * tickInterval v = round(v, idg) tickPositions.push(v) let vTrue = rat * v vTrue = round(vTrue, idgTrue) tickPositionsTrue.push(vTrue) } } // console.log('tickPositions', tickPositions) //minTick let minTick = first(tickPositions) // console.log('minTick', minTick) //maxTick let maxTick = last(tickPositions) // console.log('maxTick', maxTick) //check if (minTick > yMin || maxTick &lt; yMax) { return true //跳出換下一個 } //overMin let overMin = (yMin - minTick) / yRng // console.log('overMin', overMin) //overMax let overMax = (maxTick - yMax) / yRng // console.log('overMax', overMax) //rd let rd = (overMin + overMax) / 2 // console.log('rd', rd) //numInt, 真實刻度值為整數時, 降低權重 let numInt = 0 each(tickPositionsTrue, (v) => { if (isint(v)) { numInt++ } }) let ratInt = numInt / tickNum // console.log('numInt', numInt) // console.log('ratInt', ratInt) //num0, 正規化刻度值為0時, 降低權重 let num0 = 0 each(tickPositions, (v) => { if (v === 0) { num0++ } }) let rat0 = num0 / tickNum // console.log('num0', num0) // console.log('rat0', rat0) //num5, 正規化刻度值為5,50,500...等序列時, 降低權重 let num5 = 0 each(tickPositions, (v) => { if (v === 0.5) { num5++ } }) let rat5 = num5 / tickNum // console.log('num5', num5) // console.log('rat5', rat5) //num10, 正規化刻度值為10,100,1000...等序列時, 降低權重 let num10 = 0 each(tickPositions, (v) => { if (v === 1) { num10++ } }) let rat10 = num10 / tickNum // console.log('num10', num10) // console.log('rat10', rat10) //fitness, 適應函數值 let fitness = rd + (idg * 0.2) + (tickNum * 0.1) + (overMin * 1.5) + (overMax * 1.5) + (1 - ratInt * 0.25) + (1 - rat0 * 0.4) + (1 - rat5 * 0.3) + (1 - rat10 * 0.3) //tk let tk = { diff: rd, rngCenter, numInt, ratInt, num0, rat0, num5, rat5, num10, rat10, overMin, overMax, fitness, idg, tickNum, _tickDig: idg, // __tickInterval: yIntrv, _tickInterval: tickInterval,