算法生成N芒星
前面两个图像生成算法是:道教的太极八卦图和佛教的卐和卍字图。这一节整个洋气的图像:芒星。但愿我别召唤出什么恐怖的禁忌,尤其今晚还是万圣节之夜。平时看玄幻小说,经常读到有关六芒星,七芒星,九芒星的技法。芒星是由几个完全的等腰三角形(有时是正三角形)和一个正多边形组成的二维图形。等腰三角形的个数与正多边形的边数相等。由五个等腰三角形和正五边形组成的图形叫“五芒星”(俗称:五角星)。由六个等腰三角形和正六边形组成的图形叫“六芒星”……依此类推。芒星在美学、历史和占卜都有着很大的用处。
芒星在生活中与我们息息相关,我们常说的“五角星”也是芒星的一种。五芒星的五个顶点都代表不同的元素,分别是地、水、火、风及象征人类精神力量的第五元素,而五芒星亦是在魔法中是常被使用的符号,因为其整体一看就像一个人的身体,最顶一点为头部,其余为四肢。在圣经中,人是被创造者,而五芒星也含有被创造之意,这就和四元素及人体相对应。当顶点指向天时,那便代表圣力。
Tantrism派认为,六芒星形中尖端向下的三角形是卡利·玛的象征物“女阴”的符号,除了倒三角形之外,它也表示为鱼、两端尖锐的椭圆形、马蹄、蛋等图形。因此这个倒三角被称为“女阴的图象”即“Yoni Yantra”,其中“Yantra”是Tantrism派所认为的“冥想的图象”,是适用于眼睛的图象,和“适用于耳的图象”-“真言”(Mantra-曼荼罗,象征为八叶莲花)互为表里。倒三角形代表了万物之源-宇宙之母,表示盛满宇宙之母体液(力量)的容器。
在西方,7被认为是一个很有魔力的数字。被神秘学视为意义上更复杂的芒星,力量也更强大的图案。关于七芒星的资料: 1 .七芒星很难被准确地画出,因为七芒星是“不平均却稳定的一体” 2.七芒星分为“正七芒星”与“逆七芒星” 3.关于“七芒星魔法阵”也是众说纷纭 4.七芒星魔法阵的功效被记载得不多,只知道大概可以用来召唤超能。因此没有任何魔法师或者术士敢使用,七芒星因此成了禁忌。传说一笔画出过完美七芒星的人有的说看见了炽天使长米迦勒,有的说看见了地狱魔君路西法,也有人说看见了天堂的生命树,甚至有人说看见了末日。
八芒星与卐字符号是遍布于我国广大地域多个民族的文化符号。有学者认为神秘的卐字符号其实是八角星纹的简化变体,它们都代表了太阳在一个回归年的视循环运动,即一年四季的循环变化。 八角星让人想起罗盘、六分仪、舵,像是朝向八方的宝剑。八角星的八个角代表八个方向,意为绝对的混沌或混沌能量的八种形态(天地风雷水火山泽)。
这篇文章中提供了两套生成芒星的算法,先看第一个:
void CPixelNStar::ResetN()
{
m_n = (unsigned int)m_params[];
if (m_n < )
{
m_n = ;
}
else if (m_n > )
{
m_n = ;
} float radius = 400.0f; for (unsigned int i = ; i < m_n; i++)
{
m_listPoints[i].x = radius*sinf((i - 0.5f)**PI/m_n);
m_listPoints[i].y = radius*cosf((i - 0.5f)**PI/m_n);
}
} unsigned int CPixelNStar::CalculatePixel(unsigned int x, unsigned int y)
{
unsigned int red = 0xffff0000;
unsigned int yellow = 0xffffc000;
unsigned int gray = 0xff808080; Vec2 P(x - 512.0f, y - 512.0f); bool bCenter = true;
for (unsigned int i = ; i < m_n; i++)
{
Vec2& v = m_listPoints[i];
Vec2& vL1 = m_listPoints[(i + m_n - )%m_n];
Vec2& vL2 = m_listPoints[(i + m_n - )%m_n];
Vec2& vR1 = m_listPoints[(i + )%m_n];
Vec2& vR2 = m_listPoints[(i + )%m_n]; if (!IsPointInAngle(vL2, v, vR2, P))
{
bCenter = false;
}
else if (IsSameSide(vL1, vR1, v, P))
{
return red;
}
} return bCenter ? yellow : gray;
}
关于结构体Vec2的定义及相关函数见:二维平面上判断点在三角形内的最优算法
生成图像有:
五芒星
六芒星
七芒星
八芒星
九芒星
十芒星
十一芒星
十二芒星
十三芒星
二十三芒星
百度上说:任何芒星都可以一笔画出,并且起笔点和结束点在同一位置。不过这个“一笔”说得太笼统,N芒星需要几条直线才能画出?由图可以看出,N芒星可以由N条线段画出,但只有N为单数时,才可以由N条线段一笔画出。而N为双数时,相当于两个N/2多边形的交错重叠。
第一种算法生成的芒星,当N越多时,星尖越短越钝,所以我双写了第二种算法,可以调节星尖的长度:
void CPixelNLightStar::ResetN()
{
m_n = (unsigned int)m_params[];
if (m_n < )
{
m_n = ;
}
else if (m_n > )
{
m_n = ;
} for (unsigned int i = ; i < m_n; i++)
{
m_list_sin[i] = sinf((i - 0.5f)**PI/m_n);
m_list_cos[i] = cosf((i - 0.5f)**PI/m_n);
}
} unsigned int CPixelNLightStar::CalculatePixel(unsigned int x, unsigned int y)
{
float radius = m_params[];
float h = radius*m_params[]; unsigned int red = 0xffff0000;
unsigned int yellow = 0xffffc000;
unsigned int gray = 0xff808080; float i = x - 512.0f;
float j = y - 512.0f; float dis = sqrtf(i*i + j*j);
if (dis < radius*cosf(PI/m_n))
{
return red;
}
else if (dis > radius + h)
{
return gray;
} Vec2 tri0(0.0f, radius + h);
Vec2 tri1(radius*m_list_sin[], radius*m_list_cos[]);
Vec2 tri2(radius*m_list_sin[], radius*m_list_cos[]);
Vec2 P; bool bCenter = true;
for (unsigned int m = ; m < m_n; m++)
{
P.x = i*m_list_cos[m] - j*m_list_sin[m];
P.y = i*m_list_sin[m] + j*m_list_cos[m]; if (IsPointInTriangle(tri0, tri1, tri2, P))
{
return yellow;
}
} if (dis < radius)
{
return red;
} return gray;
}
算法中可以设置芒星半径长度和角的高度,以生成更多样的芒星:
相应软件:
之前我写过一篇与芒星有关的图形画法:
相关文章:
算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[上]
算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[下]
算法生成N芒星的更多相关文章
- ZeroMQ接口函数之 :zmq_z85_decode – 从一个用Z85算法生成的文本中解析出二进制密码
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_z85_decode zmq_z85_decode(3) ØMQ Manual - ØMQ/4.1 ...
- WPF画N角芒星,正N角星
计算顶部三角形坐标方法: /// <summary> /// 获取顶三角形坐标 /// </summary> /// <param name="r"& ...
- 算法起步之A星算法
原文:算法起步之A星算法 用途: 寻找最短路径,优于bfs跟dfs 描述: 基本描述是,在深度优先搜索的基础上,增加了一个启发式算法,在选择节点的过程中,不是盲目选择,而是有目的的选的,F=G+H,f ...
- PHP HMAC_SHA1 算法 生成算法签名
HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议. 它可 ...
- 根据twitter的snowflake算法生成唯一ID
C#版本 /// <summary> /// 根据twitter的snowflake算法生成唯一ID /// snowflake算法 64 位 /// 0---0000000000 000 ...
- 在 iPad 上试验从用算法生成法线贴图-到法线映射光照效果
在 iPad 上试验从用算法生成法线贴图-到法线映射光照效果 目录 概述 一般来说, 法线贴图是用高模的法线图, 低模的纹理图, 来生成较好的渲染效果. 而法线图通常是通过图像处理软件来生成的, 这里 ...
- C# 根据twitter的snowflake算法生成唯一ID
C# 版算法: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- Prim算法生成迷宫
初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...
- 利用tween.js算法生成缓动效果
在讲tween类之前,不得不提的是贝塞尔曲线了.首先,贝塞尔曲线是指依据四个位置任意的点坐标绘制出的一条光滑曲线.它在作图工具或动画中中运用得比较多,例如PS中的钢笔工具,firework中的画笔等等 ...
随机推荐
- 001.Parted工具使用
一 Parted简介 1.1 parted和fdisk 通常使用较多的磁盘管理工具为fdisk,但由于磁盘越来越廉价,且磁盘空间越来越大,而fdisk工具分区存在大小限制,只能划分小于2T的磁盘.因此 ...
- Java持久化之 -- 傲娇的NIO
NIO: Jdk 1.4+ New IO 面向通道和缓冲区 所在包:java.nio 执行流程: 数据总数由通道写入到buffer , 或者是从buffer写入通道 完全替换IO(面向流 单向的) ...
- 开发自己的山寨Android注解框架
目录 开发自己的山寨Android注解框架 开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation),但是我想大家可能 ...
- windows下elasticsearch启动
windows下启动elasticsearch,依赖于配置好JAVA_HOME D:\Program Files\Java\jdk1.7.0_71 命令行启动elasticsearch.bat即可实现 ...
- 第一次使用autohotkey的记录
第一次使用autohotkey的记录 原来想着直接用python来做模拟输入的,后面查了一下发现,目前的封装的库不一定能支持输入到游戏里,是的,我是打算用来做游戏辅助的,嘿嘿嘿 暂时来讲,我只是看完了 ...
- tesseract-ocr识别中文扫描图片实例讲解
当我浏览http://code.google.com/p/tesseract-ocr并下载了几个文件下来之后顿时感到一头雾水,不知该如何下手.网上看到有人在linux操作系统下的实现, 如: 利用开源 ...
- Java中使用多线程、curl及代理IP模拟post提交和get访问
Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...
- 微信小程序自定义音频组件,自定义滚动条,单曲循环,循环播放
小程序自定义音频组件,带滚动条 摘要:首先自定义音频组件,是因为产品有这样的需求,需要如下样式的 而微信小程序API给我们提供的就是这样的 而且产品需要小程序有后台播放功能,所以我们不考虑小程序的 a ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(八)——Cookie
CEF中的Cookie是通过CookieManager来管理的,可以用它来设置发送的Cookie. 发送Cookie 发送Cookie的一个基本示例如下: var cookieManager = _c ...
- STM32F4 SPI with DMA
STM32F4 SPI with DMA A few people have requested code, so I thought I’d post the code showing how I’ ...