以增加的角度绘制线条
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
这些方程式是另一种说法:
角的余弦等于相邻边的长度除以斜边的长度。 角的正弦等于对边的长度除以斜边的长度。求解x
和y
的方程时,您会得到:
x = len * cos(θ)
y = len * sin(θ)
所以你想要sin()
和cos()
,而不是cos()
和tan()
。如果点A
不在原点,则需要通过加法来抵消x
和y
,如下所示:
x = len * cos(θ) + 50
y = len * sin(θ) + 50
使用x
和y
的值,您可以找到三角形上点B
的坐标,从而能够绘制您的线。
另外,假设您使用 Java 进行编程,Math
类中的三角函数期望 radians 中的角度,而不是度数。很多提供三角函数的编程语言都是这样的。
弧度和度数测量相同的东西,但是以度为单位的完整旋转从0
到360°
,而以弧度为单位的完整旋转从0
到2π
。
要将角度以度为单位转换为弧度,请将角度乘以 π/180
。在 Java 中,常量π
由Math.PI
提供。
例如,10° 的角度相当于10 * π/180
或π/18
弧度。
【讨论】:
只是古玩,你将如何用字符制作 45º 角线?我正在尝试上划线、下划线和减号,但它看起来很难看 (¯-_)。【参考方案2】:首先,您需要cos
和sin
,而不是cos
和tan
。
其次,大多数数学库以弧度而不是度数执行三角函数。所以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。
【讨论】:
以上是关于以增加的角度绘制线条的主要内容,如果未能解决你的问题,请参考以下文章