news 2026/7/16 1:56:15

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数学艺术图案画-曼陀罗(52)

数学艺术图案画-曼陀罗(52)
本系列曼陀罗图案创制一直以来都是我的最爱。我总是被色彩绚烂和美轮美奂的图案感动。
在前些时候完成了曼陀罗图案系列 5 轮既定目标,( 图1)至( 图 50)。
本博文开始提供的是第 6 集系列曼陀罗图案: 图51至图60。
再次把美好的东西贡献给大家,希望大家喜欢。

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

本博文提供了最为简单和直观的数学艺术绘图方法
一块画布 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 ) 是动画展示的中间过程图案。

图案源码如下:
//** 图案绘出,pi/8 八角形 i*45度,pi/6 六角形 60度
//** pi/4 十字形 90度,pi/5 五星形 72度,pi/12 十二角 30度, pi/16 十六角 22.5度
//** k * n =椭圆比,k*1.5,可 set 0.5 >>> 2.5
//**图案动画展示:图案和色彩多次叠加,每轮次八步产生8个不同色彩的图案,2圈次可展示出16个图案
//** 图案采用多层图形多层色彩套叠设计方法
//** 外圈二三层,中心区二三层,多层多彩套图形设计


mandala52 (){
//** init round, n, center point px, py
round=2; n=0; //** 设置动画演示次数,圈数----
px=360; py=350; //** 图案输出中心点

//** 重绘图案
redraw52:
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); //renew times

//** 设置颜色,取得颜色值
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 ("曼陀罗图案 (52) ",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 ();

//****** figure 1 ****** 图形叠加设计
//** 设置颜色,取得颜色值
getcolor ();
for(i=0;i<16;i++){
a=2*pi/16*i ; L=150;
sx1=(float)(L*sin(a))+px;
sy1=(float)(-L*cos(a))+py;
a=2*pi/8*i+pi/8 ; L=160;
sx2=(float)(L*sin(a))+px;
sy2=(float)(-L*cos(a))+py;
for (k=10;k<30;k++){
// ** 依取得颜色 >>> 颜色变化 a=180 半透明
cs.SetColor (180,r1, g1+k*cn, b1);
cs.DrawOval (sx1,sy1, 25, k*0.8, i*22.5);
cs.DrawCircle (sx1,sy1, k/3);
cs.DrawOval (sx2,sy2, 15, k*1.2, i*45+22.5);
} }

//****** figure 2 ****** 图形叠加设计
//** 设置颜色,取得颜色值
getcolor ();
for(i=0;i<16;i++){
a=2*pi/16*i+pi/16 ; L=130;
sx1=(float)(L*sin(a))+px;
sy1=(float)(-L*cos(a))+py;
for (k=10;k<20;k++){
// ** 依取得颜色 >>> 颜色变化 a=180 半透明
cs.SetColor (180,r1, g1+k*cn, b1);
cs.DrawOval (sx1,sy1,15, k*1.5, i*22.5+11.25);
cs.DrawCircle (sx1,sy1, k/3);
} }

//****** figure 3 ****** 图形叠加设计
//** 设置颜色,取得颜色值
getcolor ();
for(i=0;i<8;i++){
a=2*pi/8*i+pi/8 ; L=90;
sx1=(float)(L*sin(a))+px;
sy1=(float)(-L*cos(a))+py;
for (k=10;k<30;k++){
//** 依取得颜色 >>> 颜色变化 a=150 半透明
cs.SetColor (180,r1, g1+k*cn, b1);
cs.DrawOval (sx1,sy1,20,k*1.5,i*45+22.5);
cs.DrawCircle (sx1,sy1, k/5);
} }

//****** figure 4 ****** 图形叠加设计
//** 设置颜色,取得颜色值
getcolor ();
for(i=0;i<4; i++){
a=2*pi/4*i ; L=70;
sx1=(float)(L*sin(a))+px;
sy1=(float)(-L*cos(a))+py;
for (k=8;k<30; k++){
//** 依取得颜色 >>> 颜色变化 a=180 半透明
cs.SetColor (180,r1, g1+k*cn, b1);
cs.DrawOval (sx1,sy1,20,k*2.2, i*90);
cs.DrawCircle (sx1,sy1, k/2);
} }

//****** center figure 1 ********
getcolor ();
for(i=0;i<4; i++){
a=2*pi/4*i ; L=60;
sx1=(float)(L*cos(a))+px;
sy1=(float)(L*sin(a))+py;
a=2*pi/4*i+pi/4 ; L=90;
sx2=(float)(L*sin(a))+px;
sy2=(float)(-L*cos(a))+py;
for (k=10;k<30; k++){
//** 依取得颜色 >>> 颜色变化 a=180 半透明
cs.SetColor (180,r1, g1+k*cn, b1);
cs.DrawOval (sx1,sy1,15,k*1.8, i*90);
cs.DrawCircle (sx1,sy1, k/3);
cs.DrawOval (sx2,sy2,15,k*1.0, i*90+45);
} }

//****** center figure 2 ********
getcolor ();
for(i=0;i<4; i++){
a=2*pi/4*i+pi/4 ; L=35;
sx1=(float)(L*cos(a))+px;
sy1=(float)(L*sin(a))+py;
for (k=8;k<30; k++){
//** 依取得颜色 >>> 颜色变化 a=180 半透明
cs.SetColor (180,r1, g1+k*cn, b1);
cs.DrawOval (sx1,sy1,15,k*2.2, i*90+45);
cs.DrawCircle (sx1,sy1, k/5);
} }

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

sleep (1000); //next round delay
if (n<round) goto redraw52; //下一圈
}//test52

