马黑黑 发表于 2025-8-6 20:19

内切规则多边形代码

本帖最后由 马黑黑 于 2025-8-6 20:37 编辑 <br /><br /><style>
        #prevBox { position: fixed; top: 0; right: 0; bottom: 0; left: 0; background: #eee; display: none; padding: 0; overflow: hidden; z-index: 1000; margin: 0; }
        #prevBox::after { position: absolute; content: '关闭预览'; bottom: 10px; left: calc(50% - 40px); padding: 0 4px; width: 80px; height: 30px; line-height: 30px; text-align: center; border: 1px solid #efe; border-radius: 6px; background: #eee; font-size: 14px; box-shadow: 2px 2px 6px rgba(0,0,0,.25); cursor: pointer; }
        iframe { position: relative; width: 100%; height: 100%; border: none; outline: none; box-sizing: border-box; margin: 0; }
</style>

<div id="prevBox"></div>
<div id="cbox" class="codebox">
&lt;style&gt;
        .ma {
                margin: 30px auto;
                width: <txt-red>400px</txt-red>;
                height: <txt-red>400px</txt-red>;
                background: tan;
        }
&lt;/style&gt;

&lt;div class="ma"&gt;&lt;/div&gt;
&lt;p id="pathData" style="text-align: center;"&gt;&lt;/p&gt;

&lt;script&gt;
        const ma = document.querySelector('.ma'); <txt-green>// 待操作元素</txt-green>
        const total = <txt-red>3</txt-red>; <txt-green>// 顶点数(多边形的边总数)</txt-green>

        <txt-green>// 获取顶点坐标值 :参数 r 为多边形外接圆半径</txt-green>
        const getPoints = (r) =&gt; {
                const a = 360 / total; <txt-green>// 平均角度</txt-green>
                const R = ma.clientWidth / 2; <txt-green>// 外接圆半径</txt-green>
                let res = []; <txt-green>// 坐标值数组</txt-green>
                <txt-green>// 遍历所有顶点计算其坐标值</txt-green>
                Array.from({length: total}).forEach((_,k) =&gt; {
                        const x = R + r * Math.cos(Math.PI / 180 * a * k);
                        const y = R + r * Math.sin(Math.PI / 180 * a * k);
                        res.push({x: x, y: y});
                });
                res.push(res); <txt-green>//回到原点</txt-green>
                return res; <txt-green>// 返回数组</txt-green>
        };

        const ar1 = getPoints(<txt-red>200</txt-red>); <txt-green>// 外层坐标集 半径要大于里层半径</txt-green>
        const ar2 = getPoints(<txt-red>180</txt-red>).reverse(); <txt-green>// 里层坐标集(反转) 半径要小于外层半径</txt-green>

        let path = 'M'; <txt-green>// 路径</txt-green>
        ar1.forEach((ar, key) =&gt; path += `${ar.x}, ${ar.y} `); <txt-green>// 加入外层路径</txt-green>
        ar2.forEach((ar, key) =&gt; path += `${ar.x}, ${ar.y} `); <txt-green>// 加入里层路径</txt-green>

        ma.style.clipPath = `path('${path}')`; <txt-green>// 切割</txt-green>
        pathData.textContent = 'clip-path: ' + ma.style.clipPath + ';'; <txt-green>// clip-path属性</txt-green>
&lt;/script&gt;
</div>
<blockquote>代码可以存为本地 .html 文档后运行(建议,酱紫可以修改重要的数据),或到我的网站直接运行:<a href="http://mhh.52qingyin.cn/art/show.php?st=4&sd=4&art=mahei_1754482655" target="_blank">内切多边形代码及演示</a>,还可以将代码复制到 <a href="http://mhh.52qingyin.cn/api/pccc/" target="_blank">pencil code</a> 进行代码调试。</blockquote>

<script type="module">
        import linenum from 'https://638183.freep.cn/638183/web/js/linenum.js';
        linenum();
</script>

马黑黑 发表于 2025-8-6 20:22

红色字体的数据应根据需要和具体情况修改。顶点数大于等于3,最多建议 20。顶点数越多,切割效果也会接近圆环,当然得到的路径属性值的字符数就会越大。

