用鼠标沿矢量拖动点
Dragging point along vector with mouse
过去几天我一直在试验三角函数,想出了一些游戏中常见的整齐的统计五边形之一。 (fiddle!)
我真的很想允许拖动内部多边形的顶点以更改统计值。我的鼠标功能运行良好,但是 用鼠标在直线上拖动点的最佳方法是什么?
我创建了一张图片来可视化我的问题;红色多边形是 "current" 多边形,粉红色线条代表新多边形,粉红色圆圈强调顶点的新点,蓝线是矢量切线,绿色圆圈是光标.
我以前写过一个处理向量的程序,但我不确定如何将它应用到这种情况。
这是一些代码(在循环函数中):
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
此函数将为您提供在任何给定线上离鼠标最近的点:
// 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});
};
然后重新绘制内部多边形以连接到上面找到的点。
有趣的应用程序...祝您好运!
过去几天我一直在试验三角函数,想出了一些游戏中常见的整齐的统计五边形之一。 (fiddle!)
我真的很想允许拖动内部多边形的顶点以更改统计值。我的鼠标功能运行良好,但是 用鼠标在直线上拖动点的最佳方法是什么?
我创建了一张图片来可视化我的问题;红色多边形是 "current" 多边形,粉红色线条代表新多边形,粉红色圆圈强调顶点的新点,蓝线是矢量切线,绿色圆圈是光标.
我以前写过一个处理向量的程序,但我不确定如何将它应用到这种情况。
这是一些代码(在循环函数中):
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
此函数将为您提供在任何给定线上离鼠标最近的点:
// 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});
};
然后重新绘制内部多边形以连接到上面找到的点。
有趣的应用程序...祝您好运!