
工具/原料
NetLogo 5.0.3
方法/步骤
安装并运行程序,介绍几个主要的控件,[界面]模型的图形界面,[程序]后台控制程序,[添加]添加右侧可选择的控件,[速度]调节图形界面运行的速度,[更新视图]不更新的话运行速度会更加快速(如果你急于要数据结果的话),[设置]设置图形的中心位置,字体大小等,[指令中心]这个区域可以输入命令来查看运行中的数据,类似调试。
快速了解NetLogo到底建模是什么样的,你可以打开它自带的模型库,可以看到会有很多自带模型:简单模型,课程模型,代码示例和分支网络类的。
模拟雨水汇集成河流的例子和模拟狼吃羊的例子。
如何建立我们自己的模型呢?如添加一个按钮,名为“setup"(随便取),会看到setup为红色,那是因为还没有添加代码的原因,在程序里添加
to setup
这里是按钮要做的事情
end
点击帮助中的NetLogo用户手册可以看到NetLogo的介绍和说明。
在NetLogo的安装目录里也可以找到其使用手册,里面的介绍很详细。
下面是我用其做的网络信任模型,切身的体会是NetLogo的语法特点和我们熟悉的C++,Java等有很大的不同,毕竟其是用于建模的,针对性比较强。根据你的目的择优选择。
END
注意事项
认真阅读用户手册会有很大的帮助
在线生成LOGO其实就是在线生成图片,原理听起来很简单:1. new一个bitmap或类似之物
2. 用一个graphic在上边画出你想要的东西
3. 保存,显示出来,大功告成.
今天要说的是生成中的一些细节问题.没有真正做过,你可能永远也不知道有这样的问题.下边提到的问题和代码,希望对各位有所帮助.
本文的示例程序在http://www.ladysolution.cn/logo.aspx
一. 字体位置.
用不同的字体,如果通过计算字体高度来给字体定位是不精确的,不同的字体有不同的em baseline,而且descending 和 ascending 得出来的值几乎很难用来算精确高度,更麻烦的是如果字体是某人造的,那EM更靠不住,最大的问题是文字上方的空白目前我没有找到适合的公式来计算.我用的是比较笨的办法,计算精确的字体高度:
private static int[] GetRealFontHeight(Bitmap bmp)
{
int width, height
int frequency = 2// higher frequency gets lower performance.
int[] ret = new int[2]
Color c
bool goOut = false
for (height = 1height <bmp.Height - 1height += frequency)
{
for (width = 1width <bmp.Width - 1width += frequency)
{
c = bmp.GetPixel(width, height)
if (c.Name.Length>0 &&c.Name != "0")//got it!
{
ret[0] = height
goOut = true
break
}
else
{
goOut = false
}
}
if (goOut)
break
}
goOut = false
for (height = bmp.Height - 1height >1height -= frequency)
{
for (width = bmp.Width - 1width >1width -= frequency)
{
c = bmp.GetPixel(width, height)
if (c.Name.Length >0 &&c.Name != "0")
{
ret[1] = height
goOut = true
break
}
else
{
goOut = false
}
}
if (goOut)
break
}
return ret
}
在画图之前,用这个方法确定精确的字体高度,这样的染色的时候才不至于走样.大家可以通过http://www.ladysolution.cn/logo.aspx 生成图片看一下效果.如果用GDI+自带的计算高度的方法,比如GetHeight()和Height属性,在blend的时候换个字体必定有误差.
二. 画倒影, RotateFlip依然是主力
倒影倒是很简单,把BLEND设好,定位好,画出来就行:
Create mirror#region Create mirror
…….
Graphics gBack_mirror = Graphics.FromImage(backImage_mirror)
pStart = new Point(1, -pre[0])
pEnd = new Point(1, pre[1] - pre[0])
LinearGradientBrush backColor_mirror = new LinearGradientBrush(pStart, pEnd, Color.White, endColor)
……
gBack_mirror.DrawString(logoText, logoFont, backColor_mirror, new PointF(.0f, -pre[0]))
……
gBack.DrawImage(backImage_mirror, new Point(0, pre[1]+3))
#endregion
三. 计算好你的下笔点,通过第一点中的方法,可以拿到某字体在某size时的实际高度有多少,这样我们在画笔或写字之前通过调用此方法就可以得出你的着笔点的坐标:
private static int[] prerendText(int LogoWidth, int LogoHeight, string logoText, Font logoFont)
{
Bitmap bp = new Bitmap(LogoWidth, LogoHeight)
Graphics g = Graphics.FromImage(bp)
g.DrawString(logoText, logoFont, SystemBrushes.Info, new PointF(.0f, .0f))
int[] ret = new int[2]
ret = GetRealFontHeight(bp)
g.Dispose()
bp.Dispose()
return ret
}
此方法返回某字体在某size下的最上方坐标和最下方坐标,有了坐标就好办事了:
int[] pre = prerendText(LogoWidth, LogoHeight, logoText, logoFont)
……
Point pStart = new Point(1, pre[0]-2)
Point pEnd = new Point(1, pre[1]+2)
LinearGradientBrush backColor = new LinearGradientBrush(pStart, pEnd, startColor, endColor)
return filename
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)