以不正确的角度绘制的线条和形状
Lines and shapes drawn at incorrect angles
我有一个 c# 程序,我需要在 canvas 上绘制一些简单的 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,等等。
因此,要获得笔直向下绘制的形状 canvas,我必须指定 90 度,而我希望指定 180 度。
我是不是做错了什么?还是只是不了解?
其实0应该在右边。您将 x 坐标乘以 -1,因此您将它向左移动。
请记住这 2 条规则:
- 角度的余弦为单位圆的x坐标。
- 角度的正弦为单位圆的y坐标。
由于cos(0) = 1
和sin(0) = 0
,所以角度0对应的坐标是(1, 0)。
90 是在顶部还是底部取决于 canvas。
一些 applications/frameworks 认为 y 坐标 0 位于 canvas 的顶部。也就是说你绕着圆圈顺时针转,90会在最下面。
如果 y 坐标 0 在 canvas 的底部,则逆时针旋转,90 将在顶部。
您应该将 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);
}
我有一个 c# 程序,我需要在 canvas 上绘制一些简单的 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,等等。
因此,要获得笔直向下绘制的形状 canvas,我必须指定 90 度,而我希望指定 180 度。
我是不是做错了什么?还是只是不了解?
其实0应该在右边。您将 x 坐标乘以 -1,因此您将它向左移动。
请记住这 2 条规则:
- 角度的余弦为单位圆的x坐标。
- 角度的正弦为单位圆的y坐标。
由于cos(0) = 1
和sin(0) = 0
,所以角度0对应的坐标是(1, 0)。
90 是在顶部还是底部取决于 canvas。
一些 applications/frameworks 认为 y 坐标 0 位于 canvas 的顶部。也就是说你绕着圆圈顺时针转,90会在最下面。
如果 y 坐标 0 在 canvas 的底部,则逆时针旋转,90 将在顶部。
您应该将 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);
}