public static SystemClass GetSystemNearestTo(Point3D curpos, Point3D wantedpos, double maxfromcurpos, double maxfromwanted, int routemethod) { SystemClass nearestsystem = null; try { using (SQLiteConnectionSystem cn = new SQLiteConnectionSystem()) { string sqlquery = "SELECT EdsmId, x, y, z " + // DO a square test for speed, then double check its within the circle later.. "FROM EdsmSystems " + "WHERE x >= @xc - @maxfromcurpos " + "AND x <= @xc + @maxfromcurpos " + "AND y >= @yc - @maxfromcurpos " + "AND y <= @yc + @maxfromcurpos " + "AND z >= @zc - @maxfromcurpos " + "AND z <= @zc + @maxfromcurpos " + "AND x >= @xw - @maxfromwanted " + "AND x <= @xw + @maxfromwanted " + "AND y >= @yw - @maxfromwanted " + "AND y <= @yw + @maxfromwanted " + "AND z >= @zw - @maxfromwanted " + "AND z <= @zw + @maxfromwanted "; using (DbCommand cmd = cn.CreateCommand(sqlquery)) { cmd.AddParameterWithValue("xw", (long)(wantedpos.X * XYZScalar)); cmd.AddParameterWithValue("yw", (long)(wantedpos.Y * XYZScalar)); cmd.AddParameterWithValue("zw", (long)(wantedpos.Z * XYZScalar)); cmd.AddParameterWithValue("maxfromwanted", (long)(maxfromwanted * XYZScalar)); //squared cmd.AddParameterWithValue("xc", (long)(curpos.X * XYZScalar)); cmd.AddParameterWithValue("yc", (long)(curpos.Y * XYZScalar)); cmd.AddParameterWithValue("zc", (long)(curpos.Z * XYZScalar)); cmd.AddParameterWithValue("maxfromcurpos", (long)(maxfromcurpos * XYZScalar)); //squared double bestmindistance = double.MaxValue; long nearestedsmid = -1; using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { long edsmid = (long)reader[0]; //SystemClass sys = GetSystem(edsmid, null, SystemIDType.EdsmId); Console.WriteLine("FOund {0} at {1} {2} {3}", sys.name, sys.x, sys.y, sys.z); if (System.DBNull.Value != reader["x"]) // paranoid check, it could be null in db { Point3D syspos = new Point3D(((double)(long)reader[1])/XYZScalar, ((double)(long)reader[2])/XYZScalar, ((double)(long)reader[3])/XYZScalar); double distancefromwantedx2 = Point3D.DistanceBetweenX2(wantedpos, syspos); // range between the wanted point and this, ^2 double distancefromcurposx2 = Point3D.DistanceBetweenX2(curpos, syspos); // range between the wanted point and this, ^2 // ENSURE its withing the circles now if (distancefromcurposx2 <= (maxfromcurpos * maxfromcurpos) && distancefromwantedx2 <= (maxfromwanted * maxfromwanted)) { if (routemethod == metric_nearestwaypoint) { if (distancefromwantedx2 < bestmindistance) { nearestedsmid = edsmid; bestmindistance = distancefromwantedx2; } } else { Point3D interceptpoint = curpos.InterceptPoint(wantedpos, syspos); // work out where the perp. intercept point is.. double deviation = Point3D.DistanceBetween(interceptpoint, syspos); double metric = 1E39; if (routemethod == metric_mindevfrompath) metric = deviation; else if (routemethod == metric_maximum100ly) metric = (deviation <= 100) ? distancefromwantedx2 : metric; // no need to sqrt it.. else if (routemethod == metric_maximum250ly) metric = (deviation <= 250) ? distancefromwantedx2 : metric; else if (routemethod == metric_maximum500ly) metric = (deviation <= 500) ? distancefromwantedx2 : metric; else if (routemethod == metric_waypointdev2) metric = Math.Sqrt(distancefromwantedx2) + deviation / 2; if (metric < bestmindistance) { nearestedsmid = edsmid; bestmindistance = metric; } } } } } } if (nearestedsmid != -1) nearestsystem = GetSystem(nearestedsmid, cn, SystemIDType.EdsmId); } } } catch (Exception ex) { System.Diagnostics.Trace.WriteLine("Exception : " + ex.Message); System.Diagnostics.Trace.WriteLine(ex.StackTrace); } return nearestsystem; }
public static SystemClass GetSystemNearestTo(Point3D curpos, Point3D wantedpos, double maxfromcurpos, double maxfromwanted, int routemethod) { SystemClass nearestsystem = null; try { using (SQLiteConnectionSystem cn = new SQLiteConnectionSystem()) { string sqlquery = "SELECT EdsmId, x, y, z " + "FROM EdsmSystems " + "WHERE x >= @xc - @maxfromcurpos " + "AND x <= @xc + @maxfromcurpos " + "AND y >= @yc - @maxfromcurpos " + "AND y <= @yc + @maxfromcurpos " + "AND z >= @zc - @maxfromcurpos " + "AND z <= @zc + @maxfromcurpos " + "AND x >= @xw - @maxfromwanted " + "AND x <= @xw + @maxfromwanted " + "AND y >= @yw - @maxfromwanted " + "AND y <= @yw + @maxfromwanted " + "AND z >= @zw - @maxfromwanted " + "AND z <= @zw + @maxfromwanted "; using (DbCommand cmd = cn.CreateCommand(sqlquery)) { cmd.AddParameterWithValue("@xw", wantedpos.X); cmd.AddParameterWithValue("@yw", wantedpos.Y); cmd.AddParameterWithValue("@zw", wantedpos.Z); cmd.AddParameterWithValue("@maxfromwanted", maxfromwanted * maxfromwanted); //squared cmd.AddParameterWithValue("@xc", curpos.X); cmd.AddParameterWithValue("@yc", curpos.Y); cmd.AddParameterWithValue("@zc", curpos.Z); cmd.AddParameterWithValue("@maxfromcurrent", maxfromcurpos * maxfromcurpos); //squared double bestmindistance = double.MaxValue; using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { string name = (string)reader["name"]; long id = (long)reader["id"]; if (System.DBNull.Value != reader["x"]) // paranoid check, it could be null in db { Point3D syspos = new Point3D((double)reader["x"], (double)reader["y"], (double)reader["z"]); double distancefromwantedx2 = Point3D.DistanceBetweenX2(wantedpos, syspos); // range between the wanted point and this, ^2 double distancefromcurposx2 = Point3D.DistanceBetweenX2(curpos, syspos); // range between the wanted point and this, ^2 if (routemethod == metric_nearestwaypoint) { if (distancefromwantedx2 < bestmindistance) { nearestsystem = GetSystem(id); bestmindistance = distancefromwantedx2; } } else { Point3D interceptpoint = curpos.InterceptPoint(wantedpos, syspos); // work out where the perp. intercept point is.. double deviation = Point3D.DistanceBetween(interceptpoint, syspos); double metric = 1E39; if (routemethod == metric_mindevfrompath) metric = deviation; else if (routemethod == metric_maximum100ly) metric = (deviation <= 100) ? distancefromwantedx2 : metric; // no need to sqrt it.. else if (routemethod == metric_maximum250ly) metric = (deviation <= 250) ? distancefromwantedx2 : metric; else if (routemethod == metric_maximum500ly) metric = (deviation <= 500) ? distancefromwantedx2 : metric; else if (routemethod == metric_waypointdev2) metric = Math.Sqrt(distancefromwantedx2) + deviation / 2; if (metric < bestmindistance) { nearestsystem = GetSystem(id); bestmindistance = metric; //Console.WriteLine("System " + syscheck.name + " way " + deviation.ToString("0.0") + " metric " + metric.ToString("0.0") + " *"); } else { //Console.WriteLine("System " + syscheck.name + " way " + deviation.ToString("0.0") + " metric " + metric.ToString("0.0")); } } } } } } } } catch (Exception ex) { System.Diagnostics.Trace.WriteLine("Exception : " + ex.Message); System.Diagnostics.Trace.WriteLine(ex.StackTrace); } return nearestsystem; }