private bool IsValid() { if (NbPoints >= 3) // Is at least a triangle, 3 coordinates { for (int i = 0; i < NbPoints; i++) { ZZCoordinate previousPoint = (ZZCoordinate)Coordonnees[ZZFunctions.nmod(i - 1, NbPoints)], anglePoint = (ZZCoordinate)Coordonnees[i], nextPoint = (ZZCoordinate)Coordonnees[(i + 1) % NbPoints]; double alpha = ZZMath.AngleFrom3Points(previousPoint, anglePoint, nextPoint); if (alpha == 0) { return(false); // The angle formed by the 3 points isn't 0 degrees } } return(true); } return(false); }
public Polygon Extend(double extentionSize) { if (IsValid()) { List <Coordonnees> newCoordCollection = new List <Coordonnees>(); for (int i = 0; i < NbPoints; i++) { ZZCoordinate previousPoint = (ZZCoordinate)Coordonnees[ZZFunctions.nmod(i - 1, NbPoints)], anglePoint = (ZZCoordinate)Coordonnees[i], nextPoint = (ZZCoordinate)Coordonnees[(i + 1) % NbPoints]; double alpha = ZZMath.AngleFrom3Points(previousPoint, anglePoint, nextPoint), beta = (180 - alpha) / 2.0; double slopeAngle = ZZMath.SlopeAngle(previousPoint, anglePoint) + beta; double distanceToAdd = extentionSize / Math.Cos(ZZMath.ToRadians(beta)); double newX = anglePoint.X + distanceToAdd * Math.Cos(ZZMath.ToRadians(slopeAngle)); double newY = anglePoint.Y + distanceToAdd * Math.Sin(ZZMath.ToRadians(slopeAngle)); newCoordCollection.Add(new Coordonnees(newX, newY)); } return(new Polygon(newCoordCollection, BackgroundColor, BorderColor, Oppacity)); } return(this); }