//** End ****

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 1:55:52

Windows下D盘手动部署Claude Code的完整实践指南

1. 项目概述&#xff1a;为什么要在D盘手动安装Claude Code&#xff1f;这根本不是“装软件”那么简单 Claude Code手动安装D盘&#xff0c;表面看是个Windows路径选择问题&#xff0c;实则暴露了当前本地AI编码工具部署中三个被严重低估的现实痛点&#xff1a; 系统盘空间焦…

作者头像 李华
网站建设 2026/7/16 1:54:26

PHP Phar反序列化:从协议解析到实战绕过技巧剖析

1. 初识PHP Phar协议Phar&#xff08;PHP Archive&#xff09;是PHP中类似JAR的打包文件格式&#xff0c;从PHP 5.3开始默认支持。它能把多个PHP文件、资源打包成单个.phar文件&#xff0c;无需解压即可直接执行。就像把一堆工具装进工具箱&#xff0c;使用时打开箱子就能取用。…

作者头像 李华
网站建设 2026/7/16 1:52:39

STM32F103看门狗实战:从独立到窗口的代码级对比与应用选型

1. STM32看门狗基础&#xff1a;嵌入式系统的守护者第一次接触STM32的看门狗功能时&#xff0c;我把它想象成现实生活中的宠物狗——如果你不及时喂食&#xff0c;它就会"发脾气"导致系统重启。这个看似简单的机制&#xff0c;却是嵌入式系统稳定运行的基石。STM32F1…

作者头像 李华
网站建设 2026/7/16 1:51:35

模拟电路实战:基于线性光耦的ADC隔离采样设计与误差分析

1. 线性光耦隔离采样的核心价值在工业控制、医疗设备和电力监测等场景中&#xff0c;我们常常需要采集高压侧的模拟信号&#xff0c;但又要确保低压侧控制系统的安全。这时候&#xff0c;HCNR200/201这类线性光耦就像个"智能翻译官"——它能将高压侧的模拟信号"…

作者头像 李华
网站建设 2026/7/16 1:49:50

鸿蒙 ArkTS 实战:Road Trip Book 从出行记录到状态反馈完整解析

鸿蒙 ArkTS 实战&#xff1a;Road Trip Book 从出行记录到状态反馈完整解析 前言 Road Trip Book 是一个面向 出行管理与通勤习惯 的鸿蒙 ArkTS 小应用。记录出行条目、站点信息和提醒备注&#xff0c;适合日常出行复盘。 本文基于 entry/src/main/ets/pages/Index.ets 的真实…

作者头像 李华
网站建设 2026/7/16 1:44:48

编码器测速原理与STM32实战:从分类到代码实现

1. 编码器基础&#xff1a;从分类到工作原理第一次接触编码器是在大四的智能车竞赛上&#xff0c;当时为了精确控制小车的电机转速&#xff0c;不得不硬着头皮研究这个"会输出脉冲的小玩意儿"。现在回想起来&#xff0c;编码器确实是运动控制系统中不可或缺的"眼…

作者头像 李华