public star_st findnext(star_st curr, star_st dest, int variation = 20, int min_dist = 0) { fstrun(); div_st div = new div_st(); div_st dir = new div_st(); div.x = dest.coord.x - curr.coord.x; div.y = dest.coord.y - curr.coord.y; div.z = dest.coord.z - curr.coord.z; dir.x = div.x >= 0 ? 1 : -1; dir.y = div.y >= 0 ? 1 : -1; dir.z = div.z >= 0 ? 1 : -1; double dist = curr.distance(dest); double jumps = dist / 1000; if (dist < min_dist) { return(dest); } coord_block_st query = new coord_block_st(); query.x_start = curr.coord.x + (div.x / jumps) + (dir.x * min_dist / 3) - 1000; query.x_end = curr.coord.x + (div.x / jumps) + (dir.x * min_dist / 3) + 1000; query.y_start = curr.coord.y + (div.y / jumps) - 200; query.y_end = curr.coord.y + (div.y / jumps) + 200; query.z_start = curr.coord.z + (div.z / jumps) + (dir.z * min_dist / 3) - 1000; query.z_end = curr.coord.z + (div.z / jumps) + (dir.z * min_dist / 3) + 1000; conn.Open(); string sql = "SELECT name, x, y, z FROM systems where x BETWEEN " + query.x_start.ToString(CultureInfo.InvariantCulture) + " and " + query.x_end.ToString(CultureInfo.InvariantCulture) + " and y BETWEEN " + query.y_start.ToString(CultureInfo.InvariantCulture) + " and " + query.y_end.ToString(CultureInfo.InvariantCulture) + " and z BETWEEN " + query.z_start.ToString(CultureInfo.InvariantCulture) + " and " + query.z_end.ToString(CultureInfo.InvariantCulture) + " and action_todo = 1 and deleted_at is NULL;"; NpgsqlCommand command = new NpgsqlCommand(sql, conn); NpgsqlDataReader read = command.ExecuteReader(); List <check_st> collect = new List <check_st>(); while (read.Read()) { check_st ret = new check_st(); ret.star.name = read["name"].ToString(); ret.star.coord.x = Double.Parse(read["x"].ToString(), CultureInfo.InvariantCulture); ret.star.coord.y = Double.Parse(read["y"].ToString(), CultureInfo.InvariantCulture); ret.star.coord.z = Double.Parse(read["z"].ToString(), CultureInfo.InvariantCulture); ret.dist = ret.star.distance(curr); ret.angle = curr.angle(ret.star, dest); collect.Add(ret); } conn.Close(); check_st temp = new check_st(); temp.star = dest; temp.dist = dist; temp.angle = 0; collect.Add(temp); collect.Sort(); for (int x = 0; x != collect.Count; x++) { if (collect[x].angle < variation)// || (collect[x].dist == 0 && collect[x].star.name != curr.name)) { if (collect[x].dist > min_dist) { //if (checkstar(collect[x].star)) return(collect[x].star); } } } return(dest);//This will never be reached, but just in case }
public star_st findnext(star_st curr, star_st dest, int variation = 20, int min_dist = 0) { fstrun(); double dist = curr.distance(dest); double dev = dist / 3; coord_block_st query = new coord_block_st(); query.x_start = curr.coord.x > dest.coord.x ? dest.coord.x - dev : curr.coord.x - dev; query.x_end = curr.coord.x < dest.coord.x ? dest.coord.x + dev : curr.coord.x + dev; query.y_start = curr.coord.y > dest.coord.y ? dest.coord.y - dev : curr.coord.y - dev; query.y_end = curr.coord.y < dest.coord.y ? dest.coord.y + dev : curr.coord.y + dev; query.z_start = curr.coord.z > dest.coord.z ? dest.coord.z - dev : curr.coord.z - dev; query.z_end = curr.coord.z < dest.coord.z ? dest.coord.z + dev : curr.coord.z + dev; conn.Open(); string sql = "SELECT name, x, y, z FROM systems where x BETWEEN " + query.x_start.ToString(CultureInfo.InvariantCulture) + " and " + query.x_end.ToString(CultureInfo.InvariantCulture) + " and y BETWEEN " + query.y_start.ToString(CultureInfo.InvariantCulture) + " and " + query.y_end.ToString(CultureInfo.InvariantCulture) + " and z BETWEEN " + query.z_start.ToString(CultureInfo.InvariantCulture) + " and " + query.z_end.ToString(CultureInfo.InvariantCulture) + " and action_todo = 1 and deleted_at is NULL;"; //Console.WriteLine(curr.name + "|" + curr.coord.x+"|" + curr.coord.y+ "|" + curr.coord.z); //Console.WriteLine(dest.name + "|" + dest.coord.x + "|" + dest.coord.y + "|" + dest.coord.z); //Console.WriteLine(variation); //Console.WriteLine(min_dist); //Console.WriteLine(sql); NpgsqlTransaction tran = conn.BeginTransaction(); NpgsqlCommand command = new NpgsqlCommand(sql, conn); NpgsqlDataReader read = command.ExecuteReader(); List <check_st> collect = new List <check_st>(); while (read.Read()) { check_st ret = new check_st(); ret.star.name = read["name"].ToString(); ret.star.coord.x = Double.Parse(read["x"].ToString(), CultureInfo.InvariantCulture); ret.star.coord.y = Double.Parse(read["y"].ToString(), CultureInfo.InvariantCulture); ret.star.coord.z = Double.Parse(read["z"].ToString(), CultureInfo.InvariantCulture); ret.dist = ret.star.distance(curr); ret.angle = curr.angle(ret.star, dest); collect.Add(ret); } conn.Close(); check_st temp = new check_st(); temp.star = dest; temp.dist = dist; temp.angle = 0; collect.Add(temp); collect.Sort(); for (int x = 0; x != collect.Count; x++) { if (collect[x].angle < variation)// || (collect[x].dist == 0 && collect[x].star.name != curr.name)) { if (collect[x].dist > min_dist) { //if (checkstar(collect[x].star)) return(collect[x].star); } } } return(dest);//This will never be reached, but just in case }