以增加的角度绘制线条

Posted

技术标签:

【中文标题】以增加的角度绘制线条【英文标题】:Drawing lines at increasing angles 【发布时间】:2011-04-05 23:41:09 【问题描述】:

我不太擅长数学或几何,但我想以渐增的角度绘制一些线段。我想画的是当你举起手并张开手指时的样子:从一个共同点开始并以它们之间具有相等差异的角度展开的线条。

我试过这个:

len = 300;
angle = 10;

for (i = 0; i <= 5; ++i) 
    endPointX = 50 + len * Math.cos(angle);
    endPointY = 50 + len * Math.tan(angle);
    draw.Line(50, 50, endPointX, endPointY);
    angle += 10;

但是,这是完全错误的,会产生这样的结果

http://i.stack.imgur.com/taX40.png

但我想要这样的东西(糟糕的 mspaint,抱歉):

http://i.stack.imgur.com/8xfpp.png

什么是正确的数学?

【问题讨论】:

en.wikipedia.org/wiki/Radian 用 sin() 替换 tan() 并将角度增加 0.1 也就是说,你的角度应该是弧度,而不是度数。 360 度 = 2*pi 弧度。因子 2 是历史错误之一。 【参考方案1】:

您的问题有两个不同的问题,我将分别介绍。


这是您的情况的 ASCII 图片:

乙 + /| / | / | / | 长 / |是的 / | / | / | / __| / θ | | +----------+ A×C

这是一个直角三角形。它有三个方面:

图片中与90°角相对的对角边称为斜边,长度为len。斜边就是您要绘制的内容。 垂直边是与角度 θ 相对的边,长度为 y。 水平边是与角度θ相邻的边,长度为x

根据上图,以下等式成立:

cos(θ) = x/len
sin(θ) = y/len

这些方程式是另一种说法:

角的余弦等于相邻边的长度除以斜边的长度。 角的正弦等于对边的长度除以斜边的长度。

求解xy 的方程时,您会得到:

x = len * cos(θ)
y = len * sin(θ)

所以你想要sin()cos(),而不是cos()tan()。如果点A 不在原点,则需要通过加法来抵消xy,如下所示:

x = len * cos(θ) + 50
y = len * sin(θ) + 50

使用xy 的值,您可以找到三角形上点B 的坐标,从而能够绘制您的线。


另外,假设您使用 Java 进行编程,Math 类中的三角函数期望 radians 中的角度,而不是度数。很多提供三角函数的编程语言都是这样的。

弧度和度数测量相同的东西,但是以度为单位的完整旋转从0360°,而以弧度为单位的完整旋转从0

要将角度以度为单位转换为弧度,请将角度乘以 π/180。在 Java 中,常量πMath.PI 提供。

例如,10° 的角度相当于10 * π/180π/18 弧度。

【讨论】:

只是古玩,你将如何用字符制作 45º 角线?我正在尝试上划线、下划线和减号,但它看起来很难看 (¯-_)。【参考方案2】:

首先,您需要cossin,而不是costan

其次,大多数数学库以弧度而不是度数执行三角函数。所以10 确实有很大的不同!要将度数转换为弧度,请乘以 (pi/180)

【讨论】:

【参考方案3】:

您不应该使用 tan,而是使用 sin。如果我没记错的话,应该是这样的: 数学.cos(角度/180); -Math.sin(角度/180); 对罪的否定很重要。

【讨论】:

【参考方案4】:

导致视角不均匀的原因是,每次添加 10 时,实际上就是将线绕圆旋转了 1.6 次。

数学函数期望角度以弧度为单位,而不是度数。

360 度 = 2*Math.PI 弧度。

写成“2*Math.PI/36.0”而不是 10

另外,用 sin 代替 tan。

【讨论】:

以上是关于以增加的角度绘制线条的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript - 旋转基于SVG的线的角度

如何使用 python 的 PIL 以一定角度绘制文本?

仅使用线条和仿射变换来绘制多边形

绘制在位图上以一定角度旋转的线

MATLAB:polarplot❤️在极坐标系下绘制线条

createjs绘制扇形的方法