Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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_Jquery_Html_Svg_Html5 Canvas - Fatal编程技术网

Javascript 如何允许在网格上的点之间绘制向量?

Javascript 如何允许在网格上的点之间绘制向量?,javascript,jquery,html,svg,html5-canvas,Javascript,Jquery,Html,Svg,Html5 Canvas,在基本上只是Python和C#之后,我目前正在努力过渡到HTML5和Java 我正在(尝试)制作一个点网格,见下面的代码,在点击点之间画线(见下面的代码),最终结果是我可以用它绘制出一个平面图(我是一个建筑商) 我还试图找出如何删除单独绘制的线,而不必按下“重置”按钮,可能通过右键单击它们 不管怎么说,由于是如此新,这让我头痛不已。我一直在摆弄paper.js和jquery,现在已经好几天没有什么运气了 你们中有谁能给我指出一个正确的方向,给我一个我想要的教程/例子,或者给我一些关于在哪里寻求帮

在基本上只是Python和C#之后,我目前正在努力过渡到HTML5和Java

我正在(尝试)制作一个点网格,见下面的代码,在点击点之间画线(见下面的代码),最终结果是我可以用它绘制出一个平面图(我是一个建筑商)

我还试图找出如何删除单独绘制的线,而不必按下“重置”按钮,可能通过右键单击它们

不管怎么说,由于是如此新,这让我头痛不已。我一直在摆弄paper.js和jquery,现在已经好几天没有什么运气了

你们中有谁能给我指出一个正确的方向,给我一个我想要的教程/例子,或者给我一些关于在哪里寻求帮助的建议吗

如果做不到这一点,人们如何在这个网格上“点击”一个“点”,并使其对应于向量的起点和终点

我已经包括了我在下面工作的代码

点网格:

Vector,使用paper.js(根据此处的教程制作,最终结果在页面底部):

