Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 三角问题-使用角度创建点F_C#_.net_Trigonometry - Fatal编程技术网

C# 三角问题-使用角度创建点F

C# 三角问题-使用角度创建点F,c#,.net,trigonometry,C#,.net,Trigonometry,这件事我已经摸了好一阵子了。我想我年轻的时候应该在三角数学课上多加注意,但现在我们开始: 我有一个角度和一个点。然后我想在角度方向上放置第二个点,距离第一个点200个单位。我用Atan2得到角度,然后用cos和sin得到第三个点。但是我认为在计算p3.Y的罪恶时出错了 编辑:为了澄清,我删除了p2并直接使用了角度: PointF p1 = new PointF(20, 20); double angle = 1.3034851559678624f;

这件事我已经摸了好一阵子了。我想我年轻的时候应该在三角数学课上多加注意,但现在我们开始:

我有一个角度和一个点。然后我想在角度方向上放置第二个点,距离第一个点200个单位。我用Atan2得到角度,然后用cos和sin得到第三个点。但是我认为在计算p3.Y的罪恶时出错了

编辑:为了澄清,我删除了p2并直接使用了角度:

        PointF p1 = new PointF(20, 20);
        double angle = 1.3034851559678624f;

        //Create a new PointF in the same direction, 200 pixels away from p1
        //{ X = 199,9482, Y = 4,549629 }
        PointF p3 = new PointF
        {
            X = (float)(Math.Cos(Math.PI * angle / 180.0) * 200),
            Y = (float)(Math.Sin(Math.PI * angle / 180.0) * 200)
        };

        //This is where I would expect 1.3034851559678624 as the first angle 
        //but I get -4.9073849244837184
        double angle2 = Math.Atan2(p3.Y - p1.Y, p3.X - p1.X) * 180 / Math.PI;
下面是上述值的直观表示。绿线是第一个角度


您不必使用atan来获取角度,然后计算sin/cos。 你可以直接从点的坐标中得到sin和cos

cos = (p2.x - p1.x)/length
sin = (p2.y - p1.y)/length

如果p3应该在p1-p2线上,你根本不需要使用任何三角函数。您可以直接从p1和p2的坐标中找到p3的坐标。假设p1和p2之间的距离为1000个单位。那么从p1开始的P3200单元的位置是:

{p1.x+(p2.x-p1.x)*(200/1000),p1.y+(p2.y-p1.y)*(200/1000)}
如果两点之间的距离不是1000(当然不是1000),则将该值替换为两点之间的距离

如果仍然需要直线的坡度,请计算比率

(p2.y-p1.y)/(p2.x-p1.x)

它以单个数字的形式给出坡度,其中1表示以
+45度
角度通过原点的线。稍微摆弄一下会把坡度变成角度,当直线垂直时要小心,即比率分母为0时。

当前代码的问题是,您没有计算相对于
p1
p3
。您需要将
p1.X
p1.Y
添加到
p3
的坐标中:

PointF p3 = new PointF
{
    X = p1.X + (float)(Math.Cos(Math.PI * angle / 180.0) * 200),
    Y = p1.Y + (float)(Math.Sin(Math.PI * angle / 180.0) * 200)
};

最后的计算不应该引用某个点的
X
值吗?别相信我的话,但我相信你应该用弧度来表示这些角度。@Damien_the_unsiver-我在哪里使用X点?@NikoDrašković-是的,也许这会简化,但在我的最后代码中,我将得到一个角度,以度为单位,所以我需要了解如何正确地来回转换。p3应该在p1-p2定义的线上吗?我不太擅长阅读代码或思想(!),但您对问题的描述似乎与您的代码不一致。如果p3不应该在那条线上,你说的“中间”是什么意思?谢谢,但在我最后的代码中,我不仅会有角度和第一个点,所以我需要了解如何进行这项工作。我猜atan表示中存在错误。atan不是角度的完整表示。查找atan的值范围。我想你一到家就错过了公寓的四分之一。让我再多读一读。当你说“四分之一平”,你的意思是什么?我将如何修改代码以进行调整?是的,问题是在我的最终代码中,只会给我一个角度和一个点F。然后我需要找出如何在200个单位之外创建第二个点。@BlueVoodo:现在我发现你的问题更令人困惑。你为什么不编辑它来清楚地说明你的需求是什么?类似于:给定一个2D点和一个{角度,距离},计算第二个点的{x,y}坐标,从第一个点移除。我不明白你为什么要把第三点扯进来。你肯定把我弄糊涂了,也许你自己也弄糊涂了。在你编辑完问题后,我会回来再看一看。很抱歉给你带来困惑。为了进一步澄清,我编辑了我的评论。我使用p2只是为了方便地获得一个角度,并能够在我的图像中直观地表示出来。@BlueVoodoo:从根本上编辑你的问题,我认为p2是完全多余的,并且会误导读者。现在你已经找到了你一直想问的问题的答案!