public static double GetSignedDistanceFromPointToLine( double pX, double pZ, double v1X, double v1Z, double v2X, double v2Z, double v3X, double v3Z, int p1Index, int p2Index, TriangleClassification classification, bool?misalignmentOffsetNullable = null) { pX = PuUtilities.GetRelativeCoordinate(pX); pZ = PuUtilities.GetRelativeCoordinate(pZ); double[] vX = new double[] { v1X, v2X, v3X }; double[] vZ = new double[] { v1Z, v2Z, v3Z }; double p1X = vX[p1Index - 1]; double p1Z = vZ[p1Index - 1]; double p2X = vX[p2Index - 1]; double p2Z = vZ[p2Index - 1]; double dist = MoreMath.GetDistanceFromPointToLine(pX, pZ, p1X, p1Z, p2X, p2Z); bool leftOfLine = MoreMath.IsPointLeftOfLine(pX, pZ, p1X, p1Z, p2X, p2Z); bool floorTri = MoreMath.IsPointLeftOfLine(v3X, v3Z, v1X, v1Z, v2X, v2Z); bool onSideOfLineTowardsTri = floorTri == leftOfLine; double signedDist = dist * (onSideOfLineTowardsTri ? 1 : -1); bool misalignmentOffset = misalignmentOffsetNullable ?? SavedSettingsConfig.UseMisalignmentOffsetForDistanceToLine; if (misalignmentOffset && classification != TriangleClassification.Wall) { if (p1X == p2X) { bool thirdPointOnLeft = p1Z >= p2Z == floorTri; if ((thirdPointOnLeft && p1X >= 0) || (!thirdPointOnLeft && p1X <= 0)) { signedDist += 1; } } else if (p1Z == p2Z) { bool thirdPointOnTop = p1X <= p2X == floorTri; if ((thirdPointOnTop && p1Z >= 0) || (!thirdPointOnTop && p1Z <= 0)) { signedDist += 1; } } } return(signedDist); }
public static double GetSignedDistanceFromPointToLine( double pX, double pZ, double v1X, double v1Z, double v2X, double v2Z, double v3X, double v3Z, int p1Index, int p2Index, bool?misalignmentOffsetNullable = null) { double[] vX = new double[] { v1X, v2X, v3X }; double[] vZ = new double[] { v1Z, v2Z, v3Z }; double p1X = vX[p1Index - 1]; double p1Z = vZ[p1Index - 1]; double p2X = vX[p2Index - 1]; double p2Z = vZ[p2Index - 1]; double dist = MoreMath.GetDistanceFromPointToLine(pX, pZ, p1X, p1Z, p2X, p2Z); bool leftOfLine = MoreMath.IsPointLeftOfLine(pX, pZ, p1X, p1Z, p2X, p2Z); bool floorTri = MoreMath.IsPointLeftOfLine(v3X, v3Z, v1X, v1Z, v2X, v2Z); bool onSideOfLineTowardsTri = floorTri == leftOfLine; double signedDist = dist * (onSideOfLineTowardsTri ? 1 : -1); bool misalignmentOffset = misalignmentOffsetNullable ?? OptionsConfig.UseMisalignmentOffsetForDistanceToLine; if (misalignmentOffset) { if (p1X == p2X) { bool thirdPointOnLeft = p1Z >= p2Z == floorTri; if ((thirdPointOnLeft && p1X >= 0) || (!thirdPointOnLeft && p1X <= 0)) { signedDist += 1; } } else if (p1Z == p2Z) { bool thirdPointOnTop = p1X <= p2X == floorTri; if ((thirdPointOnTop && p1Z >= 0) || (!thirdPointOnTop && p1Z <= 0)) { signedDist += 1; } } } return(signedDist); }