我正在研究类似文明的游戏,我正在寻找一种用于生成类似地球的世界地图的好算法.我已经尝试了一些替代方案,但尚未找到真正的赢家.
一种选择是使用Perlin噪声生成高度图,并在一定水平上添加水,以便世界上大约30%的土地是土地.虽然Perlin噪声(或类似的基于分形的技术)经常用于地形并且相当逼真,但它并没有提供太多控制结果的数量,大小和位置,我想从游戏角度来看.

第二种选择是从随机定位的单瓦种子开始(我正在处理瓷砖网格),确定大陆的所需大小,每个回合添加一个水平或垂直邻近现有大陆的图块,直到你达到了所需的大小.重复其他大陆.这种技术是文明4中使用的算法的一部分.问题在于,在放置前几个大陆之后,可以选择被其他大陆包围的起始位置,因此不适合新的大陆.此外,它有一种太靠近的地方产生大陆的趋势,导致看起来更像河流而不是大陆.

有没有人碰巧知道一个好的算法,用于在基于网格的地图上生成逼真的大陆,同时保持对其数量和相对大小的控制?
我正在为类似MineCraft的世界开发地形生成算法.目前,我正在使用基于"Simplex Noise Demystified"[PDF]文章中的实现的单纯形噪声,因为单纯形噪声应该比Perlin噪声更快并且具有更少的伪像.这看起来相当不错(见图),但到目前为止它也很慢.

运行噪声功能10次(我需要不同波长的噪声,如地形高度,温度,树位置等),每个块中的块(16x16x128块)有3个八度的噪声,或大约100万次调用噪声功能总共需要700-800毫秒.尽管算法中没有明显昂贵的操作(至少对我而言),但这对于以任何体面的速度生成地形的目的而言至少是一个数量级太慢.只是楼层,模数,一些数组查找和基本算术.下面列出了算法(用Haskell编写).SCC评论用于分析.我省略了2D噪声函数,因为它们的工作方式相同.
g3 :: (Floating a, RealFrac a) => a
g3 = 1/6
{-# INLINE int #-}
int :: (Integral a, Num b) => a -> b
int = fromIntegral
grad3 :: (Floating a, RealFrac a) => V.Vector (a,a,a)
grad3 = V.fromList $ [(1,1,0),(-1, 1,0),(1,-1, 0),(-1,-1, 0),
(1,0,1),(-1, 0,1),(1, 0,-1),(-1, 0,-1),
(0,1,1),( 0,-1,1),(0, 1,-1),( 0,-1,-1)]
{-# INLINE dot3 #-}
dot3 :: Num a => (a, a, a) -> a -> a -> a -> …Run Code Online (Sandbox Code Playgroud) floating-point polymorphism performance haskell procedural-generation
在我的窗口中,我有一系列六个按钮,它们指示我的 ViewModel 属性之一的六种可能状态。需要突出显示处于活动状态的那个。为此,我为按钮创建了以下 ControlTemplate:
<ControlTemplate x:Key="SnijRichtingTemplate" TargetType="Button">
<Border Name="toggleButton" BorderThickness="1" BorderBrush="{StaticResource KleurRadioCheckOuter}" Background="Transparent" Width="20" Height="20" Cursor="Hand">
<TextBlock Name="text" Foreground="{StaticResource KleurRadioCheckOuter}"
Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}"
ToolTip="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag.ToolTip}"
HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource EqualityToBooleanConverter}">
<Binding Path="SnijRichting" />
<Binding Path="Tag" RelativeSource="{RelativeSource TemplatedParent}" />
</MultiBinding>
</DataTrigger.Binding>
<Setter TargetName="toggleButton" Property="BorderBrush" Value="{StaticResource KleurTekstDonker}" />
<Setter TargetName="text" Property="Foreground" Value="{StaticResource KleurTekstDonker}" />
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="toggleButton" Property="BorderBrush" Value="{StaticResource Kleur2}" />
<Setter TargetName="text" Property="Foreground" Value="{StaticResource Kleur2}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate> …Run Code Online (Sandbox Code Playgroud) algorithm ×1
binding ×1
haskell ×1
map ×1
parent ×1
performance ×1
polymorphism ×1
terrain ×1
wpf ×1
xaml ×1