var值={
fixLength:false,
固定角度:假,
秀圈:错,
showAngleLength:正确,
显示坐标:false
};
变量向量开始,向量,向量先前;
变量向量项、项目、dashedItems;
函数processVector(事件、拖动){
vector=event.point-vectorStart;
如果(矢量上一个){
if(values.fixLength&&values.fixAngle){
向量=向量先前;
}else if(value.fixLength){
vector.length=vector.length;
}else if(值。固定角度){
vector=vector.project(vectorPrevious);
}
}
牵引矢量(阻力);
}
函数drawVector(拖动){
若有(项目){
对于(变量i=0,l=items.length;i90
?textAngle=180+vector.angle:vector.angle;
//标签需要根据不同的位置移动不同的数量
//向量象限:
var away=(符号>=0?[1,4]:[2,3])。indexOf(向量象限)!=-1
? 8 : 0;
value=value | | vector.length;
var text=新点文本({
点:中间+远离中心。正常化(远离+长度大小),
内容:(前缀| |“”)+Math.floor(值*1000)/1000,
fillColor:'黑色',
理由:“中心”
});
文本。旋转(文本角度);
项目。推送(文本);
var values = {
    fixLength: false,
    fixAngle: false,
    showCircle: false,
    showAngleLength: true,
    showCoordinates: false
};

var vectorStart, vector, vectorPrevious;
var vectorItem, items, dashedItems;

function processVector(event, drag) {
    vector = event.point - vectorStart;
    if (vectorPrevious) {
        if (values.fixLength && values.fixAngle) {
        vector = vectorPrevious;
        } else if (values.fixLength) {
        vector.length = vectorPrevious.length;
        } else if (values.fixAngle) {
            vector = vector.project(vectorPrevious);
        }
    }
    drawVector(drag);
}

function drawVector(drag) {
    if (items) {
        for (var i = 0, l = items.length; i < l; i++) {
            items[i].remove();
        }
    }
    if (vectorItem)
        vectorItem.remove();
    items = [];
    var arrowVector = vector.normalize(10);
    var end = vectorStart + vector;
    vectorItem = new Group([
        new Path([vectorStart, end]),
        new Path([
            end + arrowVector.rotate(135),
            end,
            end + arrowVector.rotate(-135)
        ])
    ]);
    vectorItem.strokeWidth = 0.75;
    vectorItem.strokeColor = '#e4141b';
    // Display:
    dashedItems = [];
    // Draw Circle
    if (values.showCircle) {
        dashedItems.push(new Path.Circle({
            center: vectorStart,
            radius: vector.length
        }));
    }
    // Draw Labels
    if (values.showAngleLength) {
        drawAngle(vectorStart, vector, !drag);
        if (!drag)
            drawLength(vectorStart, end,                                vector.angle < 0 ? -1 : 1, true);
}
var quadrant = vector.quadrant;
if (values.showCoordinates && !drag) {
    drawLength(vectorStart, vectorStart + [vector.x, 0],
            [1, 3].indexOf(quadrant) != -1 ? -1 : 1, true, vector.x, 'x: ');
    drawLength(vectorStart, vectorStart + [0, vector.y], 
            [1, 3].indexOf(quadrant) != -1 ? 1 : -1, true, vector.y, 'y: ');
}
for (var i = 0, l = dashedItems.length; i < l; i++) {
    var item = dashedItems[i];
    item.strokeColor = 'black';
    item.dashArray = [1, 2];
    items.push(item);
}
// Update palette
values.x = vector.x;
values.y = vector.y;
values.length = vector.length;
values.angle = vector.angle;
}

function drawAngle(center, vector, label) {
    var radius = 25, threshold = 10;
    if (vector.length < radius + threshold ||   Math.abs(vector.angle) < 15)
        return;
    var from = new Point(radius, 0);
    var through = from.rotate(vector.angle / 2);
    var to = from.rotate(vector.angle);
    var end = center + to;
    dashedItems.push(new Path.Line(center,
            center + new Point(radius + threshold,  0)));
    dashedItems.push(new Path.Arc(center + from, center +   through, end));
    var arrowVector = to.normalize(7.5).rotate(vector.angle < 0 ? -90 : 90);
    dashedItems.push(new Path([
            end + arrowVector.rotate(135),
            end,
            end + arrowVector.rotate(-135)
    ]));
    if (label) {
        // Angle Label
        var text = new PointText(center
                + through.normalize(radius + 10)    + new Point(0, 3));
        text.content = Math.floor(vector.angle * 100) /     100 + '°';
        text.fillColor = 'black';
        items.push(text);
    }
}

function drawLength(from, to, sign, label, value, prefix) {
    var lengthSize = 5;
    if ((to - from).length < lengthSize * 4)
        return;
    var vector = to - from;
    var awayVector = vector.normalize(lengthSize).rotate(90     * sign);
    var upVector = vector.normalize(lengthSize).rotate(45 *     sign);
    var downVector = upVector.rotate(-90 * sign);
    var lengthVector = vector.normalize(
            vector.length / 2 - lengthSize *    Math.sqrt(2));
    var line = new Path();
    line.add(from + awayVector);
    line.lineBy(upVector);
    line.lineBy(lengthVector);
    line.lineBy(upVector);
    var middle = line.lastSegment.point;
    line.lineBy(downVector);
    line.lineBy(lengthVector);
    line.lineBy(downVector);
    dashedItems.push(line);
    if (label) {
        // Length Label
        var textAngle = Math.abs(vector.angle) > 90
                ? textAngle = 180 + vector.angle    : vector.angle;
        // Label needs to move away by different amounts    based on the
        // vector's quadrant:
        var away = (sign >= 0 ? [1, 4] : [2,    3]).indexOf(vector.quadrant) != -1
                ? 8 : 0;
        value = value || vector.length;
        var text = new PointText({
            point: middle +     awayVector.normalize(away + lengthSize),
            content: (prefix || '') +   Math.floor(value * 1000) / 1000,
            fillColor: 'black',
            justification: 'center'
        });
        text.rotate(textAngle);
        items.push(text);
    }
}

var dashItem;

function onMouseDown(event) {
    var end = vectorStart + vector;
    var create = false;
    if (event.modifiers.shift && vectorItem) {
        vectorStart = end;
        create = true;
    } else if (vector && (event.modifiers.option
            || end && end.getDistance(event.point) <    10)) {
        create = false;
    } else {
        vectorStart = event.point;
    }
    if (create) {
        dashItem = vectorItem;
        vectorItem = null;
    }
    processVector(event, true);
//  document.redraw();
}

function onMouseDrag(event) {
    if (!event.modifiers.shift && values.fixLength &&   values.fixAngle)
        vectorStart = event.point;
    processVector(event, event.modifiers.shift);
}

function onMouseUp(event) {
    processVector(event, false);
    if (dashItem) {
        dashItem.dashArray = [1, 2];
        dashItem = null;
    }
    vectorPrevious = vector;
}