马黑黑 发表于 2025-8-6 20:23

这个代码主要是拿到 clip-path 属性值,得到该值后,可以应用于需要的项目。

红影 发表于 2025-8-6 20:56

运行代码也没看到内切效果啊?{:4_203:}

马黑黑 发表于 2025-8-6 20:57

红影 发表于 2025-8-6 20:56
运行代码也没看到内切效果啊?

这个也不知道怎么回事,你刷新一下再看看一楼

花飞飞 发表于 2025-8-6 21:20

马黑黑 发表于 2025-8-6 20:22
红色字体的数据应根据需要和具体情况修改。顶点数大于等于3,最多建议 20。顶点数越多,切割效果也会接近圆 ...

刚刚试了几个数字,每种都能完美显示。 。。
顶点再多就成圆了{:4_173:}

花飞飞 发表于 2025-8-6 21:22

这计算好复杂,只有白老师这样的最强大脑能算得出来。。。
我还是直接用好了。。{:4_170:}

花飞飞 发表于 2025-8-6 21:25

反正能大能小,能切厚能切薄,能整成各种相框或者圆环。。色彩变一变就立体了吧。

红影 发表于 2025-8-6 21:43

马黑黑 发表于 2025-8-6 20:57
这个也不知道怎么回事,你刷新一下再看看一楼

嗯嗯,跳到你的网站看到了,还看到了切割路径的配置,真好{:4_187:}

杨帆 发表于 2025-8-6 22:10

马老师厉害!又一次成功探索:规则多边形可以内切了,还能拿到 clip-path 属性值。{:4_190:}

马黑黑 发表于 2025-8-6 23:35

杨帆 发表于 2025-8-6 22:10
马老师厉害!又一次成功探索:规则多边形可以内切了,还能拿到 clip-path 属性值。

这个其实只是针对规则多边形,不规则的就比较难实现

马黑黑 发表于 2025-8-6 23:36

红影 发表于 2025-8-6 21:43
嗯嗯,跳到你的网站看到了,还看到了切割路径的配置,真好

我修改了一下,运行后可以改变顶点数

马黑黑 发表于 2025-8-6 23:37

花飞飞 发表于 2025-8-6 21:25
反正能大能小,能切厚能切薄,能整成各种相框或者圆环。。色彩变一变就立体了吧。

切割的东西要渲染出立体来需要点修饰的功夫

马黑黑 发表于 2025-8-6 23:37

花飞飞 发表于 2025-8-6 21:22
这计算好复杂,只有白老师这样的最强大脑能算得出来。。。
我还是直接用好了。。

知道原理后可以手动计算,不过还是让JS去完成这些计算省事

马黑黑 发表于 2025-8-6 23:38

花飞飞 发表于 2025-8-6 21:20
刚刚试了几个数字,每种都能完美显示。 。。
顶点再多就成圆了

同时路径字符也是一大堆的

红影 发表于 2025-8-7 13:24

马黑黑 发表于 2025-8-6 23:36
我修改了一下,运行后可以改变顶点数

这个太好了,不用自己去设置,直接就可以看到了{:4_199:}

花飞飞 发表于 2025-8-7 17:28

马黑黑 发表于 2025-8-6 23:37
切割的东西要渲染出立体来需要点修饰的功夫

{:4_173:}太费功夫就算了,我也就天马行空想到了,那么一说

花飞飞 发表于 2025-8-7 17:28

马黑黑 发表于 2025-8-6 23:37
知道原理后可以手动计算,不过还是让JS去完成这些计算省事

{:4_170:}就是,交给电脑多省事。。这方面电脑有大优势

花飞飞 发表于 2025-8-7 17:29

马黑黑 发表于 2025-8-6 23:38
同时路径字符也是一大堆的

看到了,边越多路字符越长{:4_173:}可以直接预览,更改点数了。这个太方便了

马黑黑 发表于 2025-8-7 18:57

花飞飞 发表于 2025-8-7 17:29
看到了,边越多路字符越长可以直接预览,更改点数了。这个太方便了

{:4_191:}
页: [1] 2 3 4 5
查看完整版本: 内切规则多边形代码