Tuesday, February 19, 2013

GetBufferWithoutCap


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;
        }

No comments:

Post a Comment