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
        }