我不擅长数学或几何,但我想以越来越大的角度绘制一些线段。我想要绘制的东西就像你举起手并将手指分开一样:从公共点开始的线条以及它们之间具有相同差异的角度展开。
我试过这个:
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
对此有什么正确的数学?
答案 0 :(得分:9)
您的问题中有两个不同的问题,我将介绍每个问题。
以下是您的情况的ASCII图片:
B + /| / | / | / | len / | y / | / | / | / __| / θ | | +----------+ A x C
这是一个直角三角形。它有三个方面:
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
弧度。
答案 1 :(得分:0)
首先,您需要cos
和sin
,而不是cos
和tan
。
其次,大多数数学库以弧度执行三角函数,而不是度。所以10
确实是一个非常大的差异!要将度数转换为弧度,请乘以(pi/180)
。
答案 2 :(得分:0)
你获得不均匀视角的原因是每次加10时你实际上是围绕圆圈旋转1.6次。
数学函数期望角度为弧度,而不是度数。
360度= 2 * Math.PI弧度。
而不是10,写“2 * Math.PI / 36.0”
另外,使用sin而不是tan。
答案 3 :(得分:0)
你不应该使用棕褐色,而是使用罪恶。如果我没记错的话,应该是这样的: Math.cos(角度/ 180); -Math.sin(角度/ 180); 对罪的否定很重要。