Найти индекс для данной координаты точки из массива точек - PullRequest
0 голосов
/ 03 июня 2018

Для данного массива Point и произвольной координаты x, y найдите index для точек, ближайших к заданной координате.

PointD[] _points
//create a list of x,y coordinates:
for (int i = 0; i < _numberOfArcSegments + 1; i++)
{

    double x1 = _orbitEllipseSemiMaj * Math.Sin(angle) - _focalDistance; //we add the focal distance so the focal point is "center"
    double y1 = _orbitEllipseSemiMinor * Math.Cos(angle);

    //rotates the points to allow for the LongditudeOfPeriapsis. 
    double x2 = (x1 * Math.Cos(_orbitAngleRadians)) - (y1 * Math.Sin(_orbitAngleRadians));
    double y2 = (x1 * Math.Sin(_orbitAngleRadians)) + (y1 * Math.Cos(_orbitAngleRadians));
    angle += _segmentArcSweepRadians;
    _points[i] = new PointD() { x = x2, y = y2 };
}

Я рисую эллипс, который представляет орбиту.Сначала я создаю массив точек выше, затем, когда я рисую его, я пытаюсь найти точку, ближайшую к тому месту, где находится орбитальное тело.

Для этого я пытался вычислить угол от центра эллипса к телу:

public void Update()
{    
    //adjust so moons get the right positions (body position - focal point position) 
    Vector4 pos = _bodyPositionDB.AbsolutePosition - _positionDB.AbsolutePosition;   
    //adjust for focal point
    pos.X += _focalDistance; 

    //rotate to the LonditudeOfPeriapsis. 
    double x2 = (pos.X * Math.Cos(-_orbitAngleRadians)) - (pos.Y * Math.Sin(-_orbitAngleRadians));
    double y2 = (pos.X * Math.Sin(-_orbitAngleRadians)) + (pos.Y * Math.Cos(-_orbitAngleRadians));

    _ellipseStartArcAngleRadians = (float)(Math.Atan2(y2, x2));  //Atan2 returns a value between -180 and 180; 
}

, затем:

double unAdjustedIndex = (_ellipseStartArcAngleRadians / _segmentArcSweepRadians);
while (unAdjustedIndex < 0)
{
    unAdjustedIndex += (2 * Math.PI);
}
int index = (int)unAdjustedIndex;

Эллипсхорошо рисует, (массив точек правильный, и все хорошо, когда-то с поправкой на видоискатель, смещения камеры и масштабирование), но не запускается в правильной точке (я уменьшаю альфа в цвете, чтобы результирующий эллипс затухал по мере его дальнейшегополучает от тела) Я провел дни, пытаясь выяснить, что я делаю здесь неправильно, и пробовал дюжину разных вещей, пытаясь выяснить, где моя математика неправильна, но я этого не вижу.

1 Ответ

0 голосов
/ 03 июня 2018

Я предполагаю, что _points должны быть массивом PointD;Это самый короткий способ получить самую близкую точку к вашему массиву (calcdistance должна быть простой функцией, которая вычисляет евклидово расстояние):

PointD p = _points.OrderBy(p => CalcDistance(p, gievnPoint)).First();
...