Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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# 在一个圆上选择X个点,这些点在C中的屏幕上#_C#_Algorithm_Math - Fatal编程技术网

C# 在一个圆上选择X个点,这些点在C中的屏幕上#

C# 在一个圆上选择X个点,这些点在C中的屏幕上#,c#,algorithm,math,C#,Algorithm,Math,目前,我有几组可用信息: 屏幕上的位置(点) 点的方向(双倍,比如15度) 距离(距离点的长度) 我想做的是在一个角度排列中选择X(我想少于6个)个点,这些点面向与位置相同的方向,距离为距离,以便它们始终在屏幕上 我可以做到这一点,但我的实现没有考虑到这样一个事实,即一些点最终离开了屏幕,我所有的尝试都非常糟糕和过于复杂 有人有好的方法吗 编辑:添加图形以显示即时消息之后的内容… 沿轨迹/方向“投影”一个点(X1,Y1)到X2,Y2距离的简单方法,您可以使用以下方法: X2 = X1 +

目前,我有几组可用信息:

  • 屏幕上的位置(点)
  • 点的方向(双倍,比如15度)
  • 距离(距离点的长度)
我想做的是在一个角度排列中选择X(我想少于6个)个点,这些点面向与位置相同的方向,距离为距离,以便它们始终在屏幕上

我可以做到这一点,但我的实现没有考虑到这样一个事实,即一些点最终离开了屏幕,我所有的尝试都非常糟糕和过于复杂

有人有好的方法吗

编辑:添加图形以显示即时消息之后的内容…

沿轨迹/方向“投影”一个点(X1,Y1)到X2,Y2距离的简单方法,您可以使用以下方法:

 X2 = X1 + (int)(Math.Sin(orientation) * distance);
 Y2 = Y1 + (int)(Math.Cos(orientation) * distance);
其中方向为弧度双倍值。您可能希望对结果进行四舍五入,因为(int)是转换为int的一种残酷方式

如果要拾取距离点pX,pY至少为d的点X/Y,则知道斜边(平方根((X-pX)^2+(Y-pY)^2)小于d^2

X/Y是否比pX/pY的d小

bool isTooClose = ( ((X - pY)*(X - pY)) + ((Y - pY)*(Y - pY)) < (d*d));
boolistoclose=((X-pY)*(X-pY))+((Y-pY)*(Y-pY))<(d*d));
如果你知道屏幕的大小,那么只需检查边界即可

bool isOnScreen = ( (pY > 0) && (pX > 0) && (pX < Screen.Width) && (pY < Screen.Height));
bool isOnScreen=((pY>0)和&(pX>0)和&(pX
如果你想知道一个圆完全在屏幕上,可以使用上面的等屏幕,并将圆的半径减/加到边界上

bool isCircleOnScreen = ( (pY > r) && (pX > r) && (pX < (Screen.Width - r)) && (pY < (Screen.Height - r)));
bool isCircleOnScreen=((pY>r)和&(pX>r)和&(pX

要在圆上拾取点(X2,Y2),可以使用顶部的公式。

这是我的实现:

private static int[] DetermineTagPointsRange(Point location, double orientation, float distance)
        {
            const int screenWidth = 1024;
            const int screenHieght = 768;
            const int sampleCount = 10;
            const int totalAngleSpread = 360;
            const int angleInc = totalAngleSpread / sampleCount;

            var lowestAngle = -1;
            var highestAngle = -1;

            for (var i = 0; i < sampleCount; i++)
            {
                var thisAngle = angleInc*i;
                var endPointX = location.X + (int)(Math.Sin(ToRad(thisAngle)) * distance);
                var endPointY = location.Y - (int)(Math.Cos(ToRad(thisAngle)) * distance);
                bool isOnScreen = ((endPointY > 0) && (endPointX > 0) && (endPointX < screenWidth) && (endPointY < screenHieght));

                if (isOnScreen)
                {
                    if (thisAngle <= lowestAngle || lowestAngle == -1)
                        lowestAngle = thisAngle;

                    if (thisAngle >= highestAngle || highestAngle == -1)
                        highestAngle = thisAngle;
                }
            }

            return new int[] {lowestAngle, highestAngle};
        }
private static int[]determinateTagpointsRange(点位置、双方向、浮动距离)
{
常数int屏幕宽度=1024;
常数int屏幕高度=768;
const int sampleCount=10;
const int totalAngleSpread=360;
const int angleInc=总角度扩展/采样计数;
var Lowstangle=-1;
var highestAngle=-1;
对于(变量i=0;i0)和&(endPointX>0)和&(endPointX

谢谢你的帮助

你能提供更多的信息吗?你想选择一个点,并且知道它在屏幕边缘的“距离”之内吗?不,对不起,我想选择点,这样它们就不会出现在屏幕之外,并保持点的分布均匀…一个图形将有助于理解你真正想要做的事情谢谢你,但我喜欢说,我可以这样做,但我找不到一个好的方法来生成这些点的序列,这样它们就不会离开屏幕。如果点在左上角,我希望这些点的总角度为90度……我希望这是有意义的:)谢谢你的帮助!这里我真正想要的是一张6个点的列表,这些点分布在一个圆的边缘,你已经提供了工具,我也成功地使用了这些工具,但是我不知道如何获得这些点。例如,如果该点位于屏幕中央,所需的点将以180度的角度分布在距离D处,但如果该点位于右上角,则这些点将以接近90度的角度分布。多亏了您的帮助,我使其工作正常,因此我会给您正确的答案。