如何强制光标仅在折线上移动?

时间:2016-10-14 14:16:48

标签: c# wpf canvas

我正在处理应用程序,我在画布布局上有一条折线画,从上到下没有常规订单 鼠标移动到画布上,光标显示出来,我想强制他仅根据折线上鼠标位置的Y坐标移动。

到目前为止,我通过找到每厘米在画布上占用多少像素(折线是它们之间具有独立空格的范围的集合)来成功实现它,但它还不够好。

有人可以用另一种方式思考吗?

1 个答案:

答案 0 :(得分:0)

看一下polyline.PointToScreen和PointFromScreen,这样你就可以得到相对于折线(0,0)的Point p = mouse coords。

然后,您将必须计算折线的每个段上的p投影。

提示:计算P'= P在段S上的投影(P1,P2)

  1. 由P1,P2
  2. 定义的计算线L1
  3. 计算线L2,其是通过P
  4. 的L1的垂直线
  5. 计算L1和L2的交叉点P'
  6. 如果P'在P1和P2之间:停止
  7. 否则,如果不是:如果dist(P1P')< dist(P2P'):设置P'= P1并停止
  8. else:设置P'= P2并停止
  9. 并且在经过所有折线段S时,始终保持P',其中dist(PP')最小。

    最后:将鼠标位置设为P'。

    这样您就可以将鼠标完全放在折线上。

    • 可选:如果您只希望鼠标Y跟随折线,则只将鼠标Y设置为P'.y

    如果仍然卡住,您可以显示您的代码,这样我就可以更精确地向您展示。

    仅从水平线搜索的精确答案:

    1. 获取鼠标xCoord
    2. 折线的foreach段
    3. 如果鼠标xCoord位于段末端之间,则计算xCoord
    4. 处的段与垂直线之间的交点

      你可以为yCoord做同样的事情: 如果折线段仅在X轴上相互跟踪,则搜索段与垂直线之间的交点(鼠标xCoord) 如果折线段在Y轴上相互跟踪,则搜索段与水平线(鼠标yCoord)之间的交点

      Il折线不遵循任何规则,使用第一个答案是最佳选择。