你如何计算SVG路径的内角之和?

时间:2016-04-19 04:51:17

标签: math svg

例如,如下所示的路径:

<path d="M 35 50 L 35 35 L 90 90 z" fill="goldenrod"/>

2 个答案:

答案 0 :(得分:1)

如果轮廓关闭(z-command)并且它是简单的多边形,则sum of interior angle s

SA = 180 * (n - 2)

其中n是顶点数。

这是3个顶点,所以SA = 180

(它也适用于凹面多边形,但不适用于自交叉多边形(它们不简单&#39;)

答案 1 :(得分:0)

MBo的答案很好,但是如果你想明确计算角度,你可以使用点积。对于两个向量A.B = Ax*Bx+Ay*By,点积由|A|=sqrt(Ax*Ax+Ay*Ay)给出。如果A的长度为A . B = |A| |B| cos(angle),则向量之间的角度具有acos( A . B / ( |A| |B| ) 的关系。所以角度由

给出
<svg id="picture" version="1.1"
     xmlns="http://www.w3.org/2000/svg"
     width="400" height="300">
<path id="poly" d="M 35 50 L 35 35 L 90 90 z" fill="goldenrod"/>
</svg>

假设你svg代码中的元素有一个明确的id。

poly = document.getElementById("poly"); // get the svg element
// get the parts of the d attribute and split on space.
parts = poly.getAttribute("d").split(/\s+/); 
x=[],y=[]; // Arrays to hold x,y coords
j=0;
// loop through parts of svg, extract x,y coords
for(i=0;i<parts.length-1;i+=3) {
    x[j]=parts[i+1];
    y[j]=parts[i+2];
    ++j;    
}
sum=0; // variable to hold the sum
for(var i=0;i<x.length;++i) {   // loop through each vertex
   prev = i >0 ? i-1 : x.length-1;  // get previous index
   next = (i+1) % x.length;         // get next index  

   Ax = x[next] - x[i]; Ay = y[next] - y[i]; // vector A
   Bx = x[prev] - x[i]; By = y[prev] - y[i]; // Vector B
   dot = Ax * Bx + Ay * By;  // dot product
   lenA = Math.sqrt(Ax*Ax + Ay*Ay); // Length of A
   lenB = Math.sqrt(Bx*Bx + By*By); // Or use Math.hypot
   angle = Math.acos( dot / (lenA * lenB)); // find angle using 
   sum+=angle; // find sum
}
// print the sum (using degrees)
console.log(180 * sum / Math.PI);

您可以使用以下方式找到角度:

   cross = Ax * By - Ay * Bx;
   if(cross > 0)
       sum+=angle;
   else
     sum += Math.PI*2 - angle;

注意结果是179.99999999999997接近于MBo的结果。

上面的代码中有一个小错误,因为它不适用于凹面多边形。这可以使用2D版本的十字产品来修复,以查找角度是否反射。在循环结束时添加:

bcp.exe "select * from OrderXpress.dbo.Customers where CustId < 1000" queryout "D:\Customer.dat" -S localhost -U sa -P Sa12345 -E -n  

IF %ERRORLEVEL% > 0 ( PAUSE )

bcp.exe OrderXpress.dbo.Customers out "D:\Customer2.dat" -S localhost -U sa -P Sa12345 -E -n 

IF %ERRORLEVEL% > 0 ( PAUSE )

bcp.exe OrderXpress.dbo.Orders out "D:\Orders.dat" -S localhost -U sa -P Sa12345 -E -n 

IF %ERRORLEVEL% > 0 ( PAUSE )