在C#屏幕上的圆圈上选取X点

时间:2009-11-25 10:00:10

标签: c# algorithm math

我目前可以获得一些信息:

    屏幕上的
  • 位置(点)
  • 点的
  • 方向(双倍,比如15度)
  • 距离(距离点的长度)

我想要做的是选择X(我认为少于6个)角度范围内的点数与位置相同的位置,距离为距离,以便它们始终在屏幕上。

我可以做到这一点,但是我的实现没有考虑到某些点最终出现在屏幕上的事实,而且我的所有尝试都非常糟糕且过于复杂。

有没有人有这样做的好方法?

编辑:添加图片以显示我之后的内容......

alt text

2 个答案:

答案 0 :(得分:1)

一个简单的方法是沿着轨迹/方向“投射”一个点(X1,Y1)到X2,Y2的距离你可以使用以下内容;

 X2 = X1 + (int)(Math.Sin(orientation) * distance);
 Y2 = Y1 + (int)(Math.Cos(orientation) * distance);

其中orientation是弧度double值。您可能希望舍入结果,因为(int)是转换为int的残酷方式。

如果你想从点pX,pY选择一个至少距离为d的点X / Y,那么你知道斜边(SquareRoot((X-pX)^ 2 +(Y-pY)^ 2)较少比d ^ 2。

X / Y是否小于pX / p的d?

bool isTooClose = ( ((X - pY)*(X - pY)) + ((Y - pY)*(Y - pY)) < (d*d));

如果你知道屏幕尺寸,那么只需检查边界。

bool isOnScreen = ( (pY > 0) && (pX > 0) && (pX < Screen.Width) && (pY < Screen.Height));

如果您想知道圆圈完全在屏幕上,请使用上面的isOnScreen并将圆的半径减去/添加到边界。例如

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

要在圆圈上选择一个点(X2,Y2),您可以使用顶部的公式。

答案 1 :(得分:1)

最终成为我的实施:

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};
        }

感谢您的帮助