|
|

楼主 |
发表于 2023-6-16 08:19
|
显示全部楼层
这是使用 clip-path: poligon() 沿元素边缘裁剪出最大化多边形的小程序,实现方式类似于割圆法,边数越多,裁剪的形状越近似圆形。代码:
- <style>
- #mydiv {
- width: 200px;
- height: 200px;
- background: gray;
- }
- .papa > div, .papa > p { margin: 20px 0; }
- .papa label, .papa input { margin: 0 8px; }
- </style>
- <div class="papa">
- <p>
- <input id="btnReset" type="button" value="重置" />
- <label for="numLen">宽高:</label>
- <input id="numLen" type="number" value="200" min="100" max="1000" />
- <label for="numPoint">边数:</label>
- <input id="numPoint" type="number" value="3" min="3" max="360" />
- <input id="btnOk" type="button" value="裁剪" />
- </p>
- <div id="mydiv"></div>
- <div id="msgBox"></div>
- </div>
- <script>
- let clipBox = (xx,points) => {
- if(points < 3) points = 3;
- let x0 = y0 = r = xx / 2, pointsAr = [];
- for(let i = 0; i < points; i ++) {
- let hudu = Math.PI / 180 * 360 / points * i;
- let x1 = x0 + Math.cos(hudu) * r, y1 = y0 + Math.sin(hudu) * r;
- pointsAr.push(x1 + 'px ' + y1 + 'px');
- }
- return `polygon(${pointsAr.join(',')})`;
- }
- let limit = (box,min,max) => {
- if(box.value < min) box.value = min;
- if(box.value > max) box.value = max;
- }
- numPoint.onchange = () => limit(numPoint,3,360);
- numLen.onchange = () => limit(numLen,60,600);
- btnOk.onclick = () => {
- mydiv.style.width = numLen.value + 'px';
- mydiv.style.height = numLen.value + 'px';
- mydiv.style.clipPath = clipBox(numLen.value, numPoint.value);
- msgBox.innerText = 'clip-path: ' + mydiv.style.clipPath + ';';
- }
- btnReset.onclick = () => {
- mydiv.style.clipPath = '';
- mydiv.style.width = '200px';
- mydiv.style.height = '200px';
- numLen.value = '200';
- numPoint.value = '3';
- msgBox.innerText = '';
- }
- </script>
复制代码 参与计算的圆心坐标 x0,y0,还有半径 r,在实现正多边形裁剪中,它们的值都一样,只是为了严谨性和可以体现计算依据,保留了各自的变量 名。核心问题在后续回复中会有进一步解释。
|
|