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