计算对角线的垂直偏移量

Sim*_*mon 11 math geometry 2d point line

我正在写一个音乐显示程序,需要在两个音符之间画一个"诽谤".slur是连接两个音符的曲线 - 只是为了清楚.

在此输入图像描述

我知道便条的位置,并计算其中,该曲线的起点和终点应该是-启动点和终点.

我现在需要在给定所需距离的情况下获得偏移量C,以便在二次曲线内使用.这是我对数学公式的非常有限的了解和理解的地方.

我确实在这里寻找我的答案,但是提出的解决方案要么不起作用,要么我太限于无法正确编码.

有人可以用非数学形式帮助我计算吗?

leg*_*s2k 26

鉴于线段AB,你可以找到中点,说中号,使用著名的中点公式(A + B)/2.现在计算从BA的向量:

p = <px,py> = A - B.

逆时针旋转它绕原点旋转 90°以获得垂直矢量

n = <nx,ny> = < - py,px>

将其标准化:

n = <nx,ny> /‖n‖其中‖n‖=√(n.x²+n.y²)是欧几里德范数或长度

C = L(t)= M + t n

使用此公式 - 线的参数形式 - 您可以沿垂直线(沿n方向)找到任意数量的点.t是获得的点CM的距离.如果t = 0,你中号回来的时候t = 1,你会得到一个点1个单位的距离中号沿ñ等.这也适用于负值t,其中获得的点将位于AB的相对侧,即朝向音符.由于t可以是十进制数,您可以通过更改其值来从中播放,以从M获得所需点的所需距离和方向.

代码,因为你说你对数学术语不感兴趣;)

vec2d calculate_perp_point(vec2d A, vec2d B, float distance)
{
   vec2d M = (A + B) / 2;
   vec2d p = A - B;
   vec2d n = (-p.y, p.x);
   int norm_length = sqrt((n.x * n.x) + (n.y * n.y));
   n.x /= norm_length;
   n.y /= norm_length;
   return (M + (distance * n));
}
Run Code Online (Sandbox Code Playgroud)

这只是伪代码,因为我不确定您正在为项目使用的矢量数学库.

上面的粗体变量是2-d向量; 大写字母表示点,小写字母表示没有位置的向量