太阳花SVG路径生成函数
本帖最后由 马黑黑 于 2025-9-12 21:38 编辑 <br /><br /><div class="codebox">function createSunFlowerPath(tt,R,r) {
if (tt % 2 === 0) tt += 1;
var a = 360 / tt, half = Math.floor(tt / 2), points = [], path = 'M';
Array.from({length:tt}).forEach((_,k) => {
var x = (R + r * Math.cos(Math.PI/180 * a * k)).toFixed(2),
y = (R + r * Math.sin(Math.PI/180 * a * k)).toFixed(2);
points.push();
});
for (var i = half; i >= 0; i --) {
var j = (half + i) % tt;
path += `${points[ i ]} ${points[ i ]},${points} ${points} `;
}
path += 'Z';
return path;
}
</div>
<p>函数参数解释:</p>
<p>tt : 顶点数,应大于等于3,否则得到的结果不是太阳花路径。如果传值是偶数,函数会自动加1使其变为奇数;</p>
<p>R : 外切圆半径,取值依据是正方形宽度的一般,这样可以确保路径环绕正方形的中心点展开;</p>
<p>r : 外切圆半径,指太阳花顶点到正方形中心的距离,一般会比 R 小一点点。</p>
<p><br></p>
<p>我叫DS也做一份绘制太阳花的代码,以解决偶数顶点问题,它的思路和我的不太一样,以下是DS在我提供的代码基础上写的实现代码,它能确保奇数、偶数顶点数都可以绘制太阳花——不过它的太阳花样式和我设想的有所不同:</p>
<div class="codebox">
var total = 6; // 可以改为任意数字测试
var R = 200, r = 190, points = [], path = 'M';
var a = 360 / total;
// 生成所有顶点
Array.from({length: total}).forEach((_, k) => {
var x = (R + r * Math.cos(Math.PI/180 * a * k)).toFixed(2),
y = (R + r * Math.sin(Math.PI/180 * a * k)).toFixed(2);
points.push();
});
// 新的连接逻辑
for (var i = 0; i < total; i++) {
var j = (i + Math.floor(total / 2)) % total;
path += `${points[ i ]} ${points[ i ]} L ${points} ${points} `;
}
path += 'Z';
</div>
<p><br></p>
<p>来看看结果,都是13个顶点,前面的是用我的函数画的,后面的是用DS的代码完成的:</p>
<p><svg width="400px" height="400px">
<path d="M15.52 245.47,368.24 111.70 57.78 325.99,307.93 43.63 132.63 377.65,222.90 11.39 222.90 388.61,132.63 22.35 307.93 356.37,57.78 74.01 368.24 288.30,15.52 154.53 390.00 200.00,15.52 245.47 Z" fill="none" stroke="tan"></path>
</svg></p>
<p><br></p>
<p><svg width="400px" height="400px">
<path d="M390.00 200.00 L 15.52 245.47 368.24 288.30 L 15.52 154.53 307.93 356.37 L 57.78 74.01 222.90 388.61 L 132.63 22.35 132.63 377.65 L 222.90 11.39 57.78 325.99 L 307.93 43.63 15.52 245.47 L 368.24 111.70 15.52 154.53 L 390.00 200.00 57.78 74.01 L 368.24 288.30 132.63 22.35 L 307.93 356.37 222.90 11.39 L 222.90 388.61 307.93 43.63 L 132.63 377.65 368.24 111.70 L 57.78 325.99 Z" fill="none" stroke="tan"></path>
</svg></p>
<p><br></p>
<p>之前,我做过一个用 polygon 实现的太阳花绘制案例,支持奇偶数顶点数,链接:<a href="http://mhh.52qingyin.cn/art/show.php?st=5&sd=5&art=mahei_1699183527">polygon绘制太阳花</a></p>
<script type="module">
import linenumber from 'https://638183.freep.cn/638183/web/js/linenumber.js';
linenumber();
</script> DS明显是多连了许多线,不过也是对称着连的呢{:4_173:} 那个链接好像打不开? 红影 发表于 2025-9-12 21:39
DS明显是多连了许多线,不过也是对称着连的呢
它追求的是对称 红影 发表于 2025-9-12 21:40
那个链接好像打不开?
改好了。前面又是 [ i ] 的问题弄的 真漂亮!谢谢马老师经典分享{:4_191:} 杨帆 发表于 2025-9-12 22:32
真漂亮!谢谢马老师经典分享
{:4_190:} 马黑黑 发表于 2025-9-12 21:40
它追求的是对称
你原来的那种更清爽些{:4_187:} 马黑黑 发表于 2025-9-12 21:41
改好了。前面又是 [ i ] 的问题弄的
看到了,原来的那个还是可调的,好漂亮啊{:4_171:} 红影 发表于 2025-9-12 23:10
看到了,原来的那个还是可调的,好漂亮啊
还行 红影 发表于 2025-9-12 23:00
你原来的那种更清爽些
勉勉强强吧 看到了黑氏太阳花和DS太阳花,对比一下黑氏太阳更漂亮。。。
DS的机械重复是强项,设计感就少了点。显得臃肿繁杂。。 网站里的太阳花印象深刻,nonzero,evenodd 这两种填充模式又复习一遍了。。
{:5_162:}
马黑黑 发表于 2025-9-12 23:44
还行
其实当时就惊叹过,现在继续惊叹{:4_187:} 马黑黑 发表于 2025-9-12 23:44
勉勉强强吧
条理非常清晰,更容易看得懂。 红影 发表于 2025-9-13 19:18
条理非常清晰,更容易看得懂。
看懂需要一点点基础 红影 发表于 2025-9-13 19:17
其实当时就惊叹过,现在继续惊叹
不惊掉下巴就好{:4_170:} 马黑黑 发表于 2025-9-13 20:05
看懂需要一点点基础
那是肯定的{:4_187:} 马黑黑 发表于 2025-9-13 20:05
不惊掉下巴就好
还好,我检查了一下,下巴没什么问题{:4_173:} 红影 发表于 2025-9-13 21:42
还好,我检查了一下,下巴没什么问题
不顺带牵一下须?{:4_170:}