数学艺术图案画-曼陀罗(31)

数学艺术图案画-曼陀罗(31)

本系列曼陀罗图案创制一直以来都是我的最爱。我总是被色彩绚烂和美轮美奂的图案感动。

在前些时候完成了曼陀罗图案系列的3轮既定目标,( 图 1 )至( 图30 )。

本博文开始提供的是第4 集系列曼陀罗图案: 图31至图40 。

再次把美好的东西贡献给大家,希望大家喜欢。

曼陀罗图案画是一类经典的、具有长久历史的艺术形式。在多个种族文化和宗教传统中占据很特殊地位。且不谈宗教方面,其图案在美学和艺术方面,就有那无与伦比的地位。图案通常以圆形呈现,它那几何图形的集合,图案的对称性、复杂性以及色彩的绚烂和变化多端,常能激起人们对美的憧憬和向往。

本博文提供了最为简单和直观的数学艺术绘图方法

一块画布 Canvas cs.Draw...

一个调色板设置:预设调色板 getcolor ( )

加色彩变化 SetColor (180, r1, g1+k*cn, b1)

一个绘图函数 mandalaXX ( ) { ······ }

几个简单的绘图语句

canvas.DrawOval (X, Y, La, Lb, R) 画椭圆

canvas.DrawCircle (X, Y, R) 画圆形

绘出一组色彩缤纷,美轮美奂的图案。

颜色设置:原预设置六个调色板色调,取色彩亮度及鲜艳,图案绘出时加色彩变化。今有修正,增加一色调:黄色yellow 。

图案的绘制要点是以椭圆的长短轴变化,半径变化,以及中心距的变化,再加上色彩的变化来完成图案的复杂度,图案图形的艺术性。各参数的变化代码中有注释。

本设计的重点:图案是即时逐线逐帧动画展示的。

本人感受到屏幕的美感,数学绘画的艺术感,简直美极了。本博文是曼陀罗图案系列文档,今后会陆续推出其他图样。谨以此方法贡献给喜欢美的朋友。

本程序是用简单的C语言在安卓手机上编写的。界面是手机屏幕方式。

总结一下图形和色彩变化的要点:

一是图形变化:图形输出中心距L变化,加微调距离(L+40)叠加图形,以及椭圆的长短轴尺寸比例的变化,循环套叠画出图形。

二是色彩变化:预设置调色板色调模型,循环绘图时调用k值微调RGB颜色值来变化输出图形色彩。

细心的读者对比一下几篇博文,就能体会此中奥妙。

下面是源码:

//设置全局变量或局部变量

float pi=3.1415926535;

string s,ss,ss1,ss2,ss3; //print text strin

float sx,sy, px,py, dx,dy; //center point

float sx1,sy1,sx2,sy2,sx3,sy3,sx4,sy4; //绘图

float a,a1,a2, L,L1,d,r; //sin (a), d degree, Length

double sn; //mode number

int round; //set round

int r1,g1,b1; //16m 全色调色板 (A, R, G, B)

double Rn; //random number

int i,j,n,t,k, kn; //t = times, n = numbe

int cn; //设置调色板色彩变化系数

预设置调色板:

getcolor (){

//** 此是新修正的调色板

//** 原预设置调色板 (六个色调),新增yellow

// 1 red 2 pink 3 blue 4 purple

// 5 green 6 orange 7 yellow

// cn 色调变化系数: cn = 5 to 20

// cn:小 >> 红色调 =>> 大 >> 蓝绿色调

Rn=random()*7+1; //color

kn=(int)Rn;

if (kn==1){r1=250; g1=-120; b1=0; cn=5; } //red

if (kn==2){r1=250; g1=-50; b1=250; cn=10; } //pink

if (kn==3){r1=0; g1=0; b1=250; cn=15; } //blue

if (kn==4){r1=160; g1=0; b1=250; cn=20; } //purple

if (kn==5){r1=0; g1=200; b1=100; cn=15; }//green

if (kn==6){r1=250;g1=30;b1=100; cn=15; } //orange

if (kn==7){r1=250; g1=250; b1=0; cn=10; } //yellow

//** return >>> color (A,R,G,B ) = r1, g1, b1

}//getcolor ()

图例:

Times = 8 是一次循环展示的图案,Times = ( 1 - 7 ) 是动画展示的中间过程图案。

图案源码如下:

