我目前可以获得一些信息:
我想要做的是选择X(我认为少于6个)角度范围内的点数与位置相同的位置,距离为距离,以便它们始终在屏幕上。
我可以做到这一点,但是我的实现没有考虑到某些点最终出现在屏幕上的事实,而且我的所有尝试都非常糟糕且过于复杂。
有没有人有这样做的好方法?
编辑:添加图片以显示我之后的内容......
答案 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};
}
感谢您的帮助