我有一个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度。
我做错了吗?或者只是缺乏理解?
答案 0 :(得分:1)
实际上,0应该在右边。您将x坐标乘以-1,因此您将其向左移动
记住这两条规则:
- 角度的余弦是单位圆的x坐标
- 角度的正弦值是单位圆的y坐标
自cos(0) = 1
和sin(0) = 0
起,与角度0对应的坐标为(1,0)。
90是在顶部还是在底部取决于画布 一些应用程序/框架认为y坐标0位于画布的顶部。这意味着你顺时针绕圆圈走,90就在底部 如果y坐标0位于画布的底部,则逆时针旋转,90将位于顶部。
答案 1 :(得分: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);
}