mandala31 (){

//** init round, n, center point px, py

round=2; n=0; //** 设置动画演示次数,圈数

px=360; py=360; //** 图案输出中心点

//** 重绘图案

redraw31:

cs.SetFillMode (1);//0不填色,1填色

cs.SetColor (255,0,0,0);

cs.DrawRect (0,0,720,720); //页面重置

n=n+1; //计数,圈数

//** 图案绘出:有 8 步图形和颜色变化

for (t=1; t<=8; t++){

cs.SetFillMode (1); //0不填色,1填色

cs.SetColor (255,0,0,0);

cs.DrawRect(20,660,700,710); //清屏

//** 设置颜色,取得颜色值

getcolor ();

cs.SetColor (255,r1, g1+200, b1);

//** 屏幕打印状态提示:次数 t,圈数 n

s=intToString (t);

ss3="Times = "+s;

s=intToString (n);

ss1="Round = "+s;

cs.SetTextSize (28);

cs.DrawText ("曼陀罗图案 (31) ",50,40);

cs.DrawText (ss3,90,680);

cs.DrawText (ss1,240,680);

cs.Update ();

//** 图形区域框线

cs.SetFillMode (0);//0不填色,1填色

cs.SetColor (255,250,250,0);

cs.DrawRect(50,50,670,650); //框线

cs.Update ();

//** 图案绘出,pi/8 八角形 i*45度,pi/6 六角形 60度

//** k * n =椭圆比,k*1.5,可 set 0.5 >>> 2.5

//** 图案展示:图案和色彩 8次叠加,5圈展示5个图案

//** 图案采用多层图形多层色彩套叠设计方法

//****** figure 1 ******

//** 重新设置颜色,取得颜色值

getcolor ();

for(i=0;i<8;i++){

a=2*pi/8*i ; L=120;

sx1=(float)(L*sin(a))+px;

sy1=(float)(-L*cos(a))+py;

for (k=10;k<40;k++){

// ** 依取得颜色 >>> 颜色变化 a=180 半透明

cs.SetColor (180,r1, g1+k*cn, b1);

cs.DrawCircle (sx1,sy1, k/2);

} }

//****** figure 2 ******

//** 重新设置颜色,取得颜色值

getcolor ();

for(i=0;i<8;i++){

a=2*pi/8*i+pi/8 ; L=130;

sx1=(float)(L*sin(a))+px;

sy1=(float)(-L*cos(a))+py;

for (k=10;k<40;k++){

// ** 依取得颜色 >>> 颜色变化 a=150 半透明

cs.SetColor (180,r1, g1+k*cn, b1);

cs.DrawOval (sx1,sy1, 30, k*0.8, i*45+22.5);

cs.DrawCircle (sx1,sy1, k/5);

} }

//****** figure 3 ****** 图形叠加设计

//** 设置颜色,取得颜色值

getcolor ();

for(i=0;i<4;i++){

a=2*pi/4*i ; L=140;

sx1=(float)(L*cos(a))+px;

sy1=(float)(-L*sin(a))+py;

a=2*pi/4*i+pi/4 ; L=120;

sx2=(float)(L*cos(a))+px;

sy2=(float)(-L*sin(a))+py;

for (k=10;k<40;k++){

//** 依取得颜色 >>> 颜色变化 a=180 半透明

cs.SetColor (180,r1, g1+k*cn, b1);

cs.DrawOval (sx1,sy1,40,k*0.8,i*90);

cs.DrawCircle (sx1,sy1, k/3);

cs.DrawOval (sx2,sy2,30,k*1.5,i*90+45);

} }

//****** figure 4 ****** 图形叠加设计

getcolor ();

for(i=0;i<8; i++){

a=2*pi/8*i ; L=80;

sx1=(float)(L*sin(a))+px;

sy1=(float)(L*cos(a))+py;

for (k=10;k<40; k++){

//** 依取得颜色 >>> 颜色变化 a=180 半透明

cs.SetColor (180,r1, g1+k*cn, b1);

cs.DrawOval (sx1,sy1,40,k*2.2 , i*45);

} }

//****** center figure ******

getcolor ();

for(i=0;i<8; i++){

a=2*pi/8*i ; L=60;

sx1=(float)(L*sin(a))+px;

sy1=(float)(-L*cos(a))+py;

a=2*pi/8*i+pi/8 ; L=90;

sx2=(float)(L*sin(a))+px;

sy2=(float)(-L*cos(a))+py;

for (k=5;k<40; k++){

//** 依取得颜色 >>> 颜色变化 a=180 半透明

cs.SetColor (180,r1, g1+k*cn, b1);

cs.DrawOval (sx1,sy1,10,k*1.5 , i*45);

cs.DrawOval (sx2,sy2,10,k*0.5 , i*45+22.5);

} }

cs.Update (); //即时动画演示

} //next t

sleep (1000); //next round delay

if (n<round) goto redraw31; //下一圈

}//test31

//** End ****