Java 星图行星路径算法

Java 星图行星路径算法,java,Java,我最近一直在尝试用Java创建一个开放空间civ风格的游戏。我希望星图每次都是随机的。玩家只能沿着特定的路径前往不同的星球 我已经能够随机生成一组适合我需要的星星。然而,我一直无法让明星们以一种用户友好和简单的方式相互连接。我的目标是看起来像这样: 我们只能做到这一点: 我目前的算法是每颗星取一个,允许它有1到3个邻居。它选择离它最近的星星作为邻居。这个算法相当简单,但会导致一些明星没有连接到主星群,因此不允许玩家接近他们 我正在寻找一种算法,可以采取一组点(星),并生成一系列的线,这将使一个

我最近一直在尝试用Java创建一个开放空间civ风格的游戏。我希望星图每次都是随机的。玩家只能沿着特定的路径前往不同的星球

我已经能够随机生成一组适合我需要的星星。然而,我一直无法让明星们以一种用户友好和简单的方式相互连接。我的目标是看起来像这样: 我们只能做到这一点:

我目前的算法是每颗星取一个,允许它有1到3个邻居。它选择离它最近的星星作为邻居。这个算法相当简单,但会导致一些明星没有连接到主星群,因此不允许玩家接近他们

我正在寻找一种算法,可以采取一组点(星),并生成一系列的线,这将使一个恒星系统类似于我的第一个图像链接。任何帮助或提示都将不胜感激

    ArrayList<Star> s = new ArrayList<Star>();
    s.addAll(stars); // Add this chunk's stars

    for (StarChunk c : chunks) // Get the 8 neighboring chunks
    {
        if (c == null)
            continue;

        s.addAll(c.getStars());
    }

    Iterator<Star> i = stars.iterator();
    while (i.hasNext())
    {
        boolean removed = false;
        Star star = i.next();
        for (Star star2 : s)
        {
            if (star != star2 && distance(star, star2) < 30) // Remove stars that are too close
            {
                if (!removed)
                {
                    i.remove();
                    removed = true;
                }
            }
        }
    }

    for (Star star : stars)
    {
        for (Star star2 : star.getPaths())
        {
            for (Star star3 : s)
            {
                if (star3 == star)
                    continue;
                for (Star star4 : star.getPaths())
                {
                    if (Line2D.linesIntersect(star.getX(), star.getY(), star2.getX(), star2.getY(), star3.getX(), star3.getY(), star4.getX(), star4.getY())) // Remove intersecting paths - doesn't fully work
                    {
                        star4.getPaths().remove(star3);
                        star3.getPaths().remove(star4);
                        System.out.println("Removed");
                    }
                }
            }
        }
    }

    for (final Star star : stars)
    {
        Collections.sort(s, new Comparator<Star>()
        {
            @Override
            public int compare(Star s1, Star s2)
            {
                return distance(s1, star) < distance(s2, star) ? -1 : distance(s1, star) == distance(s2, star) ? 0 : 1;
            }
        });
        for (Star star2 : s)
        {
            if (star2 != star)
            {
                if (star.getPaths().size() < star.capacity && star2.getPaths().size() < star2.capacity)
                {
                    star.addNearby(star2); // Add a path between star and star2
                    star2.addNearby(star);
                }
            }
        }
    }
arraylists=newarraylist();
s、 添加所有(星星);//添加此区块的星星
for(StarChunk c:chunks)//获取8个相邻的块
{
如果(c==null)
继续;
s、 addAll(c.getStars());
}
迭代器i=stars.Iterator();
while(i.hasNext())
{
布尔值=假;
星=i.下一个();
(星空2:s)
{
如果(star!=star2&&distance(star,star2)<30)//删除太近的星星
{
如果(!已删除)
{
i、 删除();
删除=真;
}
}
}
}
对于(星星:星星)
{
for(Star-star2:Star.getpath())
{
(星空3:s)
{
如果(星3==星)
继续;
for(star4:Star.getpath())
{
如果(Line2D.linesIntersect(star.getX()、star.getY()、star2.getX()、star2.getY()、star3.getX()、star3.getY()、star4.getX()、star4.getY())//删除相交路径-无法完全工作
{
star4.getpath().remove(star3);
star3.getpath().remove(star4);
系统输出打印项次(“删除”);
}
}
}
}
}
for(最后一颗星:星星)
{
Collections.sort(s,新的Comparator()
{
@凌驾
公共整数比较(星号s1、星号s2)
{
返回距离(s1,星)<距离(s2,星)?-1:距离(s1,星)=距离(s2,星)?0:1;
}
});
(星空2:s)
{
if(star2!=star)
{
if(star.getpath().size()
为了帮助您改进算法,您必须提供您的代码。提示:从一个完整的全星图开始,找到最小生成树。