【问题标题】:Dragging point along vector with mouse用鼠标沿矢量拖动点
【发布时间】:2015-03-12 22:57:30
【问题描述】:

在过去的几天里,我一直在试验三角学,并想出了你在某些游戏中发现的那些简洁的五边形统计数据之一。 (fiddle!)

我真的很想让内部多边形的顶点可以拖动以更改统计值。我的鼠标功能运行良好,但是用鼠标在线上拖动点的最佳方法是什么?

我创建了一张图片来可视化我的问题;红色多边形是“当前”多边形,粉色线条代表新多边形,粉色圆圈强调顶点的新点,蓝色线条是矢量切线,绿色圆圈是光标。强>

我之前写过一个处理向量的程序,但我不知道如何将它应用到这种情况。

这是一些代码(在循环函数中):

for(var i = 0; i < innerPolygonKnobs.length; i ++){
    var knob = innerPolygonKnobs[i];
    distX = knob.x-mouse.x;
    distY = knob.y-mouse.y;
    distTotal = Math.sqrt(distX*distX + distY*distY);
    if(distTotal < 8){
        if(!knob.over)change = true;
        knob.over = true;
        if(mouse.down){
            // What goes here?
        }
    } else {
        if(knob.over)change = true;
        knob.over = false;
    }
}
if(change)redraw();

提前非常感谢! :D

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    此函数将为您提供任何给定行上离鼠标最近的点:

    // given a line defined like this
    var line={x0:50,y0:50,x1:150,y1:150};
    
    // calculate the closest point on the line to [x,y]
    function getClosestPointOnLine(line,x,y) {
        //
        lerp=function(a,b,x){ return(a+x*(b-a)); };
        var dx=line.x1-line.x0;
        var dy=line.y1-line.y0;
        var t=((x-line.x0)*dx+(y-line.y0)*dy)/(dx*dx+dy*dy);
        t=Math.min(1,Math.max(0,t));
        var lineX=lerp(line.x0, line.x1, t);
        var lineY=lerp(line.y0, line.y1, t);
        return({x:lineX,y:lineY});
    };
    

    然后只需重新绘制内部多边形以连接到上面找到的点。

    有趣的应用...祝你好运!

    【讨论】:

    • 太棒了,正是我需要的!请问这个功能是如何工作的?我不太确定lerp 应该做什么。
    • 当然!该函数计算直线上离鼠标最近的点。它通过计算从鼠标到该线的切线并确定该切线沿原始线的距离来实现这一点。 “t”是从 0.00 到 1.00(如百分比)的值,表示切点沿原始线的距离。 “Lerp”表示“线性插值”,它用于计算 x 和 y,即从行的开头和结尾的“t”百分比。干杯!
    • 啊,现在更有意义了。我刚刚让program 工作,它运行完美!非常感谢您的帮助。
    猜你喜欢
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多