// A reference to the original polygon
var poly1 = document.getElementById("poly_depth1");
// Calculate the average of the x and y coordinates.
// So we have a point inside the polygon
var poly2points = getInsidePolygon(poly1, 10);
// Create a new polygon with the adjusted points
var poly2 = document.createElementNS("http://www.w3.org/2000/svg", "polygon");
poly2.setAttribute("id", "poly_depth2");
poly2.setAttribute("points", poly2points.join(','))
poly1.ownerSVGElement.appendChild(poly2);
function getInsidePolygon(poly, distance)
{
var points = poly.points;
var centre = getCentrePoint(points);
// For each polygon point, move towards the centre point by
// 'distance' and return that point
var result = []
for (var i=0; i<points.numberOfItems; i++) {
var pt = points.getItem(i);
var adjustedPt = getPointAlongLine(pt.x, pt.y, centre.x, centre.y, distance);
result.push(adjustedPt.x.toFixed(4));
result.push(adjustedPt.y.toFixed(4));
}
return result;
}
function getCentrePoint(points)
{
// Average all the X and Y points to get the polygon centre point
var midX = 0, midY = 0;
for (var i=0; i<points.numberOfItems; i++) {
var pt = points.getItem(i);
midX += pt.x;
midY += pt.y;
}
return {
x: midX/points.numberOfItems,
y: midY/points.numberOfItems
}
}
function getPointAlongLine(x1, y1, x2, y2, distance)
{
// Return the point that is "distance" along the line from x1,y1 to x2,y2.
var dx = x2 - x1;
var dy = y2 - y1;
var len = Math.sqrt(dx * dx + dy * dy);
return {
x: x1 + dx * (distance/len),
y: y1 + dy * (distance/len)
}
}
#poly_depth2 {
fill: red;
fill-opacity: 0.4;
}
<svg width="240" height="240" viewBox="0 0 120 120"
xmlns="http://www.w3.org/2000/svg">
<polygon id="poly_depth1" points="60,20 100,40 100,80 60,100 20,80 20,40" fill="blue"/>
</svg>
"내부 10px"는 무엇을 의미합니까? 그건 확실하지 않아. 너 뭐 해봤 니? 스택 오버플로 (Stack Overflow)와 자바의 SVG 셰이프 (바닐라 자바 스크립트 또는 D3와 같은 라이브러리)를 만드는 방법을 설명하는 웹의 다른 곳에서는 많은 자습서가 있습니다. –
"10px"안에는 바깥 쪽과 안쪽의 다각형 사이의 간격을 의미합니다. 나는 많이 봤는데 웹에서 도움을 얻지 못했습니다. 이것은 순수한 기하학 질문일지도 모른다. 나는 나의 안 폴리곤의 x, y 점을 줄 자바 스크립트 함수를 작성하는 데 도움이 필요하다. 뭔가 getInnerPolyPoints (OuterPolyPoints, depth) {}; 깊이는 내 안쪽 다각형이 얼마나 내 안에 있는지를 나타냅니다. – Santy2211
임의의 다각형의 경우 매우 어려울 것입니다. 하지만 항상 육각형이나 항상 일정한 다각형이 될 것이라고 말할 수 있다면 훨씬 더 간단합니다. –