2017-11-14 10 views
0

SVG 그래픽에 매우 익숙합니다. SVG 사각형 안에 여러 개의 SVG 폴리곤을 만들려고합니다.자바 스크립트를 사용하여 SVG의 큰 폴리곤 안에 작은 폴리곤을 만듭니다.

큰 다각형 안에 작은 폴리곤을 만드는 데 어려움을 겪고 있습니다.

내 폴리곤은 삼각형과 직사각형뿐만 아니라 다각형입니다. 나는 내부 다각형의 포인트를 얻을 어떻게, 내가 부모와

<svg width="120" height="120" 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>

예 위의 고려 자식 다각형 사이의 부모 다각형 및 공간 거리의 지점을 가지고, 내가 원하는, 아이디 poly_depth1과 다각형을 이 다각형 안에 다른 다각형 10px를 만들 수 있습니다.이 자바 폴리곤을 일반 JavaScript 또는 D3을 사용하여 만들고 싶습니다. 다각형은 같은 모양을 유지해야합니다.

+0

"내부 10px"는 무엇을 의미합니까? 그건 확실하지 않아. 너 뭐 해봤 니? 스택 오버플로 (Stack Overflow)와 자바의 SVG 셰이프 (바닐라 자바 ​​스크립트 또는 D3와 같은 라이브러리)를 만드는 방법을 설명하는 웹의 다른 곳에서는 많은 자습서가 있습니다. –

+0

"10px"안에는 바깥 쪽과 안쪽의 다각형 사이의 간격을 의미합니다. 나는 많이 봤는데 웹에서 도움을 얻지 못했습니다. 이것은 순수한 기하학 질문일지도 모른다. 나는 나의 안 폴리곤의 x, y 점을 줄 자바 스크립트 함수를 작성하는 데 도움이 필요하다. 뭔가 getInnerPolyPoints (OuterPolyPoints, depth) {}; 깊이는 내 안쪽 다각형이 얼마나 내 안에 있는지를 나타냅니다. – Santy2211

+0

임의의 다각형의 경우 매우 어려울 것입니다. 하지만 항상 육각형이나 항상 일정한 다각형이 될 것이라고 말할 수 있다면 훨씬 더 간단합니다. –

답변

0

원하는 코드를 작성하면됩니다.

다각형의 각 점에 대해 다각형의 중심을 향해 더 먼 거리 인 새 점을 계산합니다.

그런 다음 조정 된 점 세트를 사용하여 새 다각형을 추가합니다.

// 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>

+0

굉장 !! 폴 감사합니다. – Santy2211

0

points 속성은 다각형의 각 모서리에 대한 x 및 y 좌표를 정의합니다. 더 작거나 더 큰 다각형을 원할 경우 다각형의 x 및 y 좌표에서 거리를 더하거나 뺄 필요가 있습니다.

<svg width="140" height="140" 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"/> 
    <polygon id="poly_depth2" points="60,35 90,50 90,70 60,85 30,70 30,50" fill="red"/> 
</svg> 
+0

답장을 보내 주셔서 감사합니다. 귀하의 "poly_depth2"정확히 "poly_depth1"안에오고있다. 내 깊이 1 폴리는 동적입니다. 내 내부 다각형의 x, y 점을 줄 JavaScript 함수를 작성하는 데 도움이 필요합니다. 뭔가 getInnerPolyPoints (OuterPolyPoints, depth) {}; 깊이는 내 안쪽 다각형이 얼마나 내 안에 있는지를 나타냅니다. – Santy2211

+0

자바 스크립트 함수를 작성할 수 없지만 다각형의 x 및 y 좌표에서 거리를 더하거나 뺍니다. –