【问题标题】:Lines and shapes drawn at incorrect angles以不正确的角度绘制的线条和形状
【发布时间】:2016-06-15 00:42:32
【问题描述】:

我有一个 c# 程序,我需要在画布上绘制一些简单的 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 度。

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

【问题讨论】:

    标签: c# geometry drawing2d


    【解决方案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);
    }
    

    【讨论】:

    • 好代码,谢谢。但不需要变量“dec”!
    • 是的,我是用来测试的。
    【解决方案2】:

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

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

    【讨论】:

    • 很好的解释,谢谢。我认为 -1 的倍数正在从自下而上的画布转换为自上而下的画布(在 C# 中使用)。
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多