当前位置:首页 > 工作总结 > [再谈图案设计] 创意图案设计
 

[再谈图案设计] 创意图案设计

发布时间:2019-02-17 04:06:56 影响了:

  为了好玩,今天我们再谈谈图案设计这个话题。   美国人多萝西・K在《设计艺术原理》中,把二维图案归纳成17种(如图1),并提出每一种图案都由基础图形(后面我们把它简称为“基图”,它大多用三角形来示意,这样可使方位感更明确)经过四个基本运动来构成,它们是反射(沿平面上一条线)、平移、旋转(绕平面上的一个点)和滑动反射。
  你能辨认其中的每个运动吗?能分析它们在既定的图案中是如何出现的吗?
  举几个例子来看看:单纯发生平移的就是第1种;第2种既有平移又有反射(反射形成镜像),也就是滑动反射;第3~第5种为基图和它的一个镜像组合后平移而成;第10、第13、第16三种是先旋转,然后由组合图平移形成;第6和第7种则是基图和它的三个镜像为组合图,再行平移。
  四个基本运动的数学和编程处理我们并不陌生,就看我们能不能按照这17种类型随心所欲地设计图案和游戏一把了。
  先测试一下你的眼力。如图2所示,要是以左上角图形作为基图,两个图案分别属于哪种类型呢?应该是第4和第10种,你看对了吗?
  下面,我们就来做几个图案设计。以图3左上角的箭头形为基图,组成的图案显然由基图的平移运动形成,属于第1种类型。实现它们的程序很简单。
  Private Sub Form_Click()
  Scale (0, 0)-(640, 480)
  d = 50:a = 2 * d:b = 3 * d
  For i = 1 To 3
  a1 = 0: z = 5[*1]
  "If i Mod 2 <> 0 Then a1 = 0: z = 5 Else a1 = -d / 2: z = 6[*2]
  For j = 1 To z
  x = a + a1 + (j - 1) * d
  y = b + (i - 1) * 2 * d
  GoSub sub1
  Next j:Next i
  GoTo ww
  sub1:
  Line (x, y)-(x - d, y - d), 0
  Line -(x - d / 2, y - d), 0
  Line -(x - d / 2, y - 2 * d),0
  Line -(x, y - 2 * d), 0
  Line -(x, y), 0
  Return
  ww:End Sub
  把基图的尖端P作为参考点。在二重循环中,依次给出平移运动时P点的各个坐标值x和y,调用子程序sub1画出相应的基图。参数d和a、a1、b的大小可调节,选择运行[*1]或[*2],将绘出上图或下图。
  不同于平移的情况,当出现反射和旋转时,基图的方位会有各种变化,调用子程序只是单一地画原始的基图是不行的,而调用多个子程序描画各种变化的基图又将使编程很繁琐。比较好的办法是:画出基图,然后把它的信息存起来,处理(平移、反射、旋转)之后再逐一画出。
  请看图4,图中间的绿色树枝为基图,在方框范围内逐点检索,找到绿色的点,累计其个数存入变量n,算出它们关于参考点P的相对坐标,存入数组xx和yy之后清屏(屏幕坐标系定义为Scale(0,0)-(640,480),描画和取得基图信息的程序段从略)。设置按钮Command1,单击后即呈现图案。
  Private Sub Command1_Click()
  d = 130:a=50:b=80
  For i = 1 To 5
  If i Mod 2 <> 0 Then a1 = 0: h = 1 Else a1 = d / 2: h = -1[**]
  For j = 1 To 4
  x = a + a1 + (j - 1) * d
  y = b + (i - 1) * d / 2
  For k = 1 To n
  PSet (x + xx(k), y + h * yy(k)), QBColor(2)
  Next k
  Next j:Next i
  End Sub
  以i,j循环中确定的各个x,y为每一基图的参考点,在k循环中画出。若将[**]语句中修改为h都取1就得到上一图,属于类型1。如果奇数行h=1,偶数行h=-1,便得到属类型2的下一图了。所谓滑动反射本应该是这样:画出第一行图案后,以它们下方的一条水平线为镜面,根据对称性画出第二行,然后将其平移。而我们采取了简便的办法,把关于参考点(x,y)的每一相对坐标yy值加负号,就是以过参考点的水平线为轴,把原基图进行了上下反转。
  仍以树枝为基图,单击按钮Command2,形成属于第17种类型的图5。
  Private Sub Command2_Click()
  Pi=3.1416:dd=pi/180
  r = 20:f = 0.5:m = 0
  For ii = 1 To 3
  If ii Mod 2 <> 0 Then a1 = 0: z = 4 Else a1 = -3 * r: z = 5
  For jj = 1 To z
  x0 = 30 + a1 + 3 * r + (jj - 1) * 6.2 * r
  y0 = 30 + 3 * r + (ii - 1) * 5.5 * r
  For i = 15 To 345 Step 30
  m = m + 1: aa = i
  If m Mod 2 <> 0 Then q = 1: cc = QBColor(12) Else q = -1: cc = QBColor(4)
  x = x0 + r * Cos(i * dd)
  y = y0 - r * Sin(i * dd)
  For k = 1 To n:GoSub sub1:Next k
  Next i:Next jj:Next ii
  GoTo ww
  sub1:
  xa = xx(k) * f: ya = yy(k) * f * q
  If xa = 0 Then z = ya: ang = pi / 2: GoTo tt
  ang = Atn(Abs(ya / xa))
  If xa 0 Then ang = pi - ang
   If ya 本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文   完成图6时,先画出箭头基图,将其信息记存。上面的图案和图5类似,它包含原基图及其镜像图(可由相对坐标值xx加负号形成)的旋转,处理时需要注意。考虑下一个图案时,基图参考点的位置最好变一下,从箭的端点上移到直角的顶点处。
  图2的难点其实在于基图的画法,它不是单线图形,要用到介绍过的API函数填充颜色的方法,而且屏幕坐标系的设定也有变化,需要查一查。
  构成好的图案,基图的重要性是不言而喻的。你可以自由设计,也可以从各种美图中去找寻和获取它们。你看,图7用到的基图就是从一张向日葵的照片中截来的。
  在向代码窗口写入程序之前,先打开图像窗口。在控件图标中找到图像框(Image),把它拉入窗口,在其属性栏里选定该框的大小(将高Height定为4400,宽Width定为3300,因一般照片都是4∶3的,框的大小可依需而定,但比例不能错,以免变形)。点击Stretch项,选择True。点击Picture项,再点击Bitmap后的…处,就可在电脑中检索已存储的图像或照片,选中后即装入窗口中的图像框。为运行程序方便,再设置一个按钮(Command1)。
  打开代码窗口,将下列两段程序写入:
  Dim xx(55000), yy(55000), cc(55000)
  Dim d, a,b,n
  Private Sub Form_Click()
  Scale (0, 0)-(640, 480)
  x0 = 107: y0 = 107:d = 100:a=20:b=40
  n = 0
  For i = 7 To 107 Step 0.5
  For j = 7 To 107 Step 0.4
  n = n + 1: xx(n) = i: yy(n) = j: cc(n) = Point(i, j)[*]
  Next j:Next i
  For i = 1 To n
  xx(i) = xx(i) - x0: yy(i) = yy(i) - y0
  Next i:
  End Sub
  Private Sub Command1_Click()
  Line (0, 0)-(640, 480), QBColor(15), BF
  For i = 1 To 2
  For j = 1 To 3
  x = a+ d + (j - 1) * (2 * d)
  y = b + d + (i - 1) * (2 * d)
  For k = 1 To n
  PSet (x + xx(k), y + yy(k)), cc(k)
  PSet (x � xx(k), y + yy(k)), cc(k)
  PSet (x + xx(k), y - yy(k)), cc(k)
  PSet (x - xx(k), y - yy(k)), cc(k)
  Next k
  Next j:Next i
  End Sub
  运行时,屏幕左上角会出现图8,对示意在方框内的图形(即选定的基图,边长d=100,位置选在水平:7至107,竖直:7至107)逐点扫描,把每一像素点的坐标记入xx和yy数组,相应颜色信息记入cc数组。需要注意,我们惯于使用640×480的坐标格式,但所用屏幕像素是1280×1024的,如果用于扫描的循环语句步长为1,将会漏掉许多像素点。因信息量大,本题中n值将累计达到50250,为海量存储(对于简单一些的基图,如前例中的绿色树枝,就不必逐点扫描而改为颜色检索,带[*]的语句可改成If point(i,j)=32768 then n=n+1:xx(n)=i:yy(n)=j)。选定方框右下角处(x0,y0)为参考点,由单重i循环使数组xx和yy的存储内容改变为各像素点关于参考点的相对坐标。
  点击按钮1,刷新为白屏之后图案呈现,它属于第6种类型,每四个基图为一组(原基图位于左上方,其余三个是其镜像),经过平移形成行列对齐的图案。由二重循环得出的(x,y),即每个原基图参考点位置,其正右方、正下方和右下方的图形分别关于原基图过(x,y)点的y轴、x轴及与x轴成45°的直线对称。k循环内的四个Pset语句完成了每个图形的绘制。若有兴趣,还可在x和y的选位上改成行齐列不齐,如第7种类型,是容易做到的事情。
  最后这个图案(如图9)为第12种类型。先回到图1,把第12种与第6种比较之后,发现它的四图组合有两个样式,即它有两个不同的原基图。观察第1行第1和第2列的两个组合图,每组左上方的图形是各自的原基图,如果以三角形直角顶点为参考点,1,2两个原基图上各点关于参考点的相对坐标正好是x,y方向互换的。既然知道了两者的关系,只需要设计原基图1就可以了。
  为了把反射与镜像的前后关系看得更清楚,这次用一个文字图形为原基图1(见图9左上)。设P点为参考点。将字符上各点关于P的相对坐标存入xx和yy数组,然后直接套用画葵花图案的按钮1程序段,内层j循环次数改一下,d、a、b的值也可适当调整,在最内层k循环四个Pset语句前必须加一句:If (i + j) Mod 2 <> 0 Then z = xx(k): xx(k) = yy(k): yy(k) = z,以便在需要的位置采用原基图2,再把每个Pset语句后面的cc(k)改为0即可。图中每方文字后面有背景色,为此需要插入一段程序,你应该会处理。
  只要发挥出你的创造性,多姿多彩的图案一定会被你设计出来!KJ
  
  为了配合《中国科技教育》的改版,我们不得不在2011年十分遗憾地暂时告别“趣味电脑”这个栏目。从2008年3月开始,每两个月,沈溥老师的“数学・编程・游戏”便如期而至,一晃三年寒暑过去,18篇汇集了沈溥老师创新与智慧的文章带给了我们无数灵动的思维。中国的科技教育需要更多的创新与智慧,《中国科技教育》需要更多作者与读者的支持!感谢沈溥老师!感谢万千读者!
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3