Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将运动剪裁到边界框?_Javascript_Algorithm_Authentication_Input_Hex - Fatal编程技术网

Javascript 如何将运动剪裁到边界框?

Javascript 如何将运动剪裁到边界框?,javascript,algorithm,authentication,input,hex,Javascript,Algorithm,Authentication,Input,Hex,我正在努力寻找基于某种输入格式输出一系列笔位的逻辑 笔的位置数据应以保持“笔向下”和“笔向上”状态的方式进行转换(我正在工作),并剪辑输入矩形区域以外的任何笔移动(x=-8192,y=-8192)。。(8191, 8191). 我不能让那剪贴工作 请参见下面的说明,了解该剪裁应如何进行: 说明 预期输出示例 输入数据: F0A0417F40004000417FC067086708804001C0670840004000187818784000804000 输入数据: F0A0417F410

我正在努力寻找基于某种输入格式输出一系列笔位的逻辑

笔的位置数据应以保持“笔向下”和“笔向上”状态的方式进行转换(我正在工作),并剪辑输入矩形区域以外的任何笔移动(x=-8192,y=-8192)。。(8191, 8191). 我不能让那剪贴工作

请参见下面的说明,了解该剪裁应如何进行:

说明

预期输出示例
输入数据: F0A0417F40004000417FC067086708804001C0670840004000187818784000804000

输入数据: F0A0417F4100417FC067086708804001C067082C3C18782C3C804000


//用于解码输入数据//
让commands=[],command,allPos=“”,lastPos;
函数预编码(十六进制){
对于(设i=0,len;i='8'?2:4;
设num=hex.slice(i,i+len)
如果(len==2){//操作码
命令=[]
命令。推送(命令)
}
否则{
num=penDecode(num);
console.log(num);
}
命令推送(num)
}
console.log(命令);
返回命令;
}
//输出//
函数输出(命令){
让isPenDown=false;
设x=0,y=0;
让输出=”;
let color=“”
对于(让[opcode,…args]的命令){
如果(操作码==='F0'){
x=y=0;
isPenDown=false;
color=“CO”+0+0+0+255+;\n”;
输出+=“CLR;\n”;
}else if(操作码=='80'){
isPenDown=args[0]>0;
输出+=“笔”+(isPenDown?“向下”:“向上”)+“;\n”;
}else if(操作码=='A0'){
color=“CO”+args.join(“”+“;\n”;
输出+=颜色
}else if(操作码=='C0'){
设allPos=“”,lastPos;
对于(设i=0;i
预期结果
创建与上述示例相同的输出。

每当坐标移出边界(或回到边界内)时,您需要找到与边界框的交点。在某些情况下,线段甚至可以进入和退出边界框,给出两个交点

要计算直线段(从x1,y1到x2,y2)和y处水平线之间的交点,您可以将此公式用于x坐标:

x=x1+(y-y1)*(x2-x1)/(y2-y1)

显然,交点的y坐标已经由y给出

当下列条件之一为真时,将不存在交叉点:

  • y1
  • y1>y和y2>y
  • y1=y2
因此,要确定线段是否穿过边界框(-8192,-8192)到(81918191)的四条边之一,您需要检查四个交点。然后可以找到其中的0、1或2个交点

这是我根据对您上一个问题(关于十六进制编码)的回答改编的代码:

函数与轴相交(x1、y1、x2、y2、y){
如果(y1y&&y2>y | | y1==y2)返回[];//无交叉点
返回[数学舍入(x1+(y-y1)*(x2-x1)/(y2-y1)),y];
}
函数解码(十六进制){
让命令=[];
for(设i=0,len,command;i=“8”?2:4;
设num=parseInt(十六进制切片(i,i+len),16);
如果(len==2){//操作码
command=[];//启动一个新命令
命令。推(命令);
}else{//Number。用偏移量二进制编码,使用2 x 7位
num=((num&0x7F00)>>1)+(num&0x7F)-0x2000;
}
command.push(num);//在当前命令中推送操作码或参数
}
返回命令;
}
功能分解(十六进制){
让isPenDown=false;
让ispennibox=true;
设x=0,y=0;
让输出=”;
let命令=解码(十六进制);
for(让[opcode,…args]的命令){
if(操作码===0xF0){
x=y=0;
isPenDown=false;
ispennibox=true;
输出+=“CLR;\n”;
}else if(操作码===0x80){
isPenDown=args[0]>0;
如果(ISPENIBOX)输出+=“笔”+(isPenDown?“向下”:“向上”)+“;\n”;
}else if(操作码===0xA0){
输出+=“CO”+args.join(“”+“;\n”;
}else if(操作码===0xC0){
如果(!isPenDown){
对于(设i=0;i//For decode inputData//
let commands =[] , command , allPos = "", lastPos;

function proDecode(hex) {
    for (let i = 0, len; i < hex.length; i+=len) {

        // Opcodes take 1 byte (i.e. 2 hex characters), and 
        // numbers take 2 bytes (4 characters)
        len = hex[i] >= '8' ? 2:4;
        let num = hex.slice(i,i+len)
        if (len === 2) { // opcode
         command = []
         commands.push(command)
        }
        else{
           num = penDecode(num);
           console.log(num);

        }
        command.push(num)
    }
    console.log(commands);

    return commands;
}



//for outPut//
unction proOutput(commands){
    let isPenDown = false;
    let x = 0, y = 0;
    let output = "";
    let color = ""
    for (let [opcode, ...args] of commands) {        
        if (opcode === 'F0') {            
            x = y = 0;
            isPenDown = false;
            color = "CO" + 0 + 0 + 0 + 255 + ";\n";
            output += "CLR;\n";
        } else if (opcode === '80') {
            isPenDown = args[0] > 0;
            output += "PEN " + (isPenDown ? "DOWN" : "UP") + ";\n";
        } else if (opcode === 'A0') {
            color = "CO " + args.join(" ") + ";\n";
            output += color
        } else if (opcode === 'C0') {
            let allPos = "", lastPos;
            for (let i = 0; i < args.length; i+=2) {
                x += args[i];
                y += args[i+1];
                if(x <-8192){
                    x= -8192          
                } else if (x>8191){
                    x= 8191
                    lastPos = ` (${x}, ${y})`;              
                }else if (y<-8192){
                    y= -8192          
                }else if (y>8191){
                    y= 8191
                    output += "y PEN UP" + ";\n";
                } else{
                }
                lastPos = ` (${x}, ${y})`;
                if (isPenDown) allPos += lastPos;  
            }
            output += "MV" + (allPos || lastPos) + ";\n";
        } // else: ignore unknown commands
    }