给定两个点,如何在由这两个点形成的直线上画出一条垂直的直线?

14

理想情况下,我希望提供一个点序列,并在每个点处画一条直角线(从第二个点开始)。

每条线的方向都会交替变化,因此如果我绘制了由6个点组成的曲线,则每个点都将绘制相同长度的线,从第二个点开始,即沿着曲线的每个点都会有5条交替出现在曲线两侧的线,就像一只有交替腿的毛虫。

(我知道这些线不会完全垂直于曲线,而是垂直于曲线上任何两个点之间形成的直线)。


你会使用哪个库来绘制? - Bas
我正在使用Silverlight并且使用InkPresenter,所以我认为这只是一个点函数的问题。 - descf
https://dev59.com/FnM_5IYBdhLWcg3ww2AQ有一个类似于Andreas' (https://dev59.com/eWs05IYBdhLWcg3wD90B#7470098)的解决方案。 - legends2k
1个回答

35
这是关于向量数学的问题。您可以通过将A从B中减去来计算两点A和B之间的导向向量。在2D且仅在2D中,可以通过翻转x和y分量并取一个分量为负来获得垂直于该向量的向量。如果您否定新的x分量,您将向左转,否定y则向右转。然后,您可以通过将每个分量除以向量长度(sqrt(xx + yy))将导向向量缩小为单位大小(=长度为1)。最后,您可以再次拉伸单位向量,使其具有所需的长度,并得到所需大小的向量之一。如果将此向量添加到A或B中,您将获得要绘制直线的点。
这是一些数学帮助:

这些是以向量形式表示的点A和B。

指向向量是通过简单的减法计算得出的。

法向量是通过翻转方向向量得到的,即反转分量并使一个分量为负。nl = 左侧翻转的法向量,nr = 右侧翻转的法向量

法向量的单位向量是通过将每个分量除以向量长度得到的。

计算向量的长度

如果您想从B向左绘制一条线(从A出发),则可以计算要绘制该线的点P,如下:

所以当您在遍历点时,希望每次绘制一次向左,一次向右。

如果您的点位于画布之外,则长度可能太大。您可以通过计算向量BP和边界的交点来计算向P的向量穿过边界的点。


1
我无法完成第一句话。如果我从A中减去B,我很可能会得到一个超出画布范围的点。 - descf
1
我编辑了我的回答,希望现在更易懂了。无论如何,在第一句话之后计算并没有停止,你需要阅读整个回答。正如我所说,你需要将向量大小缩小到单位距离,然后再按照你想要的长度进行缩放。如果长度超出了画布范围,那么你的长度就太长或者画布太小了。 - Andreas
我对自己能够理解这些数学公式感到相当印象深刻,除了以rno =开头的那一行。 - descf
向量的长度,查找单位向量。很抱歉,当我上学时,单位向量用0作为下标表示。 - Andreas
你需要切换到浅色模式。显然,包含公式的图像具有透明背景。如果我有时间,我会尝试添加白色背景。 - Andreas
1
我认为你在这句话中把A和B搞混了:“通过从B中减去A,您可以计算出两个点A和B之间的方向向量” - 你应该通过从A中减去B来得到方向向量(这也是公式中所做的)。来自安德烈亚斯的问候。 - Andreas Fröwis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接