public SqlGeometry GetBufferWithoutCap(SqlGeometry rd, double bufsize, double indentLen)
{
int n = rd.STNumPoints().Value;
Vector startpt = new Vector(rd.STPointN(1).STX.Value, rd.STPointN(1).STY.Value),
startpt2 = new Vector(rd.STPointN(2).STX.Value, rd.STPointN(2).STY.Value),
endpt = new Vector(rd.STPointN(n).STX.Value, rd.STPointN(n).STY.Value),
endpt2 = new Vector(rd.STPointN(n - 1).STX.Value, rd.STPointN(n - 1).STY.Value),
startln = startpt - startpt2, endln = endpt - endpt2,
startNormln = new Vector(startln.Y * -1, startln.X), endNormln = new Vector(endln.Y * -1, endln.X);
if (startpt == endpt)
return rd.Reduce(0.00001).STBuffer(bufsize);
startNormln.Normalize(); startln.Normalize();
endNormln.Normalize(); endln.Normalize();
SqlGeometry startCap = Point2LineGeometry(new Vector[2] { startpt - startln * indentLen + startNormln * bufsize, startpt - startln * indentLen - startNormln * bufsize }),
endCap = Point2LineGeometry(new Vector[2] { endpt - endln * indentLen + endNormln * bufsize, endpt - endln * indentLen - endNormln * bufsize }),
buffer = rd.Reduce(0.00001).STBuffer(bufsize).STDifference(startCap.STBuffer(0.00001)).STDifference(endCap.STBuffer(0.00001));
SqlGeometry realbuf = new SqlGeometry();
int k = 0;
SqlGeometry centpt = GetCenterPtFromLn(rd).STBuffer(0.00001);
for (int i = 0; i < buffer.STNumGeometries(); i++)
{
SqlGeometry sg = buffer.STGeometryN(i + 1);
if (sg.Filter(centpt))
{
if (k++ == 0)
realbuf = sg;
else
realbuf = realbuf.STUnion(sg);
}
}
return realbuf;
}
Tuesday, February 19, 2013
GetBufferWithoutCap
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment