/** * utils/penDataHandle.js * create: kimswang * date: 2018-10-18 */ import PatchOffset from './PatchOffset' var utils = require('./utils.js'); var bleConstants = require('./bleConstants.js'); var dotDataCorrector = require('./dotDataCorrector.js'); // var receivedPenData = require('../utils/receivePenData.js'); var event = require('./event.js'); //var edit = require('../page/edit/edit.js'); // global common variable //2022-06-09 chende //是否偏移 let isOffset = true let patchOffset = null event.on('isOffset', null, (data) => { isOffset = data.offset patchOffset = new PatchOffset(130, data.codeType) console.log('sdk是否修偏移', isOffset) console.log('12*12 | 16*16', data.codeType) }) // 存储最有一个move点 var gLastMoveDot = { counter: 0, // 点计数 sectionID: 0, // 区域ID ownerID: 0, // 客户ID bookID: 0, // 书号 pageID: 0, // 页号 timeLong: '2010-01-01 00:00:00,000', // 当前点的RTC 时间,返回时间戳 ms(起止时间是2018-01-01 00:00:00,000) x: 0, // 点横坐标,整数部分 y: 0, // 点纵坐标,整数部分 fx: 0.0, // 点横坐标,小数部分 fy: 0.0, // 点纵坐标,小数部分 ab_x: 0.0, // 点横坐标,整数+小数部分 ab_y: 0.0, // 点纵坐标,整数+小数部分 dotType: "", force: 0, // 点的压力值 angle: 0, // 点的角度值 color: 0, // 笔的颜色值 }; // 存储最有一个倒数第二个move点 var gpreMoveDot = { counter: 0, // 点计数 sectionID: 0, // 区域ID ownerID: 0, // 客户ID bookID: 0, // 书号 pageID: 0, // 页号 timeLong: '2010-01-01 00:00:00,000', // 当前点的RTC 时间,返回时间戳 ms(起止时间是2018-01-01 00:00:00,000) x: 0, // 点横坐标,整数部分 y: 0, // 点纵坐标,整数部分 fx: 0.0, // 点横坐标,小数部分 fy: 0.0, // 点纵坐标,小数部分 ab_x: 0.0, // 点横坐标,整数+小数部分 ab_y: 0.0, // 点纵坐标,整数+小数部分 dotType: "", force: 0, // 点的压力值 angle: 0, // 点的角度值 color: 0, // 笔的颜色值 }; // split data var gAbsX, gAbsY, gAbsfx, gAbsfy; var gPreCX, gPreCY, gPreCfx, gPreCfy; var gx1, gx2, gx3; var gy1, gy2, gy3; var gAbsXM, gAbsYM; var gbPenUpGot = false; var gPenUpPtNo = 0; var g_CompressData = new Array(62); var gxSID, gxOID, gxBID, gxPID; var gySID, gyOID, gyBID, gyPID; var gAbsXT, gAbsYT; var gSID, gOID, gBID, gPID; var gbFirstMove = false; var gbLastMove = false; var gbAddUpPt = false; var gLastMoveX; var gLastMoveY; var gLastMoveDist; var gMUpX, gMUpY; var gUpCnt = 0; var gbPrePtExist = false; var gbPreAngleExist = false; var gColorIndex; var gMPrevCounter, gMCurCounter; var bOID4 = false; // true-OID4;false-OID3; var gXYDataFormat = 1; // 0-free format;1-for A4 var systemTime = 0; var lastUpTime = 0; var gbFirst3DotsChecked = false; var gbUpInvalid = false; var offlineDataTimeOffset = 0; //离线数据偏移校正变量 /*************** 过滤飞笔 ******************/ // 2018-10-19 kimswang var gSPtCnt; var gSPtX = new Array(4); var gSPtY = new Array(4); var gAngleDiff = new Array(2); var gbPt3Remain = false; var gPt3X, gPt3Y, gPt3fx, gPt3fy, gPt3Force, gPt3Angle; var gPt3Counter; var gPt3TimeLong; var gThresholdAngle = 30; var mPenType = bleConstants.BleConstants.PEN_T111; //var gbPt1Fly = false; //var gbPt2Fly = false; var gThresholdTimes = 6; var gThresholdDist = 10; var gPtPos = 0; var gPreStatus; var gbReceiveThreadStart = false; var gCount = 0; var pointZ; var gAngleOffsetX; var gAngleOffsetY; var gPreForce, gCurForce, gPreOfflineForce; var gbUpGot = false; var gbDownGot = false; //var lastDistence = 1; // 上一个距离 //var distence = 1; // 当前距离 // 2018-10-19 kimswang // common variable const DOT_LEN = 40960; var gDotBuffer = new Array(DOT_LEN); // dot buffer save point for (let d = 0; d < gDotBuffer.length; d++) { gDotBuffer[d] = new Array(); } var gSplitBuffer = new Array(2048); // 解压缩点的buffer for (let s = 0; s < gSplitBuffer.length; s++) { gSplitBuffer[s] = new Array(); } var mendUpArray = new Array(); // 如果没有产生up点,自行补一个up点上去 var goxa, goxb, goya, goyb; var gCurAngle = 0; // 当前笔的角度值 var gPAngle = 0; var gInitAngle; //var gbNormal = false; // 创建一个存储三个点的二维数组 var gMCounter, gUCounter; var gMCounterDiff; var gFirstPtTotalCount = 0; var gSplitIndex = 0; var gSProcessIndex = -1; var gReceiveIndex = 0; //var gFirstPtIndex = 0; var gFirstPtCount = 0; var gProcessIndex = -1; var gbSplitThreadStart = false; // 角度修正 var g2ndAngle; var firstDot = false; var gCurPageID = -1; var gCurBookID = -1; var dotAngleList = [ [] ]; var gLongFlyState = 0; //20181004 var gCounter; var gForce; var gAngle; var gFirstDots = new Array(); function Mydot() { this.counter = 0; // 点计数 this.sectionID = 0; // 区域ID this.ownerID = 0; // 客户ID this.bookID = 0; // 书号 this.pageID = 0; // 页号 this.timeLong = 0; // 当前点的RTC 时间,返回时间戳 ms(起止时间是2018-01-01 00:00:00,000) this.x = 0; // 点横坐标,整数部分 this.y = 0; // 点纵坐标,整数部分 this.fx = 0.0; // 点横坐标,小数部分 this.fy = 0.0; // 点纵坐标,小数部分 this.ab_x = 0.0; // 点横坐标,整数+小数部分 this.ab_y = 0.0; // 点纵坐标,整数+小数部分 this.dotType = 0; this.force = 0; // 点的压力值 this.angle = 0; // 点的角度值 this.color = 0; // 笔的颜色值 }; for (var i = 0; i < 4; i++) { gFirstDots[i] = new Mydot(); gFirstDots[i].counter = i; gFirstDots[i].sectionID = i; } var pointX123 = new Array(5); var pointY123 = new Array(5); var gbFirstDotsFly = new Array(5); var gFirstDotsCnt = 0; var gFirstDotsCheckState = 0; var gbFirstDotsUp = false; //20181025 var gbTurnBackPt = false; var gTurnBackX, gTurnBackY; //20181012 var gbStartSecondDataFilter = false; var g2x1, g2x2, g2x3; var g2y1, g2y2, g2y3; var g2SPtCnt; var g2SPtX = new Array(5); var g2SPtY = new Array(5); var g2AngleDiff = new Array(5); var gb2Pt3Remain = false; var g2Pt3X, g2Pt3Y, g2Pt3fx, g2Pt3fy, g2Pt3Force, g2Pt3Angle; var g2Pt3Counter; var g2Pt3TimeLong; var g2ThresholdAngle = 30; var g2ThresholdTimes = 6; var g2ThresholdDist = 10; var g2PtPos = 0; var g2bUpGot = false; var gb2DownGot = false; var g2LongFlyState = 0; var g2LongFlyState1 = 0; var g2MCounter, g2UCounter; var g2MPrevCounter, g2MCurCounter; var g2MCounterDiff; var gb2Debug = false; var gb2Debug1 = false; var gbLastMove = false; var isNeedFiveCheck = false; // controller lang line no break var lastDownX = 0; var lastDownY = 0; var firstLine = true; //20181101 var gThresholdUpAngle = 65; var gFlyDist = 8.0; //20190717 var gPreAbsX, gPreAbsY; var gbAbsXYSet = false; // function hexConvertDecimal(hexArray) { // let decimalVal = parseInt(hexArray, 16); // return decimalVal; // } function changeOffset(offineset) { offlineDataTimeOffset = offineset; } /** * Auther: kims wang * Describe: 解压缩蓝牙发送过来的数据 * Date: 2018-10-20 */ function splitData(lpData, bIsOnline = true) { if (lpData.length != 10) { return; } var bValidate = false; var angle = 0; var force = 0; var counter = 0; var angleDiff = 0; var status = ""; var dist1, dist2, dist3; var dtimes = 0, time = 0; // switch (utils.hexConvertDecimal(lpData[0]) & utils.hexConvertDecimal('ff')) switch (lpData[0] & 0xff) { case 254: { switch (lpData[1] & 0x0f) { case 1: //down第一点 bValidate = true; //color = utils.hexConvertDecimal(lpData[1]) >> 4; //Log.i(TAG, "lpData[1]=" + lpData[1] + ",color=" + color); gSPtX = new Array(4); gSPtY = new Array(4); for (let i = 0; i < 4; i++) { gSPtX[i] = 0; gSPtY[i] = 0; } gAngleDiff = new Array(2); for (let i = 0; i < 2; i++) { gAngleDiff[i] = 0; } gbPt3Remain = false; if ((lpData[2] & 0xF0) == 0x60) //OID3 valid position code { bOID4 = false; gAbsX = (int)(((lpData[4] & 0x3F) << 8) + (lpData[5] & 0xFF)); gAbsfx = (int)(((lpData[6] & 0xFE) >> 1)); gAbsY = (int)(((lpData[8] & 0xFF) << 6) + ((lpData[9] & 0xFC) >> 2)); //Edit gAbsfy = (int)((lpData[9] & 0x03) << 5); gAbsXM = gAbsX; gAbsYM = gAbsY; bValidate = false; } else if ((lpData[2] & 0xF0) == 0x40) //OID3 valid element code { bOID4 = false; } else if ((lpData[2] & 0xf0) == 0x80) //OID4 valid element code { bOID4 = true; } else if ((lpData[2] & 0xf0) == 0xa0) //OID4 valid position code { bOID4 = true; gAbsXT = (((lpData[3] & 0x7f) << 16) + ((lpData[4] & 0xff) << 8) + (lpData[5] & 0xff)); gAbsYT = (((lpData[6] & 0x01) << 22) + ((lpData[7] & 0xFF) << 14) + ((lpData[8] & 0xFF) << 6) + ((lpData[9] & 0xFC) >> 2)); // Edit gxSID = (lpData[3] & 0x40) >> 6; gySID = (lpData[6] & 0x01); gxOID = ((lpData[3] & 0x3C) >> 2); gyOID = ((lpData[7] & 0xF0) >> 4); gOID = gyOID * 16 + gxOID; gSID = gySID * 2 + gxSID; switch (gSID) { case 0: case 1: //20180906 case 2: if (gSID == 1 && gOID >= 200) // for WhiteBoard { gxBID = (((lpData[3] & 0x03) << 1) + ((lpData[4] & 0x80) >> 7)); gyBID = ((lpData[7] & 0x0E) >> 1); gxPID = ((lpData[4] & 0x78) >> 3); gyPID = (((lpData[7] & 0x01) << 3) + ((lpData[8] & 0xE0) >> 5)); gBID = gyBID * 8 + gxBID; gPID = gyPID * 16 + gxPID; gAbsX = (((lpData[4] & 0x07) << 8) + (lpData[5] & 0xFF)); gAbsY = (((lpData[8] & 0x1F) << 6) + ((lpData[9] & 0xFC) >> 2)); //Edit } else { gxBID = (((lpData[3] & 0x03) << 3) + ((lpData[4] & 0xE0) >> 5)); gyBID = (((lpData[7] & 0x0F) << 1) + ((lpData[8] & 0x80) >> 7)); gxPID = ((lpData[4] & 0x1E) >> 1); gyPID = ((lpData[8] & 0x78) >> 3); gBID = gyBID * 32 + gxBID; gPID = gyPID * 16 + gxPID; gAbsX = (((lpData[4] & 0x01) << 8) + (lpData[5] & 0xFF)); gAbsY = (((lpData[8] & 0x07) << 6) + ((lpData[9] & 0xFC) >> 2)); //Edit } break; // case 2: // gxBID =((lpData[3] & 0x03) << 3) + ((lpData[4] & 0xE0) >> 5); // gyBID = ((lpData[7] & 0x0F) << 1) + ((lpData[8] & 0x80) >> 7); // gxPID = ((lpData[4] & 0x1E) >> 1); // gyPID = ((lpData[8] & 0x78) >> 3); // gBID = gyBID * 32 + gxBID; // gPID = gyPID * 16 + gxPID; // gAbsX = ((lpData[4] & 0x01) << 8) + (lpData[5] & 0xFF); // gAbsY = ((lpData[8] & 0x07) << 6) + ((lpData[9] & 0xFC) >> 2); //Edit // break; /* case 2: 20170906 修改section 2 和section 1 一样的形式进行分割数据 gxBID = ((utils.hexConvertDecimal(lpData[3]) << 1) + (utils.hexConvertDecimal(lpData[4]) >> 7)); gyBID = (utils.hexConvertDecimal(lpData[7]) >> 1); gxPID = (utils.hexConvertDecimal(lpData[4]) >> 3); gyPID = ((utils.hexConvertDecimal(lpData[7]) << 3) + (utils.hexConvertDecimal(lpData[8]) >> 5)); gBID = gyBID * 8 + gxBID; gPID = gyPID * 16 + gxPID; gAbsX = ((utils.hexConvertDecimal(lpData[4]) << 8) + utils.hexConvertDecimal(lpData[5])); gAbsY = ((utils.hexConvertDecimal(lpData[8]) << 6) + (utils.hexConvertDecimal(lpData[9]) >> 2)); //Edit break;*/ case 3: gxBID = (lpData[3] & 0x03); gyBID = ((lpData[7] & 0x0C) >> 2); gxPID = ((lpData[4] & 0xF0) >> 4); gyPID = ((lpData[7] & 0x03) << 2) + ((lpData[8] & 0xC0) >> 6); gBID = gyBID * 4 + gxBID; gPID = gyPID * 16 + gxPID; gAbsX = ((lpData[4] & 0x0F) << 8) + (lpData[5] & 0xFF); gAbsY = ((lpData[8] & 0x3F) << 6) + ((lpData[9] & 0xFC) >> 2); //Edit break; default: break; } gAbsfx = ((lpData[6] & 0xFE) >> 1); gAbsfy = ((lpData[9] & 0x03) << 5); gAbsXM = gAbsX; gAbsYM = gAbsY; bValidate = false; //20190717 gbAbsXYSet = false; } break; case 2: //down第二点 bValidate = true; gAbsfy = (gAbsfy + ((lpData[2] & 0xF8) >> 3)); //Edit angle = ((lpData[2] & 0x07) << 6) + ((lpData[3] & 0xFC) >> 2); //Edit force = ((lpData[3] & 0x03) << 8) + (lpData[4] & 0xFF); counter = lpData[5]; status = "Pen Down"; // = "Pen Down"; gbPenUpGot = false; gPenUpPtNo = 0; gbUpInvalid = false; /***********************数据时间修改***********************/ if (bIsOnline) { // systemTime = utils.Dot.timeLong; // console.log(utils.Dot.timeLong) // let nowDate = (new Date()).valueOf(); // let strFormat = '2010-01-01 00:00:00:000'; // let startDate = new Date(strFormat).valueOf(); // systemTime = nowDate - startDate; let nowDate = Date.now(); // 起始时间 2010-01-01 let startDate = 1262304000000; systemTime = nowDate - startDate; // systemTime = ((lpData[6] & 0xff) + ((lpData[7] << 8) & 0xff00) + ((lpData[8] << 16) & 0xff0000) + ((lpData[9] << 24) & 0xff000000)); // systemTime = systemTime * 1000; // if (systemTime <= lastUpTime && (lastUpTime - systemTime < 1000)) { // systemTime = lastUpTime + 8; // } } else { systemTime = ((lpData[6] & 0xff) + ((lpData[7] << 8) & 0xff00) + ((lpData[8] << 16) & 0xff0000) + ((lpData[9] << 24) & 0xff000000)); systemTime += offlineDataTimeOffset; //离线数据偏移校正变量 ; // console.log("离线数据偏移校正变量" + offlineDataTimeOffset); systemTime = systemTime * 1000; if (systemTime <= lastUpTime && (lastUpTime - systemTime < 1000)) { systemTime = lastUpTime + 8; } } break; default: break; } } break; case 252: { //move点 bValidate = true; time = (lpData[1] & 0xff); systemTime += time; if (!bIsOnline) { lastUpTime = systemTime; } lastUpTime = systemTime; if ((lpData[2] & 0xF0) == 0x60) //OID3 valid position code { bOID4 = false; if ((lpData[2] & 0x04) == 4) { gAbsXM = (gAbsX + ((lpData[2] & 0x03) << 6) + ((lpData[3] & 0xFC) >> 2)); } else if ((lpData[2] & 0x04) == 0) { gAbsXM = (gAbsX - (((lpData[2] & 0x03) << 6) + ((lpData[3] & 0xFC) >> 2))); } gAbsfx = ((lpData[3] & 0x03) << 5) + ((lpData[4] & 0xF8) >> 3); if ((lpData[4] & 0x04) == 4) { gAbsYM = (gAbsY + ((lpData[4] & 0x03) << 6) + ((lpData[5] & 0xFC) >> 2)); } else if ((lpData[4] & 0x04) == 0) { gAbsYM = (gAbsY - (((lpData[4] & 0x03) << 6) + ((lpData[5] & 0xFC) >> 2))); } gAbsfy = ((lpData[5] & 0x03) << 5) + ((lpData[6] & 0xF8) >> 3); angle = ((lpData[6] & 0x07) << 6) + ((lpData[7] & 0xFC) >> 2); force = ((lpData[7] & 0x03) << 8) + (lpData[8] & 0xFF); counter = lpData[9]; if (force == 0) { if (gbPenUpGot == false) { gbPenUpGot = true; gPenUpPtNo = 3; } else { bValidate = false; break; } status = "Pen Up"; } else { gPreCX = gAbsXM; gPreCY = gAbsYM; gPreCfx = gAbsfx; gPreCfy = gAbsfy; status = "Pen Move"; } } else if ((lpData[2] & 0xF0) == 0x70) //OID3 invalid position code { bOID4 = false; counter = lpData[9]; angle = ((lpData[6] & 0x07) << 6) + ((lpData[7] & 0xFC) >> 2); force = ((lpData[7] & 0x03) << 8) + (lpData[8] & 0xFF); if (force > 0) { bValidate = false; break; } else if (force == 0) { status = "Pen Up 000"; if (!gbPenUpGot) { gbPenUpGot = true; gPenUpPtNo = 3; status = "Pen Up"; bValidate = true; gMUpX = (2 * gx2) - gx1; gMUpY = (2 * gy2) - gy1; var XM = (gMUpX * 100); gAbsXM = XM / 100; gAbsfx = (XM % 100) * 128 / 100; var YM = (gMUpY * 100); gAbsYM = YM / 100; gAbsfy = (YM % 100) * 128 / 100; } else { bValidate = false; break; } } } else if ((lpData[2] & 0xF0) == 0x40) //OID3 valid element code { bOID4 = false; } else if ((lpData[2] & 0xF0) == 0xA0) //OID4 valid position code { bOID4 = true; if ((lpData[2] & 0x04) == 4) { gAbsXM = (gAbsX + ((lpData[2] & 0x03) << 6) + ((lpData[3] & 0xFC) >> 2)); } else if ((lpData[2] & 0x04) == 0) { gAbsXM = (gAbsX - (((lpData[2] & 0x03) << 6) + ((lpData[3] & 0xFC) >> 2))); } gAbsfx = ((lpData[3] & 0x03) << 5) + ((lpData[4] & 0xF8) >> 3); if ((lpData[4] & 0x04) == 4) { gAbsYM = (gAbsY + ((lpData[4] & 0x03) << 6) + ((lpData[5] & 0xFC) >> 2)); } else if ((lpData[4] & 0x04) == 0) { gAbsYM = (gAbsY - (((lpData[4] & 0x03) << 6) + ((lpData[5] & 0xFC) >> 2))); } if (gbAbsXYSet == false) { gPreAbsX = gAbsX; gPreAbsY = gAbsY; gbAbsXYSet = true; } gAbsfy = (((lpData[5] & 0x03) << 5) + ((lpData[6] & 0xF8) >> 3)); angle = ((lpData[6] & 0x07) << 6) + ((lpData[7] & 0xFC) >> 2); force = (((lpData[7] & 0x03) << 8) + (lpData[8] & 0xFF)); //console.log("pen is " + gAbsXM + ", " + ", " + gAbsYM + ',' + force) // if (gPreStatus == "Pen Up" && force > 0) { // bValidate = true; // gAbsfy = ((gAbsfy + ((lpData[2] & 0xF8) >> 3))); //Edit // angle = (((lpData[2] & 0x07) << 6) + ((lpData[3] & 0xFC) >> 2)); //Edit // force = (((lpData[3] & 0x03) << 8) + (lpData[4] & 0xFF)); // counter = lpData[5]; // status = "Pen Down"; // gbPenUpGot = false; // gPenUpPtNo = 0; // gbPenUpGot = false; // console.log("No Pen Down !!!==" + status); // break; // } counter = lpData[9]; if (gPreStatus == "Pen Up" && force > 0) { return; } if (force == 0) { if (gbPenUpGot == false) { gbPenUpGot = true; gPenUpPtNo = 3; } else { bValidate = false; break; } status = "Pen Up"; } else { gPreCX = gAbsXM; gPreCY = gAbsYM; gPreCfx = gAbsfx; gPreCfy = gAbsfy; status = "Pen Move"; } } else if ((lpData[2] & 0xF0) == 0xB0) { // OID4 invalid position code bOID4 = true; counter = lpData[9]; angle = ((lpData[6] & 0x07) << 6) + ((lpData[7] & 0xFC) >> 2); force = ((lpData[7] & 0x03) << 8) + (lpData[8] & 0xFF); if (force > 0) { bValidate = false; break; } else if (force == 0) { status = "Pen Up 000"; if (!gbPenUpGot && gPenUpPtNo == 2) { gbPenUpGot = true; gPenUpPtNo = 3; gbUpInvalid = true; status = "Pen Up"; bValidate = true; /* gMUpX = (2 * gx2) - gx1; gMUpY = (2 * gy2) - gy1;*/ gMUpX = gx2; gMUpY = gy2; let XM = (gMUpX * 100); gAbsXM = XM / 100; gAbsfx = (XM % 100) * 128 / 100; let YM = (gMUpY * 100); gAbsYM = YM / 100; gAbsfy = (YM % 100) * 128 / 100; } else { gPenUpPtNo++; bValidate = false; break; } } } } break; default: break; } if (bValidate) { //console.log("xxxx = " + systemTime + "lydata"+lpData); switch (status) { case "Pen Down": gPtPos = 0; gMPrevCounter = -1; gMCurCounter = counter; gMCounter = counter; gx2 = gAbsXM + gAbsfx / 128.0; gy2 = gAbsYM + gAbsfy / 128.0; gx1 = gx2; gy1 = gy2; if (firstLine) { lastDownX = gx1; lastDownY = gy1; firstLine = false; } //if (gbDownGot && !gbUpGot && Math.abs(lastDownX - gx1) < 127 && Math.abs(lastDownY - gy1) < 127) { //20190717 if (gbDownGot && !gbUpGot && (Math.abs(gAbsX - gPreAbsX) < 127 && Math.abs(gAbsY - gPreAbsY) < 127)) { // Receive 2nd Down Pt before Up pt arrived // force = 0 g_CompressData[11] = 0; g_CompressData[12] = 0; // Counter ++ g_CompressData[0]++; if (g_CompressData[0] > 246) g_CompressData[0] = 0; processDots(g_CompressData, bIsOnline, bOID4); } //20181004 gFirstDotsCnt = 0; gFirstDotsCheckState = 0; gbFirstDotsUp = false; for (var i = 0; i < 5; i++) { gbFirstDotsFly[i] = false; } gFirstDots[0].counter = counter; gFirstDots[0].x = gAbsXM; gFirstDots[0].fx = gAbsfx; gFirstDots[0].y = gAbsYM; gFirstDots[0].fy = gAbsfy; gFirstDots[0].force = force; gFirstDots[0].angle = angle; // console.log('downangle = '+angle) gFirstDots[0].timelong = systemTime; gFirstDotsCnt++; gbDownGot = true; gbUpGot = false; // gx2 = gAbsXM + (gAbsfx / 128.0); // gy2 = gAbsYM + (gAbsfy / 128.0); // gx1 = gx2; // gy1 = gy2; lastDownX = gx1; lastDownY = gy1; gSPtCnt = 1; gbPt3Remain = false; gSPtX[gSPtCnt - 1] = gx2; gSPtY[gSPtCnt - 1] = gy2; gPreStatus = "Pen Down"; //2018.12.13 isNeedFiveCheck = false; break; case "Pen Move": if (gbUpGot) { return; } gPtPos++; gMCounter = counter; // 20180929 gMPrevCounter = gMCurCounter; gMCurCounter = counter; if (gMCurCounter > gMPrevCounter) gMCounterDiff = gMCurCounter - gMPrevCounter; else gMCounterDiff = 247 + gMCurCounter - gMPrevCounter; gx1 = gx2; gy1 = gy2; gx2 = gAbsXM + (gAbsfx / 128.0); gy2 = gAbsYM + (gAbsfy / 128.0); dist3 = Math.sqrt(((gx2 - gx1) * (gx2 - gx1)) + ((gy2 - gy1) * (gy2 - gy1))); if (dist3 == 0.0) dist3 = 0.000001; if (dist3 > 3.2) { gThresholdAngle = 60; } else if (dist3 > 1.6) { gThresholdAngle = 45; } else { //201809 gThresholdAngle = 30; } //2018.12.13 if (isNeedFiveCheck) { isNeedFiveCheck = false; var secX = gSPtX[1]; var secY = gSPtY[1]; var dist25 = Math.sqrt(((gx2 - secX) * (gx2 - secX)) + ((gy2 - secY) * (gy2 - secY))); if (dist3 > dist25) { gbFirstDotsFly[2] = true; gbFirstDotsFly[3] = true; gSPtCnt = 3; gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; } else { gbFirstDotsFly[0] = true; gbFirstDotsFly[1] = true; gSPtX[0] = gSPtX[2]; gSPtY[0] = gSPtY[2]; gSPtX[1] = gSPtX[3]; gSPtY[1] = gSPtY[3]; gSPtCnt = 3; gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; } } gSPtCnt++; gSPtX[gSPtCnt - 1] = gx2; gSPtY[gSPtCnt - 1] = gy2; //20181025 if (gPtPos <= 3) { //var dotData = gFirstDots[i]; gFirstDots[gPtPos].counter = counter; gFirstDots[gPtPos].x = gAbsXM; gFirstDots[gPtPos].fx = gAbsfx; gFirstDots[gPtPos].y = gAbsYM; gFirstDots[gPtPos].fy = gAbsfy; gFirstDots[gPtPos].force = force; gFirstDots[gPtPos].angle = angle; gFirstDots[gPtPos].timelong = systemTime; gFirstDotsCnt++; //if (gFirstDotsCnt == 3) if (gFirstDotsCnt == 4) { gbFirstDotsUp = false; gFirstDotsCheckState = 1; checkFirstPtValidate_SplitData_4P(); gbFirstDotsFly[3] = true; // keep 4th pt to check later } else { return; } //2018.12.13 if (isNeedFiveCheck) { return; } } if (gSPtCnt > 2 && gPtPos >= 3 && dist3 > 1.5 || gSPtCnt == 4) { if (gSPtCnt == 3) // 三点判断 { //1,2,3 Angle Diff gAngleDiff[0] = utils.angleDifferent(utils.pointsAngle(gSPtX[0], gSPtY[0], gSPtX[1], gSPtY[1]), utils.pointsAngle(gSPtX[1], gSPtY[1], gSPtX[2], gSPtY[2])); dist1 = Math.sqrt(((gSPtX[1] - gSPtX[0]) * (gSPtX[1] - gSPtX[0])) + ((gSPtY[1] - gSPtY[0]) * (gSPtY[1] - gSPtY[0]))); if (dist1 == 0.0) dist1 = 0.000001; dist2 = Math.sqrt(((gSPtX[2] - gSPtX[1]) * (gSPtX[2] - gSPtX[1])) + ((gSPtY[2] - gSPtY[1]) * (gSPtY[2] - gSPtY[1]))); dist2 = dist2 / gMCounterDiff; if (dist2 == 0.0) dist2 = 0.000001; dtimes = dist2 / dist1; // gAngleDiff[0] >= 30 还会有飞笔, gAngleDiff[0] >= 20 暂时未发现飞笔 if ((dtimes > 60 && dist1 > 0.000001 && gAngleDiff[0] >= 20) || (dtimes > 2000000 && dist1 >= 0.000001)) { // 20181108 gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; // 20181010 gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; // 20181108 gSPtCnt = 2; // console.log("split: remove 1"); return; } //20181025 if ((dtimes > 15 && dist1 > 0.1 && gAngleDiff[0] >= 150) || (dtimes > 30 && dist1 > 0.05 && gAngleDiff[0] >= 150)) { //20181108 gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; // 20181010 gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; //20181108 //gx2 = gSPtX[1]; //gy2 = gSPtY[1]; gSPtCnt = 2; return; } //20181101 if ((dtimes > 20 && dist1 > 0.1) || (dtimes > 40 && dist1 > 0.05)) { //20181108 gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; // 20181010 gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; //20181108 //gx2 = gSPtX[1]; //gy2 = gSPtY[1]; gSPtCnt = 2; return; } if (gAngleDiff[0] < gThresholdAngle) // 第一,二,三点的角度差,在范围内,第三点角度合理 { if (dtimes < gThresholdTimes || dist2 < gThresholdDist) // 第三点距离合理,第三点不飞 { //201809 if (dtimes > (gThresholdTimes * 2) && dist1 > 0.1) // 第三点距离不合理,第三点飞 { gSPtCnt = 2; // 20180929 gSPtX[2] = 2 * gSPtX[1] - gSPtX[0]; gSPtY[2] = 2 * gSPtY[1] - gSPtY[0]; gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; //console.log("split: remove 2"); return; } //20181011 //if ((dtimes <= gThresholdTimes && dist1 > 0.3 && dtimes > 1)||(dtimes > gThresholdTimes)) { //20181211 //if (dtimes > gThresholdTimes) { //if((dtimes > gThresholdTimes && dist1 > 0.3)||(dtimes > 4 && dist1 > 0.5) || (dtimes > gThresholdTimes * 2)){ if ((dtimes <= gThresholdTimes && dtimes >= 1 && dist1 > 0.3) || (dtimes > gThresholdTimes)) { gPt3Counter = counter; gPt3X = gAbsXM; gPt3fx = gAbsfx; gPt3Y = gAbsYM; gPt3fy = gAbsfy; gPt3Force = force; gPt3Angle = angle; gPt3TimeLong = systemTime; return; } else { //201809 gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtCnt = 2; } } else // 第三点飞 { gSPtCnt = 2; // 20180929 gSPtX[2] = 2 * gSPtX[1] - gSPtX[0]; gSPtY[2] = 2 * gSPtY[1] - gSPtY[0]; gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; //console.log("split: remove 3"); return; } } else // 第三点的角度不合理 { //20181011 dtimes *= gMCounterDiff; if (dtimes < gThresholdTimes || dist2 < gThresholdDist) // 第三点距离合理,暂存第三点 { // Pt3 seems a fly point gPt3Counter = counter; gPt3X = gAbsXM; gPt3fx = gAbsfx; gPt3Y = gAbsYM; gPt3fy = gAbsfy; gPt3Force = force; gPt3Angle = angle; gPt3TimeLong = systemTime; //console.log("split: remove 4"); return; } else // 第三点距离不合理,第三点飞 { gSPtCnt = 2; // 20180929 gSPtX[2] = 2 * gSPtX[1] - gSPtX[0]; gSPtY[2] = 2 * gSPtY[1] - gSPtY[0]; gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; //console.log("split: remove 5"); return; } } } else if (gSPtCnt == 4) // 四点判断 { // 1,2,4 Angle Diff gAngleDiff[1] = utils.angleDifferent(utils.pointsAngle(gSPtX[1], gSPtY[1], gSPtX[2], gSPtY[2]), utils.pointsAngle(gSPtX[2], gSPtY[2], gSPtX[3], gSPtY[3])); // 第三点与第二点的距离 dist1 = Math.sqrt(((gSPtX[2] - gSPtX[1]) * (gSPtX[2] - gSPtX[1])) + ((gSPtY[2] - gSPtY[1]) * (gSPtY[2] - gSPtY[1]))); if (dist1 == 0.0) dist1 = 0.000001; // 第四点与第三点的距离 dist2 = Math.sqrt(((gSPtX[3] - gSPtX[2]) * (gSPtX[3] - gSPtX[2])) + ((gSPtY[3] - gSPtY[2]) * (gSPtY[3] - gSPtY[2]))); dist2 = dist2 / gMCounterDiff; if (dist2 == 0.0) dist2 = 0.000001; dtimes = dist2 / dist1; // 第三点保留,第四点都飞 if ((dtimes > 60 && dist1 > 0.000001 && gAngleDiff[1] >= 20) || (dtimes > 2000000 && dist1 >= 0.000001) || (dtimes > 12 && dist1 >= 0.1 && gAngleDiff[1] >= 60)) { gSPtCnt = 3; gLongFlyState = 1; //console.log("split: remove 66"); return; } gLongFlyState = 0; // 20181025 if ((dtimes > 15 && dist1 > 0.1 && gAngleDiff[1] >= 150) || (dtimes > 30 && dist1 > 0.05 && gAngleDiff[1] >= 150)) { gSPtCnt = 3; return; } //20181101 if ((dtimes > 20 && dist1 > 0.1) || (dtimes > 40 && dist1 > 0.05)) { gSPtCnt = 3; return; } if (gAngleDiff[1] >= gThresholdAngle) { //20181011 dtimes *= gMCounterDiff; if (dtimes < gThresholdTimes || dist2 < gThresholdDist) { // console.log("split: remove 77 dtimes=" + dtimes + ",dist2=" + dist2 + ",gAngleDiff[1]=" + gAngleDiff[1] + ",gThresholdAngle=" + gThresholdAngle); if (dtimes > (gThresholdTimes * 2) && dist1 > 0.1) { gSPtCnt = 3; return; } gbPt3Remain = false; gSPtX[2] = 2 * gSPtX[1] - gSPtX[0]; gSPtY[2] = 2 * gSPtY[1] - gSPtY[0]; gSPtX[0] = gSPtX[2]; gSPtY[0] = gSPtY[2]; gSPtX[1] = gSPtX[3]; gSPtY[1] = gSPtY[3]; gSPtCnt = 2; } else { gSPtCnt = 3; //console.log("split: remove 88"); return; } } else { if (dtimes < gThresholdTimes || dist2 < gThresholdDist) { gSPtX[0] = gSPtX[2]; gSPtY[0] = gSPtY[2]; gSPtX[1] = gSPtX[3]; gSPtY[1] = gSPtY[3]; gbPt3Remain = true; gSPtCnt = 2; } else { gSPtCnt = 3; //console.log("split: remove 99"); return; } } } } else { if (gSPtCnt == 3) { gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtCnt = 2; } } break; case "Pen Up": gPtPos++; //console.log("gbDownGot = " + gbDownGot + "gbUpGot" + gbUpGot+"xxxxxx"+lpData); //20181007 only Pen Down & Pen Up 2 points if (gPtPos == 1) { gbUpGot = true; gFirstDotsCheckState = 1; gbFirstDotsFly[2] = true; gbFirstDotsFly[3] = true; break; } // console.log("pen up is " + gAbsXM + ", " + gAbsfx + ", " + gAbsYM + ", " + gAbsfy); if (gPtPos <= 3) { gbUpGot = true; gFirstDots[gPtPos].counter = counter; gFirstDots[gPtPos].x = gAbsXM; gFirstDots[gPtPos].fx = gAbsfx; gFirstDots[gPtPos].y = gAbsYM; gFirstDots[gPtPos].fy = gAbsfy; gFirstDots[gPtPos].force = force; gFirstDots[gPtPos].angle = angle; gFirstDots[gPtPos].timelong = systemTime; gFirstDotsCheckState = 1; gbFirstDotsUp = true; gFirstDotsCnt++; if (gFirstDotsCnt == 3) checkFirstPtValidate_SplitData(); else if (gFirstDotsCnt == 4) { checkFirstPtValidate_SplitData_4P(); } gbFirstDotsFly[3] = true; } else { gbUpGot = true; gUCounter = counter; gx3 = gAbsXM + (gAbsfx / 128.0); gy3 = gAbsYM + (gAbsfy / 128.0); dist3 = Math.sqrt(((gx3 - gx2) * (gx3 - gx2)) + ((gy3 - gy2) * (gy3 - gy2))); if (gSPtCnt == 3 && dist3 > 1.5) { gSPtX[3] = gx3; gSPtY[3] = gy3; //1,2,4 Angle Diff gAngleDiff[1] = utils.angleDifferent(utils.pointsAngle(gSPtX[1], gSPtY[1], gSPtX[2], gSPtY[2]), utils.pointsAngle(gSPtX[2], gSPtY[2], gSPtX[3], gSPtY[3])); // console.log("Pen Up gAngleDiff[1] --gThresholdAngle: " + gAngleDiff[1] + "-----" + gThresholdAngle); //if (gAngleDiff[1] < 10 && Math.Abs((decimal)(gAngleDiff[0]-gAngleDiff[1])) > 20) if (gAngleDiff[1] >= gThresholdAngle) { gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; gbPt3Remain = false; gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[3]; gSPtY[1] = gSPtY[3]; } else { gSPtX[0] = gSPtX[2]; gSPtY[0] = gSPtY[2]; gSPtX[1] = gSPtX[3]; gSPtY[1] = gSPtY[3]; gbPt3Remain = true; //gSPtCnt = 2; } } if ((gSPtCnt >= 3 && gbPt3Remain == false) || (gLongFlyState == 1)) { // 20181025 // gx2 = (gx1 + gx3) / 2; // gy2 = (gy1 + gy3) / 2; gLongFlyState = 0; } angleDiff = utils.angleDifferent(utils.pointsAngle(gx1, gy1, gx2, gy2), utils.pointsAngle(gx1, gy1, gx3, gy3)); dist1 = Math.sqrt(((gx2 - gx1) * (gx2 - gx1)) + ((gy2 - gy1) * (gy2 - gy1))); if (dist1 == 0.0) dist1 = 0.000001; dist2 = Math.sqrt(((gx3 - gx2) * (gx3 - gx2)) + ((gy3 - gy2) * (gy3 - gy2))); if (dist2 == 0.0) dist2 = 0.000001; dtimes = dist2 / dist1; var CounterDiff; if (gUCounter > gMCounter) CounterDiff = gUCounter - gMCounter; else CounterDiff = 247 + gUCounter - gMCounter; dtimes = dist2 / CounterDiff / dist1; //20180929 /* if (dtimes > 15 && angleDiff < 30 && dist1 > 0.18)*/ if ((dtimes > 15 && angleDiff < 30 && dist1 > 0.1 && dist2 > 1.5) || (dtimes > 6 && angleDiff < gThresholdAngle && dist2 > 3)) // 20181005 add dtimes >6 and dist2 > 3 for Up Point { gMUpX = ((CounterDiff + 1) * gx2) - CounterDiff * gx1; gMUpY = ((CounterDiff + 1) * gy2) - CounterDiff * gy1; let XM = (gMUpX * 100); gAbsXM = XM / 100; gAbsfx = (XM % 100) * 128 / 100; let YM = (gMUpY * 100); gAbsYM = YM / 100; gAbsfy = (YM % 100) * 128 / 100; } if (angleDiff >= gThresholdUpAngle && CounterDiff == 1 && dist2 > 1.5) { gMUpX = gx2; gMUpY = gy2; let XM = (gMUpX * 100); gAbsXM = XM / 100; gAbsfx = (XM % 100) * 128 / 100; let YM = (gMUpY * 100); gAbsYM = YM / 100; gAbsfy = (YM % 100) * 128 / 100; } } break; default: break; } let MS; let SS; let SBID; //20181004 if (gFirstDotsCheckState == 0) return; else if (gFirstDotsCheckState == 1) { for (i = 0; i < gFirstDotsCnt; i++) { if (gbFirstDotsFly[i] == false) { MS = (gFirstDots[i].timelong % 1000); SS = gFirstDots[i].timelong / 1000; SBID = gSID * 1024 + gBID; g_CompressData[0] = gFirstDots[i].counter; //g_CompressData[1] = gSID; g_CompressData[1] = (SBID / 256); g_CompressData[2] = gOID; //g_CompressData[3] = gBID; g_CompressData[3] = (SBID % 256); g_CompressData[4] = gPID; g_CompressData[5] = (gFirstDots[i].x % 256); g_CompressData[6] = (gFirstDots[i].x / 256); g_CompressData[7] = (gFirstDots[i].fx); g_CompressData[8] = (gFirstDots[i].y % 256); g_CompressData[9] = (gFirstDots[i].y / 256); g_CompressData[10] = (gFirstDots[i].fy); g_CompressData[11] = (gFirstDots[i].force % 256); g_CompressData[12] = (gFirstDots[i].force / 256); g_CompressData[13] = (SS % 256); SS = SS / 256; g_CompressData[14] = (SS % 256); SS = SS / 256; g_CompressData[15] = (SS % 256); g_CompressData[16] = (SS / 256); g_CompressData[17] = (MS % 256); g_CompressData[18] = (MS / 256); g_CompressData[19] = (gFirstDots[i].angle % 256); g_CompressData[20] = (gFirstDots[i].angle / 256); gPreStatus = status; // console.log('gbFirstDotsFly ========= ' + gbFirstDotsFly[i] + 'gFirstDots[i].x = ' + gFirstDots[i].x + 'gFirstDots[i].fx =' + gFirstDots[i].fx + 'gFirstDots[i].counter' + gFirstDots[i].counter); // console.log('++++++++' + parseInt(gFirstDots[i].angle / 256)); processDots(g_CompressData, bIsOnline, bOID4); } } gFirstDotsCheckState = 2; } if (gbPt3Remain == true && bOID4) { MS = (gPt3TimeLong % 1000); SS = gPt3TimeLong / 1000; SBID = gSID * 1024 + gBID; g_CompressData[0] = gPt3Counter; //g_CompressData[1] = gSID; g_CompressData[1] = (SBID / 256); g_CompressData[2] = gOID; //g_CompressData[3] = gBID; g_CompressData[3] = (SBID % 256); g_CompressData[4] = gPID; g_CompressData[5] = (gPt3X % 256); g_CompressData[6] = (gPt3X / 256); g_CompressData[7] = (gPt3fx); g_CompressData[8] = (gPt3Y % 256); g_CompressData[9] = (gPt3Y / 256); g_CompressData[10] = (gPt3fy); g_CompressData[11] = (gPt3Force % 256); g_CompressData[12] = (gPt3Force / 256); g_CompressData[13] = (SS % 256); SS = SS / 256; g_CompressData[14] = (SS % 256); SS = SS / 256; g_CompressData[15] = (SS % 256); g_CompressData[16] = (SS / 256); g_CompressData[17] = (MS % 256); g_CompressData[18] = (MS / 256); g_CompressData[19] = (gPt3Angle % 256); g_CompressData[20] = (gPt3Angle / 256); gPreStatus = "Pen Move"; processDots(g_CompressData, bIsOnline, bOID4); //penOnlineStrokeDot(g_CompressData, bIsOnline, bOID4); gbPt3Remain = false; } MS = (systemTime % 1000); SS = systemTime / 1000; if (bOID4) { SBID = gSID * 1024 + gBID; g_CompressData[0] = counter; g_CompressData[1] = (SBID / 256); g_CompressData[2] = gOID; g_CompressData[3] = (SBID % 256); g_CompressData[4] = gPID; g_CompressData[5] = (gAbsXM % 256); g_CompressData[6] = (gAbsXM / 256); g_CompressData[7] = (gAbsfx); g_CompressData[8] = (gAbsYM % 256); g_CompressData[9] = (gAbsYM / 256); g_CompressData[10] = gAbsfy; g_CompressData[11] = (force % 256); g_CompressData[12] = (force / 256); g_CompressData[13] = (SS % 256); SS = SS / 256; g_CompressData[14] = (SS % 256); SS = SS / 256; g_CompressData[15] = (SS % 256); g_CompressData[16] = (SS / 256); g_CompressData[17] = (MS % 256); g_CompressData[18] = (MS / 256); g_CompressData[19] = (angle % 256); g_CompressData[20] = (angle / 256); } gPreStatus = status; processDots(g_CompressData, bIsOnline, bOID4); } else { return; } } /** * Auther: kims wang * Describe: 四点过滤算法 * Date: 2018-10-20 */ function checkFirstPtValidate_SplitData_4P() { var i, j; //var tangle = new Array(4); //var InitAngle; //var adiff12, adiff23, adiff31, adiff34; var dist1, dist2, dist3; var dist12, dist13, dist14, dist23, dist24, dist34; var d12Times, d23Times, d31Times; var Angle123, Angle124, Angle134, Angle234; //201809 var d32Times, d13Times; var countDiff; for (i = 0; i < 4; i++) { // console.log('1111111111111111111'); pointX123[i] = (gFirstDots[i].x) + (gFirstDots[i].fx) / 128.0; pointY123[i] = (gFirstDots[i].y) + (gFirstDots[i].fy) / 128.0; // tangle[i] = gFirstDots[i].angle; //console.log('i==='+ i + 'counter ===' + gFirstDots[i].counter + 'x = ' + gFirstDots[i].x +'fx = '+ gFirstDots[i].fx); gbFirstDotsFly[i] = false; } //20181025 Resolve Special case // adiff12 = utils.angleDifferent(tangle[0], tangle[1]); // adiff23 = utils.angleDifferent(tangle[1], tangle[2]); // adiff34 = utils.angleDifferent(tangle[2], tangle[3]); // if (adiff12 <= adiff23) { // if (adiff12 <= adiff34) { // InitAngle = tangle[0]; // } else { // InitAngle = tangle[3]; // } // } else { // if (adiff23 <= adiff34) { // InitAngle = tangle[1]; // } else { // InitAngle = tangle[3]; // } // } Angle123 = utils.angleDifferent(utils.pointsAngle(pointX123[0], pointY123[0], pointX123[1], pointY123[1]), utils.pointsAngle(pointX123[1], pointY123[1], pointX123[2], pointY123[2])); Angle124 = utils.angleDifferent(utils.pointsAngle(pointX123[0], pointY123[0], pointX123[1], pointY123[1]), utils.pointsAngle(pointX123[1], pointY123[1], pointX123[3], pointY123[3])); Angle134 = utils.angleDifferent(utils.pointsAngle(pointX123[0], pointY123[0], pointX123[2], pointY123[2]), utils.pointsAngle(pointX123[2], pointY123[2], pointX123[3], pointY123[3])); Angle234 = utils.angleDifferent(utils.pointsAngle(pointX123[1], pointY123[1], pointX123[2], pointY123[2]), utils.pointsAngle(pointX123[2], pointY123[2], pointX123[3], pointY123[3])); //20181027 dist12 = Math.sqrt(((pointX123[1] - pointX123[0]) * (pointX123[1] - pointX123[0])) + ((pointY123[1] - pointY123[0]) * (pointY123[1] - pointY123[0]))); if (dist12 == 0.0) dist12 = 0.000001; dist13 = Math.sqrt(((pointX123[2] - pointX123[0]) * (pointX123[2] - pointX123[0])) + ((pointY123[2] - pointY123[0]) * (pointY123[2] - pointY123[0]))); if (dist13 == 0.0) dist13 = 0.000001; dist14 = Math.sqrt(((pointX123[3] - pointX123[0]) * (pointX123[3] - pointX123[0])) + ((pointY123[3] - pointY123[0]) * (pointY123[3] - pointY123[0]))); if (dist14 == 0.0) dist14 = 0.000001; dist23 = Math.sqrt(((pointX123[2] - pointX123[1]) * (pointX123[2] - pointX123[1])) + ((pointY123[2] - pointY123[1]) * (pointY123[2] - pointY123[1]))); if (dist23 == 0.0) dist23 = 0.000001; dist24 = Math.sqrt(((pointX123[3] - pointX123[1]) * (pointX123[3] - pointX123[1])) + ((pointY123[3] - pointY123[1]) * (pointY123[3] - pointY123[1]))); if (dist24 == 0.0) dist24 = 0.000001; dist34 = Math.sqrt(((pointX123[3] - pointX123[2]) * (pointX123[3] - pointX123[2])) + ((pointY123[3] - pointY123[2]) * (pointY123[3] - pointY123[2]))); if (dist34 == 0.0) dist34 = 0.000001; // 20181025 p2, p3 fly case if (Angle124 > 135 && Angle134 > 135 && (dist14 < dist12) && (dist14 < dist13) && (dist34 / dist23 >= 3.0) && (dist24 / dist23 >= 3.0)) { gbFirstDotsFly[1] = true; gbFirstDotsFly[2] = true; gSPtX[1] = gSPtX[3]; gSPtY[1] = gSPtY[3]; gSPtCnt = 2; //gFirstDots[0].angle = InitAngle; gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[3]; gy2 = gSPtY[3]; return; } // 20181028 p1, p2 fly case var dtimes1312, dtimes1412, dtimes2312, dtimes2412; var dtimes1334, dtimes1434, dtimes2334, dtimes2434; dtimes1312 = dist13 / dist12; dtimes1412 = dist14 / dist12; dtimes2312 = dist23 / dist12; dtimes2412 = dist24 / dist12; dtimes1334 = dist13 / dist34; dtimes1434 = dist14 / dist34; dtimes2334 = dist23 / dist34; dtimes2434 = dist24 / dist34; // 2018.12.13 if ((dtimes1312 > gFlyDist) && (dtimes1412 > gFlyDist) && (dtimes2312 > gFlyDist) && (dtimes2412 > gFlyDist) && (dtimes1334 > gFlyDist) && (dtimes1434 > gFlyDist) && (dtimes2334 > gFlyDist) && (dtimes2434 > gFlyDist) && (dist12 > 0.001) && (dist34 > 0.001)) { if (dist23 > 3.0) //20181110 { // gbFirstDotsFly[0] = true; // gbFirstDotsFly[1] = true; // gSPtX[0] = gSPtX[2]; // gSPtY[0] = gSPtY[2]; // gSPtX[1] = gSPtX[3]; // gSPtY[1] = gSPtY[3]; // gSPtCnt = 2; // gFirstDots[2].angle = InitAngle; // gx1 = gSPtX[0]; // gy1 = gSPtY[0]; // gx2 = gSPtX[1]; // gy2 = gSPtY[1]; isNeedFiveCheck = true; return; } } // 20181025 p1 fly case if (Angle124 > 135 && Angle134 > 135 && (dist14 < dist12) && (dist14 < dist13) && (dist34 / dist23 < 3.0) && (dist24 / dist23 < 3.0) && (dist23 / dist13 < 3.0) && dist12 > 1.5) { if ((pointX123[0] == pointX123[1] && pointX123[1] == pointX123[2]) || (pointY123[0] == pointY123[1] && pointY123[1] == pointY123[2]) || (pointX123[1] == pointX123[2] && pointY123[1] == pointY123[2]) || ((Angle123 < 20) || (Angle123 > 160))) { gbFirstDotsFly[0] = true; gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtX[2] = gSPtX[3]; gSPtY[2] = gSPtY[3]; gSPtCnt = 3; if (gbFirstDotsUp) { gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; gx3 = gSPtX[2]; gy3 = gSPtY[2]; } else { gx1 = gSPtX[1]; gy1 = gSPtY[1]; gx2 = gSPtX[2]; gy2 = gSPtY[2]; } //gbFirst3DotsChecked = true; } else { //20181017 y = ax + b var a, b; if (pointX123[1] == pointX123[2]) a = (pointY123[2] - pointY123[1]) / 0.000001; else a = (pointY123[2] - pointY123[1]) / (pointX123[2] - pointX123[1]); b = pointY123[1] - (a * pointX123[1]); var Rx, Ry; Ry = (a * pointX123[0]) + b; Rx = (pointY123[0] - b) / a; if (Math.abs(pointX123[0] - Rx) > Math.abs(pointY123[0] - Ry)) // Y diecrtion fly away, use Ry to be the Y coordinate of first pt { var iy, fy; //iy = (int)Math.round(Ry); //fy = (int)Math.round((Ry - (float)iy) * (float)128.0); iy = (Ry); fy = ((Ry - iy) * 128.0); gFirstDots[0].y = iy; gFirstDots[0].fy = fy; } else // X direction fly away, use Rx to be the X coordinate of first pt { var ix, fx; //ix = (int)Math.round(Rx); //fx = (int)Math.round((Rx - (float)ix) * (float)128.0); ix = (Rx); fx = ((Rx - ix) * 128.0); gFirstDots[0].x = ix; gFirstDots[0].fx = fx; } var pointXX = (gFirstDots[0].x) + (gFirstDots[0].fx) / 128.0; var pointYY = (gFirstDots[0].y) + (gFirstDots[0].fy) / 128.0; var dist12C = Math.sqrt(((pointX123[1] - pointXX) * (pointX123[1] - pointXX)) + ((pointY123[1] - pointYY) * (pointY123[1] - pointYY))); if ((dist12C / dist23) > 3) { gbFirstDotsFly[0] = true; } else {} } gSPtCnt = 3; if (gbFirstDotsUp) { gx1 = gSPtX[1]; gy1 = gSPtY[1]; gx2 = gSPtX[2]; gy2 = gSPtY[2]; gx3 = gSPtX[3]; gy3 = gSPtY[3]; } else { gx1 = gSPtX[2]; gy1 = gSPtY[2]; gx2 = gSPtX[3]; gy2 = gSPtY[3]; } gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtX[2] = gSPtX[3]; gSPtY[2] = gSPtY[3]; return; } //20181025 // adiff12 = utils.angleDifferent(tangle[0], tangle[1]); // adiff23 = utils.angleDifferent(tangle[1], tangle[2]); // adiff31 = utils.angleDifferent(tangle[2], tangle[0]); g2ndAngle = utils.angleDifferent(utils.pointsAngle(pointX123[0], pointY123[0], pointX123[1], pointY123[1]), utils.pointsAngle(pointX123[1], pointY123[1], pointX123[2], pointY123[2])); //20181017 added for getting counter difference of first pt & second pt countDiff = (247 + gFirstDots[1].counter - gFirstDots[0].counter) % 247; dist1 = Math.sqrt(((pointX123[1] - pointX123[0]) * (pointX123[1] - pointX123[0])) + ((pointY123[1] - pointY123[0]) * (pointY123[1] - pointY123[0]))); dist2 = Math.sqrt(((pointX123[2] - pointX123[1]) * (pointX123[2] - pointX123[1])) + ((pointY123[2] - pointY123[1]) * (pointY123[2] - pointY123[1]))); dist3 = Math.sqrt(((pointX123[2] - pointX123[0]) * (pointX123[2] - pointX123[0])) + ((pointY123[2] - pointY123[0]) * (pointY123[2] - pointY123[0]))); if (dist1 == 0.0) dist1 = 0.000001; if (dist2 == 0.0) dist2 = 0.000001; if (dist3 == 0.0) dist3 = 0.000001; //20181017 added dist1 /= countDiff; d12Times = dist1 / dist2; d23Times = dist3 / dist2; d31Times = dist1 / dist3; //201809 d32Times = dist2 / dist3; // 20181011 //20181108 var dtimes1234; dtimes1234 = dist12 / dist34; if ((d12Times > 3.0 && d23Times > 3.0 && g2ndAngle > 45 && dist2 > 0.08) || (d12Times > 15.0 && d23Times > 15.0 && dist2 > 0.08) || (d12Times > 10.0 && d23Times > 10.0 && dist2 > 0.6) || (d12Times > 3.0 && d23Times > 3.0 && dtimes1234 > 3.0)) { if ((pointX123[0] == pointX123[1] && pointX123[1] == pointX123[2]) || (pointY123[0] == pointY123[1] && pointY123[1] == pointY123[2]) || (pointX123[1] == pointX123[2] && pointY123[1] == pointY123[2]) || ((g2ndAngle < 20) || (g2ndAngle > 160))) { gbFirstDotsFly[0] = true; if (gbFirstDotsUp) { gx1 = gSPtX[1]; gy1 = gSPtY[1]; gx2 = gSPtX[2]; gy2 = gSPtY[2]; gx3 = gSPtX[3]; gy3 = gSPtY[3]; } else { gx1 = gSPtX[2]; gy1 = gSPtY[2]; gx2 = gSPtX[3]; gy2 = gSPtY[3]; } gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtX[2] = gSPtX[3]; gSPtY[2] = gSPtY[3]; gSPtCnt = 3; } else { //20181017 y = ax + b var a, b; if (pointX123[1] == pointX123[2]) a = (pointY123[2] - pointY123[1]) / 0.000001; else a = (pointY123[2] - pointY123[1]) / (pointX123[2] - pointX123[1]); b = pointY123[1] - (a * pointX123[1]); var Rx, Ry; Ry = (a * pointX123[0]) + b; Rx = (pointY123[0] - b) / a; if (Math.abs(pointX123[0] - Rx) > Math.abs(pointY123[0] - Ry)) // Y diecrtion fly away, use Ry to be the Y coordinate of first pt { var iy, fy; //iy = (int)Math.round(Ry); //fy = (int)Math.round((Ry - (float)iy) * (float)128.0); iy = (Ry); fy = ((Ry - iy) * 128.0); gFirstDots[0].y = iy; gFirstDots[0].fy = fy; } else // X direction fly away, use Rx to be the X coordinate of first pt { var ix, fx; //ix = (int)Math.round(Rx); //fx = (int)Math.round((Rx - (float)ix) * (float)128.0); ix = (Rx); fx = ((Rx - ix) * 128.0); gFirstDots[0].x = ix; gFirstDots[0].fx = fx; } var pointXX = (gFirstDots[0].x) + (gFirstDots[0].fx) / 128.0; var pointYY = (gFirstDots[0].y) + (gFirstDots[0].fy) / 128.0; var dist12C = Math.sqrt(((pointX123[1] - pointXX) * (pointX123[1] - pointXX)) + ((pointY123[1] - pointYY) * (pointY123[1] - pointYY))); if ((dist12C / dist23) > 3) { gbFirstDotsFly[0] = true; // gFirstDots[1].angle = InitAngle; } else { // gFirstDots[0].angle = InitAngle; } gbFirst3DotsChecked = true; gSPtCnt = 3; if (gbFirstDotsUp) { gx1 = gSPtX[1]; gy1 = gSPtY[1]; gx2 = gSPtX[2]; gy2 = gSPtY[2]; gx3 = gSPtX[3]; gy3 = gSPtY[3]; } else { gx1 = gSPtX[2]; gy1 = gSPtY[2]; gx2 = gSPtX[3]; gy2 = gSPtY[3]; } gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtX[2] = gSPtX[3]; gSPtY[2] = gSPtY[3]; return; } } d12Times = dist2 / dist1; d23Times = dist2 / dist3; d31Times = dist1 / dist3; //if (d23Times > 15.0 && d13Times > 15.0) //if ((d23Times > 3.0 && d31Times > 3.0 && g2ndAngle > 45 && dist3 > 0.08) || (d23Times > 15.0 && d31Times > 15.0 && dist3 > 0.06)) { //20181108 //if ((d23Times > 3.0 && d31Times > 3.0 && g2ndAngle > 45 && dist3 > 0.08) || (d23Times > 15.0 && d31Times > 15.0 && dist3 > 0.06) || (d23Times > 15.0 && d31Times > 15.0 && (Math.max(dist1,dist2) > 1.5))) { //20181108 if ((d23Times > 3.0 && d31Times > 3.0 && g2ndAngle > 45 && dist3 > 0.08) || (d23Times > 15.0 && d31Times > 15.0 && dist3 > 0.06) || ((Math.max(d23Times, d31Times) * dist3) > 1.5 && d23Times > 15.0 && d31Times > 15.0)) { gbFirstDotsFly[1] = true; } // //201809 //if (gbFirstDotsFly[0] == false && gbFirstDotsFly[1] == false && gbFirstDotsFly[2] == false) if (gbFirstDotsFly[0] == false && gbFirstDotsFly[1] == false) { //20180926 d12Times = dist1 / dist2; d32Times = dist3 / dist2; d23Times = dist2 / dist3; d13Times = dist1 / dist3; g2ndAngle = utils.angleDifferent(utils.pointsAngle(pointX123[0], pointY123[0], pointX123[1], pointY123[1]), utils.pointsAngle(pointX123[1], pointY123[1], pointX123[2], pointY123[2])); if (g2ndAngle > 135) { if (d12Times > 3 && d23Times > 3 && dist2 > 0.08) { gbFirstDotsFly[0] = true; } else if (d23Times > 3 && d13Times > 3 && dist3 > 0.08) { gbFirstDotsFly[1] = true; } } } //20181025 d23Times = dist23 / dist12; d13Times = dist13 / dist12; //if (((d23Times > 3.0 && d13Times > 3.0 && Angle123 > 45 && dist12 > 0.2) || (d23Times > 15.0 && d13Times > 15.0 && dist12 > 0.02))) { //20181108 if (((d23Times > 3.0 && d13Times > 3.0 && Angle123 > 45 && dist23 > 1.5) || (d23Times > 15.0 && d13Times > 15.0 && dist23 > 1.5))) { if (dtimes2334 > 0.66 && dtimes2334 < 1.5 && Angle234 < 20) { } else { gbFirstDotsFly[2] = true; gSPtCnt = 3; if (gbFirstDotsUp) { gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; gx3 = gSPtX[3]; gy3 = gSPtY[3]; } else { gx1 = gSPtX[1]; gy1 = gSPtY[1]; gx2 = gSPtX[3]; gy2 = gSPtY[3]; } gSPtX[2] = gSPtX[3]; gSPtY[2] = gSPtY[3]; } } //20181004 if (gbFirstDotsFly[0] == true) { gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtX[2] = gSPtX[3]; gSPtY[2] = gSPtY[3]; gSPtCnt = 3; if (gbFirstDotsUp) { gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; gx3 = gSPtX[2]; gy3 = gSPtY[2]; } else { gx1 = gSPtX[1]; gy1 = gSPtY[1]; gx2 = gSPtX[2]; gy2 = gSPtY[2]; } } if (gbFirstDotsFly[1] == true) { gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtX[2] = gSPtX[3]; gSPtY[2] = gSPtY[3]; if (gbFirstDotsUp) { gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; gx3 = gSPtX[2]; gy3 = gSPtY[2]; } else { gx1 = gSPtX[1]; gy1 = gSPtY[1]; gx2 = gSPtX[2]; gy2 = gSPtY[2]; } gSPtCnt = 3; } if (gbFirstDotsFly[2] == true) { gSPtX[2] = gSPtX[3]; gSPtY[2] = gSPtY[3]; gSPtCnt = 3; if (gbFirstDotsUp) { gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; gx3 = gSPtX[2]; gy3 = gSPtY[2]; } else { gx1 = gSPtX[1]; gy1 = gSPtY[1]; gx2 = gSPtX[2]; gy2 = gSPtY[2]; } } // // for (i = 0; i < 4; i++) { // if (gbFirstDotsFly[i] == false) { // gFirstDots[i].angle = InitAngle; // break; // } // } //20181025 if (gbFirstDotsFly[0] == false && gbFirstDotsFly[1] == false && gbFirstDotsFly[2] == false) { gSPtCnt = 3; gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtX[2] = gSPtX[3]; gSPtY[2] = gSPtY[3]; if (gbFirstDotsUp) { gx1 = gSPtX[0]; gy1 = gSPtY[0]; gx2 = gSPtX[1]; gy2 = gSPtY[1]; gx3 = gSPtX[2]; gy3 = gSPtY[2]; } else { gx1 = gSPtX[1]; gy1 = gSPtY[1]; gx2 = gSPtX[2]; gy2 = gSPtY[2]; } } if (gbFirstDotsUp) { var x1, y1, x2, y2, x3, y3; var UCounter, MCounter; var MUpX, MUpY; x1 = pointX123[1]; y1 = pointY123[1]; x2 = pointX123[2]; y2 = pointY123[2]; x3 = pointX123[3]; y3 = pointY123[3]; UCounter = gFirstDots[3].counter; MCounter = gFirstDots[2].counter; if (gbFirstDotsFly[2] == true) { x1 = pointX123[0]; y1 = pointY123[0]; x2 = pointX123[1]; y2 = pointY123[1]; x3 = pointX123[3]; y3 = pointY123[3]; MCounter = gFirstDots[1].counter; } else if (gbFirstDotsFly[1] == true) { x1 = pointX123[0]; y1 = pointY123[0]; x2 = pointX123[2]; y2 = pointY123[2]; x3 = pointX123[3]; y3 = pointY123[3]; MCounter = gFirstDots[2].counter; } var angleDiff = utils.angleDifferent(utils.pointsAngle(x1, y1, x2, y2), utils.pointsAngle(x1, y1, x3, y3)); //cb.onReceiveDotTest("AngleDifferent=" + angleDiff.ToString()); dist1 = Math.sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))); if (dist1 == 0.0) dist1 = 0.000001; dist2 = Math.sqrt(((x3 - x2) * (x3 - x2)) + ((y3 - y2) * (y3 - y2))); if (dist2 == 0.0) dist2 = 0.000001; var dtimes = dist2 / dist1; // var CounterDiff; if (UCounter > MCounter) CounterDiff = UCounter - MCounter; else CounterDiff = 247 + UCounter - MCounter; dtimes = dist2 / CounterDiff / dist1; if ((dtimes > 15 && angleDiff < 30 && dist1 > 0.1) || (dtimes > 6 && angleDiff < 30 && dist2 > 3)) // 20181005 add dtimes >6 and dist2 > 3 for Up Point { MUpX = ((CounterDiff + 1) * x2) - CounterDiff * x1; MUpY = ((CounterDiff + 1) * y2) - CounterDiff * y1; var XM = (MUpX * 100); gAbsXM = XM / 100; gAbsfx = (XM % 100) * 128 / 100; var YM = (MUpY * 100); gAbsYM = YM / 100; gAbsfy = (YM % 100) * 128 / 100; } //20181111 //if (angleDiff >= gThresholdUpAngle) if (angleDiff >= gThresholdUpAngle && CounterDiff == 1) { MUpX = x2; MUpY = y2; var XM = (MUpX * 100); gAbsXM = XM / 100; gAbsfx = (XM % 100) * 128 / 100; var YM = (MUpY * 100); gAbsYM = YM / 100; gAbsfy = (YM % 100) * 128 / 100; } } gbFirst3DotsChecked = true; } /** * Auther: kims wang * Describe: 标准数据校验,无异常则将正常数据输出 * Date: 2018-10-20 */ function checkFirstPtValidate_SplitData() { //console.log("checkFirstPtValidate_SplitData -------"); //var txValue = new Array(30); var i, j; var tangle = new Array(3); var InitAngle; // var adiff12, adiff23, adiff31; var dist1, dist2, dist3; var d12Times, d23Times, d31Times; //201809 var d21Times, d32Times, d13Times; var countDiff; //20181025 Not to check 4th Pt gbFirstDotsFly[3] = true; for (i = 0; i < 3; i++) { pointX123[i] = (gFirstDots[i].x) + (gFirstDots[i].fx) / 128.0; pointY123[i] = (gFirstDots[i].y) + (gFirstDots[i].fy) / 128.0; //tangle[i] = gFirstDots[i].angle; gbFirstDotsFly[i] = false; } // adiff12 = utils.angleDifferent(tangle[0], tangle[1]); // adiff23 = utils.angleDifferent(tangle[1], tangle[2]); // adiff31 = utils.angleDifferent(tangle[2], tangle[0]); g2ndAngle = utils.angleDifferent(utils.pointsAngle(pointX123[0], pointY123[0], pointX123[1], pointY123[1]), utils.pointsAngle(pointX123[1], pointY123[1], pointX123[2], pointY123[2])); //20181017 added for getting counter difference of first pt & second pt countDiff = (247 + gFirstDots[1].counter - gFirstDots[0].counter) % 247; dist1 = Math.sqrt(((pointX123[1] - pointX123[0]) * (pointX123[1] - pointX123[0])) + ((pointY123[1] - pointY123[0]) * (pointY123[1] - pointY123[0]))); dist2 = Math.sqrt(((pointX123[2] - pointX123[1]) * (pointX123[2] - pointX123[1])) + ((pointY123[2] - pointY123[1]) * (pointY123[2] - pointY123[1]))); dist3 = Math.sqrt(((pointX123[2] - pointX123[0]) * (pointX123[2] - pointX123[0])) + ((pointY123[2] - pointY123[0]) * (pointY123[2] - pointY123[0]))); if (dist1 == 0.0) dist1 = 0.000001; if (dist2 == 0.0) dist2 = 0.000001; if (dist3 == 0.0) dist3 = 0.000001; //20181017 added dist1 /= countDiff; d12Times = dist1 / dist2; d23Times = dist3 / dist2; d31Times = dist1 / dist3; //201809 d32Times = dist2 / dist3; // 20181011 //201809 if ((d12Times > 3.0 && d23Times > 3.0 && g2ndAngle > 45 && dist2 > 0.08) || (d12Times > 15.0 && d23Times > 15.0 && dist2 > 0.08)) { if ((pointX123[0] == pointX123[1] && pointX123[1] == pointX123[2]) || (pointY123[0] == pointY123[1] && pointY123[1] == pointY123[2]) || (pointX123[1] == pointX123[2] && pointY123[1] == pointY123[2]) || ((g2ndAngle < 20) || (g2ndAngle > 160))) { //gFirstPtIndex = 1; gbFirstDotsFly[0] = true; } else { //20181017 y = ax + b var a, b; if (pointX123[1] == pointX123[2]) a = (pointY123[2] - pointY123[1]) / 0.000001; else a = (pointY123[2] - pointY123[1]) / (pointX123[2] - pointX123[1]); b = pointY123[1] - (a * pointX123[1]); var Rx, Ry; Ry = (a * pointX123[0]) + b; Rx = (pointY123[0] - b) / a; if (Math.abs(pointX123[0] - Rx) > Math.abs(pointY123[0] - Ry)) // Y diecrtion fly away, use Ry to be the Y coordinate of first pt { var iy, fy; iy = parseInt(Ry); fy = parseInt((Ry - iy) * 128.0); gFirstDots[0].y = iy; gFirstDots[0].fy = fy; } else // X direction fly away, use Rx to be the X coordinate of first pt { var ix, fx; ix = parseInt(Rx); fx = parseInt((Rx - ix) * 128.0); gFirstDots[0].x = ix; gFirstDots[0].fx = fx; } var pointXX = (gFirstDots[0].x) + (gFirstDots[0].fx) / 128.0; var pointYY = (gFirstDots[0].y) + (gFirstDots[0].fy) / 128.0; var dist12C = Math.sqrt(((pointX123[1] - pointXX) * (pointX123[1] - pointXX)) + ((pointY123[1] - pointYY) * (pointY123[1] - pointYY))); if ((dist12C / dist2) > 3) { gbFirstDotsFly[0] = true; } gbFirst3DotsChecked = true; return; } } d12Times = dist2 / dist1; d23Times = dist2 / dist3; d31Times = dist1 / dist3; d13Times = dist1 / dist3; // 201809 if ((d23Times > 3.0 && d31Times > 3.0 && g2ndAngle > 45) || (d23Times > 15.0 && d31Times > 15.0)) { gbFirstDotsFly[1] = true; } //201809 if (gbFirstDotsFly[0] == false && gbFirstDotsFly[1] == false) { //20180926 d12Times = dist1 / dist2; d23Times = dist2 / dist3; g2ndAngle = utils.angleDifferent(utils.pointsAngle(pointX123[0], pointY123[0], pointX123[1], pointY123[1]), utils.pointsAngle(pointX123[1], pointY123[1], pointX123[2], pointY123[2])); if (g2ndAngle > 135) { if (d12Times > 3 && d23Times > 3) { gbFirstDotsFly[0] = true; } else if (d23Times > 3 && d13Times > 3 && dist3 > 0.08) { gbFirstDotsFly[1] = true; } } } //20181004 d21Times = dist2 / dist1; d31Times = dist3 / dist1; if (((d21Times > 3.0 && d31Times > 3.0 && g2ndAngle > 45) || (d21Times > 15.0 && d31Times > 15.0)) && gbFirstDotsUp) { //gFirstPtIndex = 3; gbFirstDotsFly[2] = true; } //20181004 if (gbFirstDotsFly[0] == true) { gSPtX[0] = gSPtX[1]; gSPtY[0] = gSPtY[1]; gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtCnt = 2; } if (gbFirstDotsFly[1] == true) { gSPtX[1] = gSPtX[2]; gSPtY[1] = gSPtY[2]; gSPtCnt = 2; } if (gbFirstDotsFly[2] == true && gbFirstDotsUp) { gSPtCnt = 2; } // for (i = 0; i < 3; i++) { // if (gbFirstDotsFly[i] == false) { // gFirstDots[i].angle = InitAngle; // break; // } // } if (gbFirstDotsFly[0] == false && gbFirstDotsFly[1] == false && gbFirstDotsFly[2] == false && gbFirstDotsUp) { var dtimes = 0; gSPtCnt = 3; //1,2,3 Angle Diffs gAngleDiff[0] = utils.angleDifferent(utils.pointsAngle(gSPtX[0], gSPtY[0], gSPtX[1], gSPtY[1]), utils.pointsAngle(gSPtX[1], gSPtY[1], gSPtX[2], gSPtY[2])); dist1 = Math.sqrt(((gSPtX[1] - gSPtX[0]) * (gSPtX[1] - gSPtX[0])) + ((gSPtY[1] - gSPtY[0]) * (gSPtY[1] - gSPtY[0]))); if (dist1 == 0.0) dist1 = 0.000001; dist2 = Math.sqrt(((gSPtX[2] - gSPtX[1]) * (gSPtX[2] - gSPtX[1])) + ((gSPtY[2] - gSPtY[1]) * (gSPtY[2] - gSPtY[1]))); dist2 = dist2 / gMCounterDiff; if (dist2 == 0.0) dist2 = 0.000001; //dtimes = dist2 / dist1; dtimes = dist2 / dist1; if (gAngleDiff[0] < gThresholdAngle) { if (dtimes < gThresholdTimes || dist2 < gThresholdDist) { //201809 if (dtimes > (gThresholdTimes * 2) && dist1 > 0.1) { gbFirst3DotsChecked = true; gbFirstDotsFly[2] = true; gSPtCnt = 2; return; } gbFirstDotsFly[2] = false; gSPtCnt = 3; } else { gbFirst3DotsChecked = true; gbFirstDotsFly[2] = true; gSPtCnt = 2; return; } } else { gbFirstDotsFly[2] = true; gSPtCnt = 2; } } } /** * Auther: kims wang * Describe: 有效点验证 * Date: 2018-10-20 */ /** * Auther: kims wang * Describe: 处理成点数据(1) * Date: 2018-10-20 */ function processDots(g_CompressData, bIsOnline, bOID4) { penOnlineStrokeDot(g_CompressData, bIsOnline, bOID4); } /** * Auther: kims wang * Describe: 处理在线有效数据 * Date: 2018-10-20 */ function penOnlineStrokeDot(data, bIsOnline, bOID4) { let dot = { counter: 0, // 点计数 sectionID: 0, // 区域ID ownerID: 0, // 客户ID bookID: 0, // 书号 pageID: 0, // 页号 timeLong: utils.Dot.timeLong, // 当前点的RTC 时间,返回时间戳 ms(起止时间是2018-01-01 00:00:00,000) x: 0, // 点横坐标,整数部分 y: 0, // 点纵坐标,整数部分 fx: 0.0, // 点横坐标,小数部分 fy: 0.0, // 点纵坐标,小数部分 ab_x: 0.0, // 点横坐标,整数+小数部分 ab_y: 0.0, // 点纵坐标,整数+小数部分 dotType: "", force: 0, // 点的压力值 angle: 0, // 点的角度值 color: 0, // 笔的颜色值 }; if (bOID4) { let SBID = (data[1] & 0xff) * 256 + (data[3] & 0xff); dot.sectionID = parseInt(SBID / 1024); dot.ownerID = (data[2] & 0xff); dot.bookID = SBID % 1024; dot.counter = data[0] & 0xff; dot.pageID = data[4] & 0xff; dot.x = (data[5] & 0xff) + ((data[6] & 0xff) * 256); dot.fx = ((data[7] & 0xff) * 100 / 128); dot.y = (data[8] & 0xff) + ((data[9] & 0xff) * 256); dot.fy = ((data[10] & 0xff) * 100 / 128); dot.force = ((data[12] << 8) & 0xff00) | (data[11] & 0xff); dot.ab_x = dot.x + (dot.fx / 100) dot.ab_y = dot.y + (dot.fy / 100) // console.log("xxxx = " + dot.x + "yyyy=" + dot.y + "zzz = " + dot.force); //dot.force ; // dot.force += ; // dot.setColor(convertColor(onlineData[14] & 0xff)); // console.log("Dot data is : "+JSON.stringify(dot)); } if (dot.PageID < 0 || dot.BookID < 0) { return; } dot.timeLong = ((data[13] & 0xff) + ((data[14] & 0xff) << 8) + ((data[15] & 0xff) << 16) + ((data[16] & 0xff) << 24)) * 1000 + (data[17] & 0xff) + ((data[18] & 0xff) << 8); // console.log(" dot.timeLong is : " + dot.timeLong); dot.force = utils.outputForce(dot.force); pointZ = dot.force; let Angle = (data[19] & 0x0ff) | ((data[20] << 8) & 0xff00); dot.angle = Angle; if (dot.angle > 360) { return; } sendDot(dot, bIsOnline); } /** * Auther: kims wang * Describe: 分解数据,将数据输出 * Date: 2018-10-20 */ function sendDot(dot, bIsOnline) { /**********************20180820 T111A滤波算法 ***************************/ if (dot.x <= 0 || dot.y <= 0) { return; } if (dot.force > 0) { // down or move if (!firstDot) { // down firstDot = true; gCurBookID = dot.bookID; gCurPageID = dot.pageID; dot.dotType = utils.DotType.PEN_DOWN; /********************20180910 补UP点*********************/ // lastDistence = 1; gLastMoveDot = dot; // mendUpArray.push(dot); } else { if (gCurPageID != dot.pageID || gCurBookID != dot.bookID) { return; } gCurBookID = dot.bookID; gCurPageID = dot.pageID; dot.dotType = utils.DotType.PEN_MOVE; gpreMoveDot = gLastMoveDot; gLastMoveDot = dot; // mendUpArray.push(dot); } } else { if (firstDot) { // To pageID and bookID ensure consistent if (gCurPageID != dot.pageID || gCurBookID != dot.bookID) { dot.pageID = gCurPageID; dot.bookID = gCurBookID; } var lastDistance = Math.max(Math.abs((gpreMoveDot.x + gpreMoveDot.fx / 100.0) - (gLastMoveDot.x + gLastMoveDot.fx / 100.0)), Math.abs((gpreMoveDot.y + gpreMoveDot.fy / 100.0) - (gLastMoveDot.y + gLastMoveDot.fy / 100.0))) + 1; var distance = Math.max(Math.abs((dot.x + dot.fx / 100.0) - (gLastMoveDot.x + gLastMoveDot.fx / 100.0)), Math.abs((dot.y + dot.fy / 100.0) - (gLastMoveDot.y + gLastMoveDot.fy / 100.0))) + 1; if ((distance / lastDistance > 10.0 && lastDistance >= 0.5) || (distance > 5.0 && lastDistance < 0.5)) { var dotx = 2 * (gLastMoveDot.x + gLastMoveDot.fx / 100.0) - (gpreMoveDot.x + gpreMoveDot.fx / 100.0); var doty = 2 * (gLastMoveDot.y + gLastMoveDot.fy / 100.0) - (gpreMoveDot.y + gpreMoveDot.fy / 100.0); dot.x = parseInt(dotx); dot.fx = parseInt(dotx * 100 % 100); dot.y = parseInt(doty); dot.fy = parseInt(doty * 100 % 100); } dot.dotType = utils.DotType.PEN_UP; firstDot = false; } else { return; } // 限制点up只送一次 } //console.log('writeData' + 'dot.force=' + dot.force + 'dot.counter=' + dot.counter ); // 将数据传送出去 var dotData = dotDataCorrector.correct_point(dot); if (dotData.length > 0) { for (var i = 0; i < dotData.length; i++) { var newDot = dotData[i]; // if (bIsOnline) { // console.log('writeData' + 'dot.force=' + dot.force + 'dot.counter=' + dot.counter + 'dot.x = '+ dot.x + 'dot.y = ' + dot.y); if (dot != null) { if (isOffset) { //偏移 需修偏移 newDot = patchOffset.angleAndSensitivityLevelCheck(newDot) emitPoint(newDot) } else { filter(newDot) } } // } } } } // 2022-7-15 cd function filter(dot) { // emitPoint(dot) // return const firstFilterDot = firstFilter.handle(dot) if (!firstFilterDot) return const firstAverageDot = firstAverage.handle(firstFilterDot) if (!firstAverageDot) return const secondAverageDot = secondAverage.handle(firstAverageDot) if (!secondAverageDot) return const thirdAverageDot = thirdAverage.handle(secondAverageDot) if (!thirdAverageDot) return const fourthAverageDot = fourthAverage.handle(thirdAverageDot) if (!fourthAverageDot) return const fifthAverageDot = fifthAverage.handle(fourthAverageDot) if (!fifthAverageDot) return // const sixthAverageDot = sixthAverage.handle(fifthAverageDot) // if (!sixthAverageDot) return emitPoint(fifthAverageDot) } class LoseDot { constructor() { this.lastDot = null } handle(dot) { switch (dot.dotType) { case 'PEN_DOWN': { this.lastDot = dot return dot } case 'PEN_MOVE': { //两点之间距离 const distance = Math.sqrt(Math.pow((dot.ab_x - this.lastDot.ab_x), 2) + Math.pow((dot.ab_y - this.lastDot.ab_y), 2)) //距离小于 0.25 if (distance > 0.25) { this.lastDot = dot return dot } return false } case 'PEN_UP': { this.lastDot = null return dot } default: break; } } } class Average { constructor() { this.points = [] } handle(dot) { switch (dot.dotType) { case "PEN_DOWN": this.points.push(dot) return dot case "PEN_MOVE": this.points.push(dot) if (this.points.length === 3) { const _dot = this.threeAverage(...this.points) this.points.shift() return _dot } else { this.points.push(dot) const _dot = this.threeAverage(...this.points) this.points.shift() return _dot } case "PEN_UP": this.points = [] return dot // // 无up // const up = this.points.some(i => i.dotType === 'PEN_MOVE') // if (!up) { // this.points.push({ // ...dot, // dotType: 'PEN_MOVE' // }) // } // this.points.shift() // this.points.push(dot) // this.points.push(dot) // const _dot = this.threeAverage(...this.points) // this.points = [] // return _dot default: return false } } // 三点 threeAverage(dot1, dot2, dot3) { const [x1, y1] = [(dot1.ab_x + dot2.ab_x) / 2, (dot1.ab_y + dot2.ab_y) / 2] const [x2, y2] = [(dot2.ab_x + dot3.ab_x) / 2, (dot2.ab_y + dot3.ab_y) / 2] dot2.ab_x = (x1 + x2) / 2 dot2.ab_y = (y1 + y2) / 2 return dot2 } } const firstFilter = new LoseDot() const firstAverage = new Average() const secondAverage = new Average() const thirdAverage = new Average() const fourthAverage = new Average() const fifthAverage = new Average() const sixthAverage = new Average() // let threePointCenterList = [] // function threePointToCenter(dot) { // if (dot.dotType === 'PEN_DOWN') { // threePointCenterList.push(dot) // emitPoint(dot) // } // if (dot.dotType === 'PEN_MOVE') { // const one = threePointCenterList[threePointCenterList.length - 1] // //两点之间距离 // const _distance = Math.sqrt(Math.pow((dot.ab_x - one.ab_x), 2) + Math.pow((dot.ab_y - one.ab_y), 2)) // //距离小于0.2 丢弃点 // if (_distance > 0.5) { // threePointCenterList.push(dot) // } // if (threePointCenterList.length === 3) { // const one = threePointCenterList[0] // const two = threePointCenterList[1] // const three = threePointCenterList[2] // const [x1, y1] = [(one.ab_x + two.ab_x) / 2, (one.ab_y + two.ab_y) / 2] // const [x2, y2] = [(two.ab_x + three.ab_x) / 2, (two.ab_y + three.ab_y) / 2] // two.ab_x = (x1 + x2) / 2 // two.ab_y = (y1 + y2) / 2 // threePointCenterList = [one, two, three] // emitPoint(two) // threePointCenterList.shift() // } // } // if (dot.dotType === 'PEN_UP') { // threePointCenterList = [] // emitPoint(dot) // } // } // Android start // const migrationDou = 0.5 // let migrationDotMigration, migrationDotQueue, migrationDotQueue2, migrationDotQueue3 // let lastDot = null // function mGoMigration1(dot) { // if (dot.dotType === 'PEN_DOWN') { // migrationDotMigration = [] // migrationDotMigration.push(dot) // lastDot = dot // mGoMigration2(dot) // } else if (dot.dotType === 'PEN_MOVE' && dot.force > 1) { // migrationDotMigration.push(dot) // const dist12 = Math.sqrt(((dot.ab_x - lastDot.ab_x) * (dot.ab_x - lastDot.ab_x)) + // ((dot.ab_y - lastDot.ab_y) * (dot.ab_y - lastDot.ab_y))) // lastDot = dot // if (dist12 > migrationDou) { // mGoMigration2(dot) // } // } // // else if (dot.dotType === 'PEN_MOVE' && dot.force === 1) { // // mGoMigration2(dot) // // } // else if (dot.dotType === 'PEN_UP') { // lastDot = dot // mGoMigration2(dot) // migrationDotMigration = [] // } // } // function mGoMigration2(dot) { // if (dot.dotType === 'PEN_DOWN') { // migrationDotQueue2 = [] // migrationDotQueue2.push(dot) // } else if (dot.dotType === 'PEN_MOVE') { // migrationDotQueue2.push(dot) // if (migrationDotQueue2.length === 3) { // const dot1 = migrationDotQueue2[0] // const dot2 = migrationDotQueue2[1] // const dot3 = migrationDotQueue2[2] // const center1X = (dot1.ab_x + dot2.ab_x) / 2 // const center1y = (dot1.ab_y + dot2.ab_y) / 2 // const center2X = (dot3.ab_x + dot2.ab_x) / 2 // const center2y = (dot3.ab_y + dot2.ab_y) / 2 // dot2.ab_x = (center1X + center2X) / 2 // dot2.ab_y = (center1y + center2y) / 2 // threePointCenter2(dot1) // migrationDotQueue2.shift() // } // } else if (dot.dotType === 'PEN_UP') { // if (migrationDotQueue2 !== null && migrationDotQueue2.length > 0) { // migrationDotQueue2.map(_dot => { // threePointCenter2(_dot) // }) // } // threePointCenter2(dot); // } // } // function threePointCenter2(dot) { // if (dot.dotType === 'PEN_DOWN') { // migrationDotQueue3 = [] // migrationDotQueue3.push(dot) // } else if (dot.dotType === 'PEN_MOVE') { // migrationDotQueue3.push(dot) // if (migrationDotQueue3.length === 3) { // const dot1 = migrationDotQueue3[0] // const dot2 = migrationDotQueue3[1] // const dot3 = migrationDotQueue3[2] // dot2.ab_x = (dot1.ab_x, dot3.ab_x) / 2 // dot2.ab_y = (dot1.ab_y, dot3.ab_y) / 2 // threePointCenter(dot1) // migrationDotQueue3.shift() // } // } else if (dot.dotType === 'PEN_UP') { // if (migrationDotQueue3 !== null && migrationDotQueue3.length > 0) { // migrationDotQueue3.map(_dot => threePointCenter(_dot)) // } // threePointCenter(dot) // } // } // function threePointCenter(dot) { // if (dot.dotType === 'PEN_DOWN') { // migrationDotQueue = [] // migrationDotQueue.push(dot) // } else if (dot.dotType === 'PEN_MOVE') { // migrationDotQueue.push(dot) // if (migrationDotQueue.length === 3) { // const dot1 = migrationDotQueue[0] // const dot2 = migrationDotQueue[1] // const dot3 = migrationDotQueue[2] // const center1X = (dot1.ab_x + dot2.ab_x) / 2 // const center1y = (dot1.ab_y + dot2.ab_y) / 2 // const center2X = (dot3.ab_x + dot2.ab_x) / 2 // const center2y = (dot3.ab_y + dot2.ab_y) / 2 // dot2.ab_x = (center1X + center2X) / 2; // dot2.ab_y = (center1y + center2y) / 2; // emitPoint(dot1) // migrationDotQueue.shift() // } // } else if (dot.dotType === 'PEN_UP') { // if (migrationDotQueue !== null && migrationDotQueue.length > 0) { // migrationDotQueue.map(_dot => emitPoint(_dot)) // } // emitPoint(dot) // } // } // Android end //向上层应用发点 function emitPoint(dot) { // console.log(JSON.stringify(dot)) event.emit('AddressDataChanged', dot); } module.exports = { splitData: splitData, changeOffset: changeOffset }