Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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
C# 如何连接点和吸收动量?_C#_Algorithm_Graph Algorithm_Uibezierpath_Shortest Path - Fatal编程技术网

C# 如何连接点和吸收动量?

C# 如何连接点和吸收动量?,c#,algorithm,graph-algorithm,uibezierpath,shortest-path,C#,Algorithm,Graph Algorithm,Uibezierpath,Shortest Path,我目前正在与一个显示激光设备,如。设备接收2D点列表,然后显示该列表。内部有一个控制反射镜投射激光点的装置 假设我想显示5个激光点(A、B、C、D、E)。由于激光装置不喜欢在短时间间隔内长距离移动,因此必须添加中间点,称为消隐点(激光沿这些消隐点移动时关闭)。该程序的目的是不给电流计施加太大的应力 我目前正在用一个简单的公式计算5个点之间的“最短路径”,最后是一条直的空白线(下图中的红色虚线) 我已经取得了相当好的结果与此优化。但我想更进一步。电流计在移动时有一定的物理动量。在急转弯时,例如从

我目前正在与一个显示激光设备,如。设备接收2D点列表,然后显示该列表。内部有一个控制反射镜投射激光点的装置

假设我想显示5个激光点(A、B、C、D、E)。由于激光装置不喜欢在短时间间隔内长距离移动,因此必须添加中间点,称为消隐点(激光沿这些消隐点移动时关闭)。该程序的目的是不给电流计施加太大的应力

我目前正在用一个简单的公式计算5个点之间的“最短路径”,最后是一条直的空白线(下图中的红色虚线)

我已经取得了相当好的结果与此优化。但我想更进一步。电流计在移动时有一定的物理动量。在急转弯时,例如从C->D和D->e行驶时,会对激光装置产生应力

所以我想通过引入曲线消隐线而不是直线消隐线来吸收一些物理动量(上图“解决方案”中的最后一幅图)

你知道怎么做到吗


指向一些算法资源和/或一些伪代码或C#会有所帮助。谢谢大家!

正如其他人所提到的,您希望使用某种三次样条插值来实现这一点

一旦知道每个关键点的访问时间和每个点的速度,就可以计算以选定速度通过关键点的分段三次Hermite样条曲线。见:

由于对速度没有任何特殊要求,您可能希望使用经典的三次样条曲线(是的,这些东西的名称不明确):这种样条曲线形式确定速度,以确保一阶导数(速度)和二阶导数(加速度)沿整条路径平滑变化

由于您对到达每个关键点的确切时间也没有任何特殊要求,因此您可能希望设置整个路径的最长时间,然后选择关键点的计时,以最小化最大加速度或类似情况。我没有一个很容易做到的方法。我想尝试的是:

首先,使关键点之间的时间与这些点之间的距离成比例。然后,应用几轮:

  • 调整每个分段花费的时间,使关键点处的切向加速度为0
  • 重新计算样条曲线

  • 不过,如果没有这些优化循环,您可能会非常高兴——最初的猜测不会太糟糕。

    正如其他人所提到的,您希望使用某种三次样条插值来实现这一点

    一旦知道每个关键点的访问时间和每个点的速度,就可以计算以选定速度通过关键点的分段三次Hermite样条曲线。见:

    由于对速度没有任何特殊要求,您可能希望使用经典的三次样条曲线(是的,这些东西的名称不明确):这种样条曲线形式确定速度,以确保一阶导数(速度)和二阶导数(加速度)沿整条路径平滑变化

    由于您对到达每个关键点的确切时间也没有任何特殊要求,因此您可能希望设置整个路径的最长时间,然后选择关键点的计时,以最小化最大加速度或类似情况。我没有一个很容易做到的方法。我想尝试的是:

    首先,使关键点之间的时间与这些点之间的距离成比例。然后,应用几轮:

  • 调整每个分段花费的时间,使关键点处的切向加速度为0
  • 重新计算样条曲线

  • 不过,如果没有这些优化轮次,您可能会非常高兴——最初的猜测不会太糟糕。

    我认为您正在处理的是一个()使激光器上的应力最小的路径是使力和移动激光所需的力的变化最小的路径,因此它是曲率最小的路径,所以我认为最好的方法是在三对点之间,用一个圆的圆弧对路径进行圆角

    可以找到如何计算通过3个点的圆的参数的示例

    我的C语言不太流利,因此我将添加一个Python实现,希望您也会发现它很有用。

    这个想法是,对于每个三元组的点A,B,C,我找到了通过这三个点的圆的弧,这弧将是连接B和C的路径

    我还没有时间测试这个,所以可能有一些错误的迹象

    #初始点
    分数=[(1,1),(2,3),(5,3),(-4.1),(12,3)]
    #通过TSP解决方案查找的顺序中的点列表
    spl=tsp_求解(点)#求解tsp的通用函数
    #附加列表的前两点,以便我可以遍历列表
    #并以相同的方式解析每个点的三元组。
    spl=spl+spl[:2]
    #将在其中添加每个连接点的路径的列表
    路径=[]
    #对于每个连续点的完整部分
    对于zip中的A、B、C(spl[:-2],spl[1:-1],spl[2:]):
    #计算通过A、B和B、C的两条直线的角系数
    coeff_ab=(B[1]-A[1])/(B[0]-A[0])
    coeff_bc=(C[1]-B[1])/(C[0]-B[0])
    #如果两条线具有相同的系数,则所有3点位于同一条线上
    #因此,最好的路径就是那条线。
    如果(系数ab==系数bc):
    偏移量y=A[1]-系数ab*A[0]
    δx=C[0]-B[0]
    append({“type”:“Line”,“coeff”:coeff_ab,”offset_