////////////////DRAW_METHODS/////////////////// /////////////////////////////////////////////// /////////////INSIDE_BELONGS_METHODS//////////// public bool isPointInside(GlPointR2 P) { float SP = 0; for (int i = 0; i < this.CountOfPoints - 1; i++) { SP += new GlTriangle(P, this.vertexes[i], this.vertexes[i + 1]).S; } SP += new GlTriangle(P, this.vertexes[this.CountOfPoints - 1], this.vertexes[0]).S; return(Math.Abs(SP - S) < FAULT); }
/////////////////////////////////////////////// ////////////////////FIELDS///////////////////// /////////////////////////////////////////////// /*********************************************/ /////////////////////////////////////////////// /////////////////CONSTRUCTORS////////////////// /////////////////////////////////////////////// public GlPolygon(GlPointR2 Center, params GlPointR2[] POLY) { S = 0; if (POLY == null || Center == null) { polyCenter = new GlPointR2(float.NaN, float.NaN); vertexes = new GlPointR2[0]; return; } if (POLY.Length > 3) { GlPointR2 P = new GlPointR2((POLY[0].X + POLY[POLY.Length / 2].X) / 2, (POLY[0].Y + POLY[POLY.Length / 2].Y) / 2); for (int i = 0; i < POLY.Length - 1; i++) { S += new GlTriangle(P, POLY[i], POLY[i + 1]).S; } S += new GlTriangle(P, POLY[POLY.Length - 1], POLY[0]).S; } this.polyCenter = Center; this.vertexes = new GlPointR2[POLY.Length]; Array.Copy(POLY, this.vertexes, this.vertexes.Length); if (this.vertexes.Length == 0) { return; } for (int i = 0; i < this.vertexes.Length - 1; i++) { P += new GlVectorR2(this.vertexes[i + 1].X - this.vertexes[i].X, this.vertexes[i + 1].Y - this.vertexes[i].Y).Length; } P += new GlVectorR2(this.vertexes[0].X - this.vertexes[this.vertexes.Length - 1].X, this.vertexes[0].Y - this.vertexes[this.vertexes.Length - 1].Y).Length; }
public GlTriangle(GlTriangle copyTiangle) : this(copyTiangle == null ? new GlPointR2(float.NaN, float.NaN) : copyTiangle[0], copyTiangle == null ? new GlPointR2(float.NaN, float.NaN) : copyTiangle[1], copyTiangle == null ? new GlPointR2(float.NaN, float.NaN) : copyTiangle[2]) { }