1

我有 ac# 程序,我需要在画布上绘制一些简单的 2D 对象。

其中之一涉及在我知道起点、长度和我必须计算结束位置的地方绘制一个矩形和线条。所以我有以下代码;

 private void CalculateEndPoint()
 {
            double angle = Helper.deg2rad((double)this.StartAngle);
            int x = this.StartPoint.X + (int)(Math.Cos(angle) * this.Length * -1);

            int y = this.StartPoint.Y + (int)(Math.Sin(angle) * this.Length);
            this.EndPoint = new Point(x, y);
 }

现在这似乎可以正常计算终点。我遇到的问题是角度(this.StartAngle),我指定的值似乎不是它的绘制方式,我似乎有以下内容;

圆度数

我期望顶部为 0,右侧为 90,底部为 180,等等。

因此,要获得一个可以直接在画布上绘制的形状,我必须指定 90 度,而我希望指定 180 度。

我做错了什么吗?还是只是缺乏理解?

4

2 回答 2

1

实际上,0 应该在右边。您将 x 坐标乘以 -1,因此将其向左移动。
请记住以下两条规则:
- 角度的余弦是单位圆的 x 坐标。
- 角度的正弦是单位圆的 y 坐标。
由于cos(0) = 1sin(0) = 0,角度 0 对应的坐标为 (1, 0)。

90 是在上面还是在下面取决于画布。
一些应用程序/框架认为 y 坐标 0 位于画布的顶部。这意味着你绕着圆圈顺时针走,90 将在底部。
如果 y 坐标 0 在画布的底部,则逆时针方向移动,90 将在顶部。

于 2016-03-02T09:24:13.477 回答
1

您应该更改您的CalculateEndPoint功能以使其具有:

private static void CalculateEndPoint(double dec)
{
    double angle = (Math.PI / 180) * (this.StartAngle + 90); // add PI / 2
    int x = StartPoint.X + (int)(Math.Cos(angle) * Length * -1);

    double angle2 = (Math.PI / 180) * (this.StartAngle - 90); // minus PI / 2
    int y = StartPoint.Y + (int)(Math.Sin(angle2) * Length);
    EndPoint = new Point(x, y);
}
于 2016-03-02T09:33:52.937 回答